From 99ef233a69b6fef335a8b8177de6dbd4b77aa100 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 15 Jan 2026 13:30:43 +0530 Subject: [PATCH 001/300] fix: Preserved nullable object fields by carrying schema properties --- litellm/llms/vertex_ai/common_utils.py | 18 ++++++- .../test_amazing_vertex_completion.py | 54 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/litellm/llms/vertex_ai/common_utils.py b/litellm/llms/vertex_ai/common_utils.py index 1864ef734c0..63decfea854 100644 --- a/litellm/llms/vertex_ai/common_utils.py +++ b/litellm/llms/vertex_ai/common_utils.py @@ -1,4 +1,5 @@ import re +from copy import deepcopy from enum import Enum from typing import Any, Dict, List, Literal, Optional, Set, Tuple, Union, get_type_hints @@ -617,7 +618,7 @@ def convert_anyof_null_to_nullable(schema, depth=0): if anyof is not None: contains_null = False for atype in anyof: - if atype == {"type": "null"}: + if isinstance(atype, dict) and atype.get("type") == "null": # remove null type anyof.remove(atype) contains_null = True @@ -735,7 +736,20 @@ def _convert_schema_types(schema, depth=0): type_val = schema["type"] if isinstance(type_val, list) and len(type_val) > 1: # Convert ["string", "number"] -> {"anyOf": [{"type": "STRING"}, {"type": "NUMBER"}]} - schema["anyOf"] = [{"type": t} for t in type_val if isinstance(t, str)] + # Preserve other schema fields by copying them into each non-null anyOf item. + base_schema = {k: v for k, v in schema.items() if k not in {"type", "anyOf"}} + any_of: List[Dict[str, Any]] = [] + for t in type_val: + if not isinstance(t, str): + continue + if t == "null": + # Keep null entry minimal so we can strip it later. + any_of.append({"type": "null"}) + continue + item_schema = deepcopy(base_schema) + item_schema["type"] = t + any_of.append(item_schema) + schema["anyOf"] = any_of schema.pop("type") elif isinstance(type_val, list) and len(type_val) == 1: schema["type"] = type_val[0] diff --git a/tests/local_testing/test_amazing_vertex_completion.py b/tests/local_testing/test_amazing_vertex_completion.py index 0373f5f4356..745c90201f3 100644 --- a/tests/local_testing/test_amazing_vertex_completion.py +++ b/tests/local_testing/test_amazing_vertex_completion.py @@ -3598,6 +3598,60 @@ def test_vertex_schema_test(): print(response) +def test_gemini_nullable_object_tool_schema_httpx(): + """ + Ensure nullable object tool params preserve nested properties in Vertex schema conversion. + """ + load_vertex_ai_credentials() + litellm._turn_on_debug() + + + tools = [{ + "type": "function", + "strict": True, + "function": { + "name": "create_support_ticket", + "description": "Create a paid user support ticket", + "parameters": { + "type": "object", + "additionalProperties": False, + "required": ["ticket_id", "customer_context"], + "properties": { + "ticket_id": { + "type": "string", + "description": "Unique identifier for the support ticket" + }, + "customer_context": { + "type": ["object", "null"], + "description": "Context about the paid customer, if available", + "additionalProperties": False, + "required": ["user_id", "plan"], + "properties": { + "user_id": { + "type": "string", + "description": "Internal user identifier" + }, + "plan": { + "type": "string", + "description": "Subscription plan name (e.g. pro, enterprise)" + } + } + } + } + } + } + }] + + response = litellm.completion( + model="vertex_ai/gemini-2.5-flash", + messages=[{"role": "user", "content": "call the tool"}], + tools=tools, + tool_choice="required", + ) + + print(response) + + def test_vertex_ai_response_id(): """Test that litellm preserves the response ID from Vertex AI's API for non-streaming responses""" from litellm.llms.custom_httpx.http_handler import HTTPHandler From 52519c26814b260e20e8c55de54ee548ddc5ad70 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 16 Jan 2026 18:09:15 +0530 Subject: [PATCH 002/300] Fix: _convert_schema_types --- litellm/llms/vertex_ai/common_utils.py | 34 +++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/litellm/llms/vertex_ai/common_utils.py b/litellm/llms/vertex_ai/common_utils.py index 63decfea854..e7d73e421a8 100644 --- a/litellm/llms/vertex_ai/common_utils.py +++ b/litellm/llms/vertex_ai/common_utils.py @@ -735,9 +735,15 @@ def _convert_schema_types(schema, depth=0): if "type" in schema: type_val = schema["type"] if isinstance(type_val, list) and len(type_val) > 1: - # Convert ["string", "number"] -> {"anyOf": [{"type": "STRING"}, {"type": "NUMBER"}]} - # Preserve other schema fields by copying them into each non-null anyOf item. - base_schema = {k: v for k, v in schema.items() if k not in {"type", "anyOf"}} + # Convert type arrays to anyOf format + # For object types, we need to move object-specific fields into the anyOf item + # For primitive types, we only include the type field + + # Fields that should stay at parent level (metadata) + metadata_fields = {"description", "title", "default", "examples"} + # Fields that are specific to object/array types and should move into anyOf + type_specific_fields = {"properties", "required", "additionalProperties", "items", "minItems", "maxItems", "minProperties", "maxProperties"} + any_of: List[Dict[str, Any]] = [] for t in type_val: if not isinstance(t, str): @@ -746,9 +752,25 @@ def _convert_schema_types(schema, depth=0): # Keep null entry minimal so we can strip it later. any_of.append({"type": "null"}) continue - item_schema = deepcopy(base_schema) - item_schema["type"] = t - any_of.append(item_schema) + + # For object/array types, include type-specific fields + if t in ("object", "array"): + item_schema = {"type": t} + # Move type-specific fields into this anyOf item + for field in type_specific_fields: + if field in schema: + item_schema[field] = deepcopy(schema[field]) + any_of.append(item_schema) + else: + # For primitive types, only include the type + any_of.append({"type": t}) + + # Remove type-specific fields from parent if we moved them into anyOf + has_object_or_array = any(t in ("object", "array") for t in type_val if isinstance(t, str)) + if has_object_or_array: + for field in type_specific_fields: + schema.pop(field, None) + schema["anyOf"] = any_of schema.pop("type") elif isinstance(type_val, list) and len(type_val) == 1: From f28340a39d95dd736578eea8b1b390688932bc9e Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 16 Jan 2026 18:15:18 +0530 Subject: [PATCH 003/300] Fix all mypy issues --- litellm/llms/vertex_ai/common_utils.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/litellm/llms/vertex_ai/common_utils.py b/litellm/llms/vertex_ai/common_utils.py index e7d73e421a8..54a6ba3ad7a 100644 --- a/litellm/llms/vertex_ai/common_utils.py +++ b/litellm/llms/vertex_ai/common_utils.py @@ -735,12 +735,7 @@ def _convert_schema_types(schema, depth=0): if "type" in schema: type_val = schema["type"] if isinstance(type_val, list) and len(type_val) > 1: - # Convert type arrays to anyOf format - # For object types, we need to move object-specific fields into the anyOf item - # For primitive types, we only include the type field - - # Fields that should stay at parent level (metadata) - metadata_fields = {"description", "title", "default", "examples"} + # Convert type arrays to anyOf format # Fields that are specific to object/array types and should move into anyOf type_specific_fields = {"properties", "required", "additionalProperties", "items", "minItems", "maxItems", "minProperties", "maxProperties"} From ac5c5ee302729a9833277e99b74afbef7948b51e Mon Sep 17 00:00:00 2001 From: Quentin Machu Date: Mon, 26 Jan 2026 17:42:56 -0500 Subject: [PATCH 004/300] fix: Search tools not found when using per-request routers **Root Cause:** When API keys or teams have router_settings configured, the proxy creates per-request Router instances from user_config. These new routers were missing search_tools from the main router, causing "search tool not found" errors despite search_tools being configured. **The Fix:** 1. **common_request_processing.py (lines 554-556):** Pass search_tools from main router to user_config so per-request routers inherit them 2. **proxy_server.py (line 3171):** Remove `if len(_model_list) > 0` check to allow router creation with empty model list (needed for search-tools-only use case) 3. **proxy_server.py (line 746):** Remove redundant search_tools loading code (already handled by _init_search_tools_in_db() called during startup) --- litellm/proxy/common_request_processing.py | 7 ++++++- litellm/proxy/proxy_server.py | 23 +++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index 0d3e61b75c7..4f0c59474f1 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -547,9 +547,14 @@ class ProxyBaseLLMRequestProcessing: # Get model_list from current router model_list = llm_router.get_model_list() if model_list is not None: - # Create user_config with model_list and router_settings + # Create user_config with model_list, search_tools, and router_settings # This creates a per-request router with the hierarchical settings user_config = {"model_list": model_list, **router_settings} + + # Include search_tools from main router so per-request router has them + if hasattr(llm_router, "search_tools") and llm_router.search_tools: + user_config["search_tools"] = llm_router.search_tools + self.data["user_config"] = user_config if "messages" in self.data and self.data["messages"]: diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 16cdd9da64b..056367243f9 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3173,17 +3173,18 @@ class ProxyConfig: _model_list: list = self.decrypt_model_list_from_db( new_models=models_list ) - if len(_model_list) > 0: - verbose_proxy_logger.debug(f"_model_list: {_model_list}") - llm_router = litellm.Router( - model_list=_model_list, - router_general_settings=RouterGeneralSettings( - async_only_mode=True # only init async clients - ), - search_tools=search_tools, - ignore_invalid_deployments=True, - ) - verbose_proxy_logger.debug(f"updated llm_router: {llm_router}") + # Create router even with empty model list to support search_tools + # Router can function with model_list=[] and only search_tools + verbose_proxy_logger.debug(f"_model_list: {_model_list}") + llm_router = litellm.Router( + model_list=_model_list, + router_general_settings=RouterGeneralSettings( + async_only_mode=True # only init async clients + ), + search_tools=search_tools, + ignore_invalid_deployments=True, + ) + verbose_proxy_logger.debug(f"updated llm_router: {llm_router}") else: verbose_proxy_logger.debug(f"len new_models: {len(models_list)}") ## DELETE MODEL LOGIC From a9eae5937fb58a53047e581d4950b10b956286ce Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 31 Jan 2026 16:04:52 -0800 Subject: [PATCH 005/300] Override router settings --- litellm/proxy/common_request_processing.py | 16 +-- litellm/proxy/route_llm_request.py | 35 +++-- litellm/router.py | 11 +- .../proxy/test_common_request_processing.py | 34 +++-- .../proxy/test_route_llm_request.py | 131 ++++++++++++------ 5 files changed, 144 insertions(+), 83 deletions(-) diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index b69f175e5d2..ee38d56c855 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -626,20 +626,10 @@ class ProxyBaseLLMRequestProcessing: ) # If router_settings found (from key, team, or global), apply them - # This ensures key/team settings override global settings + # Pass settings as per-request overrides instead of creating a new Router + # This avoids expensive Router instantiation on each request if router_settings is not None and router_settings: - # Get model_list from current router - model_list = llm_router.get_model_list() - if model_list is not None: - # Create user_config with model_list, search_tools, and router_settings - # This creates a per-request router with the hierarchical settings - user_config = {"model_list": model_list, **router_settings} - - # Include search_tools from main router so per-request router has them - if hasattr(llm_router, "search_tools") and llm_router.search_tools: - user_config["search_tools"] = llm_router.search_tools - - self.data["user_config"] = user_config + self.data["router_settings_override"] = router_settings if "messages" in self.data and self.data["messages"]: logging_obj.update_messages(self.data["messages"]) diff --git a/litellm/proxy/route_llm_request.py b/litellm/proxy/route_llm_request.py index c6a93164d49..e2749eb8187 100644 --- a/litellm/proxy/route_llm_request.py +++ b/litellm/proxy/route_llm_request.py @@ -197,18 +197,33 @@ async def route_request( models = [model.strip() for model in data.pop("model").split(",")] return llm_router.abatch_completion(models=models, **data) - elif "user_config" in data: - router_config = data.pop("user_config") + elif "router_settings_override" in data: + # Apply per-request router settings overrides from key/team config + # Instead of creating a new Router (expensive), merge settings into kwargs + # The Router already supports per-request overrides for these settings + override_settings = data.pop("router_settings_override") - # Filter router_config to only include valid Router.__init__ arguments - # This prevents TypeError when invalid parameters are stored in the database - valid_args = litellm.Router.get_valid_args() - filtered_config = {k: v for k, v in router_config.items() if k in valid_args} + # Settings that the Router accepts as per-request kwargs + # These override the global router settings for this specific request + per_request_settings = [ + "fallbacks", + "context_window_fallbacks", + "content_policy_fallbacks", + "num_retries", + "timeout", + "model_group_retry_policy", + ] - user_router = litellm.Router(**filtered_config) - ret_val = getattr(user_router, f"{route_type}")(**data) - user_router.discard() - return ret_val + # Merge override settings into data (only if not already set in request) + for key in per_request_settings: + if key in override_settings and key not in data: + data[key] = override_settings[key] + + # Use main router with overridden kwargs + if llm_router is not None: + return getattr(llm_router, f"{route_type}")(**data) + else: + return getattr(litellm, f"{route_type}")(**data) elif llm_router is not None: # Skip model-based routing for container operations if route_type in [ diff --git a/litellm/router.py b/litellm/router.py index 6c191c8ab03..ed480d6468a 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -4880,6 +4880,10 @@ class Router: content_policy_fallbacks = kwargs.pop( "content_policy_fallbacks", self.content_policy_fallbacks ) + # Support per-request model_group_retry_policy override (from key/team settings) + model_group_retry_policy = kwargs.pop( + "model_group_retry_policy", self.model_group_retry_policy + ) model_group: Optional[str] = kwargs.get("model") num_retries = kwargs.pop("num_retries") @@ -4928,7 +4932,7 @@ class Router: _retry_policy_applies = False if ( self.retry_policy is not None - or self.model_group_retry_policy is not None + or model_group_retry_policy is not None ): # get num_retries from retry policy # Use the model_group captured at the start of the function, or get it from metadata @@ -4936,9 +4940,12 @@ class Router: _model_group_for_retry_policy = ( model_group or _metadata.get("model_group") or kwargs.get("model") ) - _retry_policy_retries = self.get_num_retries_from_retry_policy( + # Use per-request model_group_retry_policy if provided, otherwise use self + _retry_policy_retries = _get_num_retries_from_retry_policy( exception=original_exception, model_group=_model_group_for_retry_policy, + model_group_retry_policy=model_group_retry_policy, + retry_policy=self.retry_policy, ) if _retry_policy_retries is not None: num_retries = _retry_policy_retries diff --git a/tests/test_litellm/proxy/test_common_request_processing.py b/tests/test_litellm/proxy/test_common_request_processing.py index 6edcdab15c0..d2abe80977a 100644 --- a/tests/test_litellm/proxy/test_common_request_processing.py +++ b/tests/test_litellm/proxy/test_common_request_processing.py @@ -78,9 +78,16 @@ class TestProxyBaseLLMRequestProcessing: assert data_passed["litellm_call_id"] == returned_data["litellm_call_id"] @pytest.mark.asyncio - async def test_should_apply_hierarchical_router_settings_to_user_config( + async def test_should_apply_hierarchical_router_settings_as_override( self, monkeypatch ): + """ + Test that hierarchical router settings are stored as router_settings_override + instead of creating a full user_config with model_list. + + This approach avoids expensive per-request Router instantiation by passing + settings as kwargs overrides to the main router. + """ processing_obj = ProxyBaseLLMRequestProcessing(data={}) mock_request = MagicMock(spec=Request) mock_request.headers = {} @@ -117,12 +124,7 @@ class TestProxyBaseLLMRequestProcessing: return_value=mock_router_settings ) - mock_model_list = [ - {"model_name": "gpt-3.5-turbo", "litellm_params": {"model": "gpt-3.5-turbo"}}, - {"model_name": "gpt-4", "litellm_params": {"model": "gpt-4"}}, - ] mock_llm_router = MagicMock() - mock_llm_router.get_model_list = MagicMock(return_value=mock_model_list) mock_prisma_client = MagicMock() monkeypatch.setattr( @@ -146,14 +148,20 @@ class TestProxyBaseLLMRequestProcessing: user_api_key_dict=mock_user_api_key_dict, prisma_client=mock_prisma_client, ) - mock_llm_router.get_model_list.assert_called_once() + # get_model_list should NOT be called - we no longer copy model list for per-request routers + mock_llm_router.get_model_list.assert_not_called() - assert "user_config" in returned_data - user_config = returned_data["user_config"] - assert user_config["model_list"] == mock_model_list - assert user_config["routing_strategy"] == "least-busy" - assert user_config["timeout"] == 30.0 - assert user_config["num_retries"] == 3 + # Settings should be stored as router_settings_override (not user_config) + # This allows passing them as kwargs to the main router instead of creating a new one + assert "router_settings_override" in returned_data + assert "user_config" not in returned_data + + router_settings_override = returned_data["router_settings_override"] + assert router_settings_override["routing_strategy"] == "least-busy" + assert router_settings_override["timeout"] == 30.0 + assert router_settings_override["num_retries"] == 3 + # model_list should NOT be in the override settings + assert "model_list" not in router_settings_override @pytest.mark.asyncio async def test_stream_timeout_header_processing(self): diff --git a/tests/test_litellm/proxy/test_route_llm_request.py b/tests/test_litellm/proxy/test_route_llm_request.py index 90eace63714..1283d2ccbe7 100644 --- a/tests/test_litellm/proxy/test_route_llm_request.py +++ b/tests/test_litellm/proxy/test_route_llm_request.py @@ -137,62 +137,103 @@ async def test_route_request_no_model_required_with_router_settings_and_no_route @pytest.mark.asyncio -async def test_route_request_with_invalid_router_params(): +async def test_route_request_with_router_settings_override(): """ - Test that route_request filters out invalid Router init params from 'user_config'. - This covers the fix for https://github.com/BerriAI/litellm/issues/19693 + Test that route_request handles router_settings_override by merging settings into kwargs + instead of creating a new Router (which is expensive and was the old behavior). """ - import litellm - from litellm.router import Router - from unittest.mock import AsyncMock - - # Mock data with user_config containing invalid keys (simulating DB entry) + # Mock data with router_settings_override containing per-request settings data = { "model": "gpt-3.5-turbo", - "user_config": { - "model_list": [ - { - "model_name": "gpt-3.5-turbo", - "litellm_params": {"model": "gpt-3.5-turbo", "api_key": "test"}, - } - ], - "model_alias_map": {"alias": "real_model"}, # INVALID PARAM - "invalid_garbage_key": "crash_me", # INVALID PARAM + "messages": [{"role": "user", "content": "Hello"}], + "router_settings_override": { + "fallbacks": [{"gpt-3.5-turbo": ["gpt-4"]}], + "num_retries": 5, + "timeout": 30, + "model_group_retry_policy": {"gpt-3.5-turbo": {"RateLimitErrorRetries": 3}}, + # These settings should be ignored (not in per_request_settings list) + "routing_strategy": "least-busy", + "model_group_alias": {"alias": "real_model"}, }, } - # We expect Router(**config) to succeed because of the filtering. - # If filtering fails, this will raise TypeError and fail the test. + llm_router = MagicMock() + llm_router.acompletion.return_value = "success" + + response = await route_request(data, llm_router, None, "acompletion") + + assert response == "success" + # Verify the router method was called with merged settings + call_kwargs = llm_router.acompletion.call_args[1] + assert call_kwargs["fallbacks"] == [{"gpt-3.5-turbo": ["gpt-4"]}] + assert call_kwargs["num_retries"] == 5 + assert call_kwargs["timeout"] == 30 + assert call_kwargs["model_group_retry_policy"] == {"gpt-3.5-turbo": {"RateLimitErrorRetries": 3}} + # Verify unsupported settings were NOT merged + assert "routing_strategy" not in call_kwargs + assert "model_group_alias" not in call_kwargs + # Verify router_settings_override was removed from data + assert "router_settings_override" not in call_kwargs + + +@pytest.mark.asyncio +async def test_route_request_with_router_settings_override_no_router(): + """ + Test that router_settings_override works when no router is provided, + falling back to litellm module directly. + """ + import litellm + + data = { + "model": "gpt-3.5-turbo", + "messages": [{"role": "user", "content": "Hello"}], + "router_settings_override": { + "fallbacks": [{"gpt-3.5-turbo": ["gpt-4"]}], + "num_retries": 3, + }, + } + + # Use MagicMock explicitly to avoid auto-AsyncMock behavior in Python 3.12+ + mock_completion = MagicMock(return_value="success") + original_acompletion = litellm.acompletion + litellm.acompletion = mock_completion + try: - # route_request calls getattr(user_router, route_type)(**data) - # We'll mock the internal call to avoid making real network requests - with pytest.MonkeyPatch.context() as m: - # Mock the method that gets called on the router instance - # We don't easily have access to the instance created INSIDE existing route_request - # So we will wrap litellm.Router to spy on it or verify it doesn't crash + response = await route_request(data, None, None, "acompletion") - original_router_init = litellm.Router.__init__ + assert response == "success" + # Verify litellm.acompletion was called with merged settings + call_kwargs = mock_completion.call_args[1] + assert call_kwargs["fallbacks"] == [{"gpt-3.5-turbo": ["gpt-4"]}] + assert call_kwargs["num_retries"] == 3 + finally: + litellm.acompletion = original_acompletion - def safe_router_init(self, **kwargs): - # Verify that invalid keys are NOT present in kwargs - assert "model_alias_map" not in kwargs - assert "invalid_garbage_key" not in kwargs - # Call original init (which would raise TypeError if invalid keys were present) - original_router_init(self, **kwargs) - m.setattr(litellm.Router, "__init__", safe_router_init) +@pytest.mark.asyncio +async def test_route_request_with_router_settings_override_preserves_existing(): + """ + Test that router_settings_override does not override settings already in the request. + Request-level settings take precedence over key/team settings. + """ + data = { + "model": "gpt-3.5-turbo", + "messages": [{"role": "user", "content": "Hello"}], + "num_retries": 10, # Request-level setting + "router_settings_override": { + "num_retries": 3, # Key/team setting - should NOT override + "timeout": 30, # Key/team setting - should be applied + }, + } - # Use 'acompletion' as the route_type - # We also need to mock the completion method to avoid real calls - m.setattr(Router, "acompletion", AsyncMock(return_value="success")) + llm_router = MagicMock() + llm_router.acompletion.return_value = "success" - response = await route_request(data, None, None, "acompletion") - assert response == "success" + response = await route_request(data, llm_router, None, "acompletion") - except TypeError as e: - pytest.fail( - f"route_request raised TypeError, implying invalid params were passed to Router: {e}" - ) - except Exception: - # Other exceptions might happen (e.g. valid config issues) but we care about TypeError here - pass + assert response == "success" + call_kwargs = llm_router.acompletion.call_args[1] + # Request-level num_retries should take precedence + assert call_kwargs["num_retries"] == 10 + # Key/team timeout should be applied since not in request + assert call_kwargs["timeout"] == 30 From ec4f7a38ffb740fc4303a17f3475e9d33680e558 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 15:49:05 -0800 Subject: [PATCH 006/300] Add option for authentication for public AI Hub --- .../proxy_setting_endpoints.py | 6 ++ .../UISettings/UISettings.test.tsx | 75 +++++++++++++++++++ .../AdminSettings/UISettings/UISettings.tsx | 31 ++++++++ 3 files changed, 112 insertions(+) diff --git a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py index 30ec0766dbf..f626ad7eb14 100644 --- a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py +++ b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py @@ -83,6 +83,11 @@ class UISettings(BaseModel): description="List of page keys that internal users (non-admins) can see in the UI sidebar. If not set, all pages are visible based on role permissions.", ) + require_auth_for_public_ai_hub: bool = Field( + default=False, + description="If true, requires authentication for accessing the public AI Hub." + ) + class UISettingsResponse(SettingsResponse): """Response model for UI settings""" @@ -95,6 +100,7 @@ ALLOWED_UI_SETTINGS_FIELDS = { "disable_model_add_for_internal_users", "disable_team_admin_delete_team_user", "enabled_ui_pages_internal_users", + "require_auth_for_public_ai_hub", } diff --git a/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.test.tsx b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.test.tsx index 31dcfc102ec..639564bbd35 100644 --- a/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.test.tsx +++ b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.test.tsx @@ -20,6 +20,13 @@ vi.mock("@/app/(dashboard)/hooks/uiSettings/useUpdateUISettings", () => ({ useUpdateUISettings: mockUseUpdateUISettings, })); +vi.mock("@/components/molecules/notifications_manager", () => ({ + default: { + success: vi.fn(), + fromBackend: vi.fn(), + }, +})); + const buildSettingsResponse = (overrides?: Partial>) => ({ data: { field_schema: { @@ -28,10 +35,18 @@ const buildSettingsResponse = (overrides?: Partial>) => disable_model_add_for_internal_users: { description: "Disable model add for internal users", }, + disable_team_admin_delete_team_user: { + description: "Disable team admin delete team user", + }, + require_auth_for_public_ai_hub: { + description: "Require authentication for public AI Hub", + }, }, }, values: { disable_model_add_for_internal_users: false, + disable_team_admin_delete_team_user: false, + require_auth_for_public_ai_hub: false, }, }, isLoading: false, @@ -57,6 +72,8 @@ describe("UISettings", () => { expect(screen.getByText("UI Settings")).toBeInTheDocument(); expect(screen.getByRole("switch", { name: "Disable model add for internal users" })).toBeInTheDocument(); + expect(screen.getByRole("switch", { name: "Disable team admin delete team user" })).toBeInTheDocument(); + expect(screen.getByRole("switch", { name: "Require authentication for public AI Hub" })).toBeInTheDocument(); }); it("should toggle setting and call update", () => { @@ -87,4 +104,62 @@ describe("UISettings", () => { ); expect(NotificationManager.success).toHaveBeenCalledWith("UI settings updated successfully"); }); + + it("should toggle disable team admin delete team user setting and call update", () => { + const mutateMock = vi.fn((_settings, options) => { + options?.onSuccess?.(); + }); + + mockUseUpdateUISettings.mockReturnValue({ + mutate: mutateMock, + isPending: false, + error: null, + }); + + render(); + + const toggle = screen.getByRole("switch", { name: "Disable team admin delete team user" }); + + act(() => { + fireEvent.click(toggle); + }); + + expect(mutateMock).toHaveBeenCalledWith( + { disable_team_admin_delete_team_user: true }, + expect.objectContaining({ + onSuccess: expect.any(Function), + onError: expect.any(Function), + }), + ); + expect(NotificationManager.success).toHaveBeenCalledWith("UI settings updated successfully"); + }); + + it("should toggle require auth for public AI Hub setting and call update", () => { + const mutateMock = vi.fn((_settings, options) => { + options?.onSuccess?.(); + }); + + mockUseUpdateUISettings.mockReturnValue({ + mutate: mutateMock, + isPending: false, + error: null, + }); + + render(); + + const toggle = screen.getByRole("switch", { name: "Require authentication for public AI Hub" }); + + act(() => { + fireEvent.click(toggle); + }); + + expect(mutateMock).toHaveBeenCalledWith( + { require_auth_for_public_ai_hub: true }, + expect.objectContaining({ + onSuccess: expect.any(Function), + onError: expect.any(Function), + }), + ); + expect(NotificationManager.success).toHaveBeenCalledWith("UI settings updated successfully"); + }); }); diff --git a/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.tsx b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.tsx index 6cc9cbf4309..a43f0e9d42d 100644 --- a/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.tsx +++ b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/UISettings.tsx @@ -15,6 +15,7 @@ export default function UISettings() { const schema = data?.field_schema; const property = schema?.properties?.disable_model_add_for_internal_users; const disableTeamAdminDeleteProperty = schema?.properties?.disable_team_admin_delete_team_user; + const requireAuthForPublicAIHubProperty = schema?.properties?.require_auth_for_public_ai_hub; const enabledPagesProperty = schema?.properties?.enabled_ui_pages_internal_users; const values = data?.values ?? {}; const isDisabledForInternalUsers = Boolean(values.disable_model_add_for_internal_users); @@ -59,6 +60,20 @@ export default function UISettings() { }); }; + const handleToggleRequireAuthForPublicAIHub = (checked: boolean) => { + updateSettings( + { require_auth_for_public_ai_hub: checked }, + { + onSuccess: () => { + NotificationManager.success("UI settings updated successfully"); + }, + onError: (error) => { + NotificationManager.fromBackend(error); + }, + }, + ); + }; + return ( {isLoading ? ( @@ -113,6 +128,22 @@ export default function UISettings() { + + + + Require authentication for public AI Hub + {requireAuthForPublicAIHubProperty?.description && ( + {requireAuthForPublicAIHubProperty.description} + )} + + + {/* Page Visibility for Internal Users */} From c47866afb98214d7f5d77353e1090eb56d944085 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 16:37:45 -0800 Subject: [PATCH 007/300] useAuthorized refactor --- .../(dashboard)/hooks/useAuthorized.test.ts | 51 ++++++++---- .../app/(dashboard)/hooks/useAuthorized.ts | 44 ++++------- .../src/utils/jwtUtils.test.ts | 79 ++++++++++++++++++- ui/litellm-dashboard/src/utils/jwtUtils.ts | 15 ++++ 4 files changed, 144 insertions(+), 45 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.test.ts index 78eddbd8d3c..ef4a779b50b 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.test.ts @@ -8,12 +8,13 @@ import useAuthorized from "./useAuthorized"; // Unmock useAuthorized to test the actual implementation vi.unmock("@/app/(dashboard)/hooks/useAuthorized"); -const { replaceMock, clearTokenCookiesMock, getProxyBaseUrlMock, getUiConfigMock, isJwtExpiredMock } = vi.hoisted(() => ({ +const { replaceMock, clearTokenCookiesMock, getProxyBaseUrlMock, getUiConfigMock, decodeTokenMock, checkTokenValidityMock } = vi.hoisted(() => ({ replaceMock: vi.fn(), clearTokenCookiesMock: vi.fn(), getProxyBaseUrlMock: vi.fn(() => "http://proxy.example"), getUiConfigMock: vi.fn(), - isJwtExpiredMock: vi.fn(), + decodeTokenMock: vi.fn(), + checkTokenValidityMock: vi.fn(), })); vi.mock("next/navigation", () => ({ @@ -43,7 +44,8 @@ vi.mock("@/utils/jwtUtils", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - isJwtExpired: isJwtExpiredMock, + decodeToken: decodeTokenMock, + checkTokenValidity: checkTokenValidityMock, }; }); @@ -77,7 +79,8 @@ describe("useAuthorized", () => { clearTokenCookiesMock.mockReset(); getProxyBaseUrlMock.mockClear(); getUiConfigMock.mockReset(); - isJwtExpiredMock.mockReset(); + decodeTokenMock.mockReset(); + checkTokenValidityMock.mockReset(); clearCookie(); }); @@ -88,9 +91,8 @@ describe("useAuthorized", () => { auto_redirect_to_sso: false, admin_ui_disabled: false, }); - isJwtExpiredMock.mockReturnValue(false); - - const token = createJwt({ + + const decodedPayload = { key: "api-key-123", user_id: "user-1", user_email: "user@example.com", @@ -98,7 +100,12 @@ describe("useAuthorized", () => { premium_user: true, disabled_non_admin_personal_key_creation: false, login_method: "username_password", - }); + }; + + decodeTokenMock.mockReturnValue(decodedPayload); + checkTokenValidityMock.mockReturnValue(true); + + const token = createJwt(decodedPayload); document.cookie = `token=${token}; path=/;`; const { result } = renderHook(() => useAuthorized(), { wrapper }); @@ -126,6 +133,9 @@ describe("useAuthorized", () => { admin_ui_disabled: false, }); + decodeTokenMock.mockReturnValue(null); + checkTokenValidityMock.mockReturnValue(false); + document.cookie = "token=invalid-token; path=/;"; const { result } = renderHook(() => useAuthorized(), { wrapper }); @@ -146,9 +156,8 @@ describe("useAuthorized", () => { auto_redirect_to_sso: false, admin_ui_disabled: true, }); - isJwtExpiredMock.mockReturnValue(false); - const token = createJwt({ + const decodedPayload = { key: "api-key-123", user_id: "user-1", user_email: "user@example.com", @@ -156,7 +165,12 @@ describe("useAuthorized", () => { premium_user: true, disabled_non_admin_personal_key_creation: false, login_method: "username_password", - }); + }; + + decodeTokenMock.mockReturnValue(decodedPayload); + checkTokenValidityMock.mockReturnValue(true); + + const token = createJwt(decodedPayload); document.cookie = `token=${token}; path=/;`; const { result } = renderHook(() => useAuthorized(), { wrapper }); @@ -178,6 +192,9 @@ describe("useAuthorized", () => { admin_ui_disabled: false, }); + decodeTokenMock.mockReturnValue(null); + checkTokenValidityMock.mockReturnValue(false); + // No token cookie set const { result } = renderHook(() => useAuthorized(), { wrapper }); @@ -196,14 +213,18 @@ describe("useAuthorized", () => { auto_redirect_to_sso: false, admin_ui_disabled: false, }); - isJwtExpiredMock.mockReturnValue(true); - const token = createJwt({ + const decodedPayload = { key: "api-key-123", user_id: "user-1", user_email: "user@example.com", user_role: "app_admin", - }); + }; + + decodeTokenMock.mockReturnValue(decodedPayload); + checkTokenValidityMock.mockReturnValue(false); + + const token = createJwt(decodedPayload); document.cookie = `token=${token}; path=/;`; const { result } = renderHook(() => useAuthorized(), { wrapper }); @@ -213,6 +234,6 @@ describe("useAuthorized", () => { }); expect(replaceMock).toHaveBeenCalledWith("http://proxy.example/ui/login"); - expect(isJwtExpiredMock).toHaveBeenCalledWith(token); + expect(checkTokenValidityMock).toHaveBeenCalledWith(token); }); }); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.ts index 531a240a371..0b60971c1eb 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useAuthorized.ts @@ -2,8 +2,7 @@ import { getProxyBaseUrl } from "@/components/networking"; import { clearTokenCookies, getCookie } from "@/utils/cookieUtils"; -import { isJwtExpired } from "@/utils/jwtUtils"; -import { jwtDecode } from "jwt-decode"; +import { checkTokenValidity, decodeToken } from "@/utils/jwtUtils"; import { useRouter } from "next/navigation"; import { useEffect, useMemo } from "react"; import { useUIConfig } from "./uiConfig/useUIConfig"; @@ -43,44 +42,31 @@ const useAuthorized = () => { const token = typeof document !== "undefined" ? getCookie("token") : null; - // Step 1: Check for missing token or expired JWT - kick out immediately (even if UI Config is loading) + const decoded = useMemo(() => decodeToken(token), [token]); + const isTokenValid = useMemo(() => checkTokenValidity(token), [token]); + const isLoading = isUIConfigLoading; + const isAuthorized = isTokenValid && !uiConfig?.admin_ui_disabled; + + // Single useEffect for all redirect logic useEffect(() => { - if (!token || (token && isJwtExpired(token))) { + if (isLoading) return; + + if (!isAuthorized) { if (token) { clearTokenCookies(); } router.replace(`${getProxyBaseUrl()}/ui/login`); } - }, [token, router]); - - useEffect(() => { - if (isUIConfigLoading) { - return; - } - if (uiConfig?.admin_ui_disabled) { - router.replace(`${getProxyBaseUrl()}/ui/login`); - } - }, [router, isUIConfigLoading, uiConfig]); - - // Decode safely - const decoded = useMemo(() => { - if (!token) return null; - try { - return jwtDecode(token) as Record; - } catch { - // Bad token in cookie — clear and bounce - clearTokenCookies(); - router.replace(`${getProxyBaseUrl()}/ui/login`); - return null; - } - }, [token, router]); + }, [isLoading, isAuthorized, token, router]); return { - token: token, + isLoading, + isAuthorized, + token: isAuthorized ? token : null, accessToken: decoded?.key ?? null, userId: decoded?.user_id ?? null, userEmail: decoded?.user_email ?? null, - userRole: formatUserRole(decoded?.user_role ?? null), + userRole: formatUserRole(decoded?.user_role), premiumUser: decoded?.premium_user ?? null, disabledPersonalKeyCreation: decoded?.disabled_non_admin_personal_key_creation ?? null, showSSOBanner: decoded?.login_method === "username_password", diff --git a/ui/litellm-dashboard/src/utils/jwtUtils.test.ts b/ui/litellm-dashboard/src/utils/jwtUtils.test.ts index d695a3c37bb..bad8d4f6653 100644 --- a/ui/litellm-dashboard/src/utils/jwtUtils.test.ts +++ b/ui/litellm-dashboard/src/utils/jwtUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; -import { isJwtExpired } from "./jwtUtils"; +import { isJwtExpired, decodeToken, checkTokenValidity } from "./jwtUtils"; import { jwtDecode } from "jwt-decode"; vi.mock("jwt-decode"); @@ -50,4 +50,81 @@ describe("jwtUtils", () => { expect(isJwtExpired("invalid-token")).toBe(true); }); + + describe("decodeToken", () => { + it("should return null if token is null", () => { + expect(decodeToken(null)).toBeNull(); + }); + + it("should return null if token is empty string", () => { + expect(decodeToken("")).toBeNull(); + }); + + it("should decode a valid token", () => { + const mockPayload = { + key: "api-key-123", + user_id: "user-1", + user_email: "user@example.com", + user_role: "app_admin", + }; + vi.mocked(jwtDecode).mockReturnValue(mockPayload); + + expect(decodeToken("valid-token")).toEqual(mockPayload); + expect(jwtDecode).toHaveBeenCalledWith("valid-token"); + }); + + it("should return null if jwtDecode throws an error", () => { + vi.mocked(jwtDecode).mockImplementation(() => { + throw new Error("Invalid token"); + }); + + expect(decodeToken("invalid-token")).toBeNull(); + }); + }); + + describe("checkTokenValidity", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should return false if token is null", () => { + expect(checkTokenValidity(null)).toBe(false); + }); + + it("should return false if token is empty string", () => { + expect(checkTokenValidity("")).toBe(false); + }); + + it("should return true for a valid, non-expired token", () => { + const mockDateNow = 1716838401000; + vi.spyOn(Date, "now").mockReturnValue(mockDateNow); + const mockPayload = { + exp: Math.floor(mockDateNow / 1000) + 1000, + user_id: "user-1", + }; + vi.mocked(jwtDecode).mockReturnValue(mockPayload); + + expect(checkTokenValidity("valid-token")).toBe(true); + }); + + it("should return false for an expired token", () => { + const mockDateNow = 1716838401000; + vi.spyOn(Date, "now").mockReturnValue(mockDateNow); + const mockPayload = { + exp: Math.floor(mockDateNow / 1000) - 1, + user_id: "user-1", + }; + vi.mocked(jwtDecode).mockReturnValue(mockPayload); + + expect(checkTokenValidity("expired-token")).toBe(false); + }); + + it("should return false if token cannot be decoded", () => { + vi.mocked(jwtDecode).mockImplementation(() => { + throw new Error("Invalid token"); + }); + + expect(checkTokenValidity("invalid-token")).toBe(false); + }); + }); }); diff --git a/ui/litellm-dashboard/src/utils/jwtUtils.ts b/ui/litellm-dashboard/src/utils/jwtUtils.ts index d3db41a411a..2a7972ad4cc 100644 --- a/ui/litellm-dashboard/src/utils/jwtUtils.ts +++ b/ui/litellm-dashboard/src/utils/jwtUtils.ts @@ -12,3 +12,18 @@ export function isJwtExpired(token: string): boolean { return true; } } + +export function decodeToken(token: string | null): Record | null { + if (!token) return null; + try { + return jwtDecode(token) as Record; + } catch { + return null; + } +} + +export function checkTokenValidity(token: string | null): boolean { + if (!token) return false; + const decoded = decodeToken(token); + return decoded !== null && !isJwtExpired(token); +} From 28bae2264c070753b982ea5bd5277bf9411c1ccc Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 16:57:46 -0800 Subject: [PATCH 008/300] ai hub req auth working --- .../hooks/uiSettings/useUISettings.ts | 4 +-- .../src/components/AIHub/ModelHubTable.tsx | 27 +++++++++++++++++++ .../src/components/networking.tsx | 5 +--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts index 46a0254d0db..f6d5035018c 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts @@ -6,11 +6,9 @@ import useAuthorized from "../useAuthorized"; const uiSettingsKeys = createQueryKeys("uiSettings"); export const useUISettings = () => { - const { accessToken } = useAuthorized(); return useQuery>({ queryKey: uiSettingsKeys.list({}), - queryFn: async () => await getUiSettings(accessToken), - enabled: !!accessToken, + queryFn: async () => await getUiSettings(), staleTime: 60 * 60 * 1000, // 1 hour - data rarely changes gcTime: 60 * 60 * 1000, // 1 hour - keep in cache for 1 hour }); diff --git a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx index 4843713e5a6..71b84e281df 100644 --- a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx @@ -27,6 +27,9 @@ import { Copy } from "lucide-react"; import { useRouter } from "next/navigation"; import React, { useCallback, useEffect, useState } from "react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; +import { useUISettings } from "@/app/(dashboard)/hooks/uiSettings/useUISettings"; +import { checkTokenValidity } from "@/utils/jwtUtils"; +import { getCookie } from "@/utils/cookieUtils"; interface ModelHubTableProps { accessToken: string | null; @@ -76,6 +79,30 @@ const ModelHubTable: React.FC = ({ accessToken, publicPage, const [isMcpModalVisible, setIsMcpModalVisible] = useState(false); const [isMakeMcpPublicModalVisible, setIsMakeMcpPublicModalVisible] = useState(false); const router = useRouter(); + const { data: uiSettings, isLoading: isUISettingsLoading } = useUISettings(); + + // Check authentication requirement for public AI Hub + useEffect(() => { + // Only check when UI settings are loaded and this is a public page + if (isUISettingsLoading || !publicPage) { + return; + } + + const requireAuth = uiSettings?.values?.require_auth_for_public_ai_hub; + + // If require_auth_for_public_ai_hub is true, verify token + if (requireAuth === true) { + const token = getCookie("token"); + const isTokenValid = checkTokenValidity(token); + + // If token is invalid, redirect to login + if (!isTokenValid) { + router.replace(`${getProxyBaseUrl()}/ui/login`); + return; + } + } + // If require_auth_for_public_ai_hub is false, allow public access (no change) + }, [isUISettingsLoading, publicPage, uiSettings, router]); useEffect(() => { const fetchData = async (accessToken: string) => { diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index ca4c16a781f..d5447e0d134 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -8736,14 +8736,11 @@ export const loginCall = async (username: string, password: string): Promise { +export const getUiSettings = async () => { const proxyBaseUrl = getProxyBaseUrl(); const url = proxyBaseUrl ? `${proxyBaseUrl}/get/ui_settings` : `/get/ui_settings`; const response = await fetch(url, { method: "GET", - headers: { - [globalLitellmHeaderName]: `Bearer ${accessToken}`, - }, }); if (!response.ok) { const errorData = await response.json(); From bdf47eb0f0a608e31e93df2fa5e546838821ab55 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 17:01:48 -0800 Subject: [PATCH 009/300] Adding tests --- .../hooks/uiSettings/useUISettings.test.ts | 72 +------------------ .../hooks/uiSettings/useUISettings.ts | 1 - .../components/AIHub/ModelHubTable.test.tsx | 14 +++- 3 files changed, 14 insertions(+), 73 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.test.ts index 785f003d2f8..0fc3bda27fc 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.test.ts @@ -10,12 +10,6 @@ vi.mock("@/components/networking", () => ({ getUiSettings: vi.fn(), })); -// Mock useAuthorized hook - we can override this in individual tests -const mockUseAuthorized = vi.fn(); -vi.mock("../useAuthorized", () => ({ - default: () => mockUseAuthorized(), -})); - // Mock data const mockUISettings: Record = { theme: "dark", @@ -39,18 +33,6 @@ describe("useUISettings", () => { // Reset all mocks vi.clearAllMocks(); - - // Set default mock for useAuthorized (enabled state) - mockUseAuthorized.mockReturnValue({ - accessToken: "test-access-token", - userRole: "Admin", - userId: "test-user-id", - token: "test-token", - userEmail: "test@example.com", - premiumUser: false, - disabledPersonalKeyCreation: null, - showSSOBanner: false, - }); }); const wrapper = ({ children }: { children: ReactNode }) => @@ -74,7 +56,7 @@ describe("useUISettings", () => { expect(result.current.data).toEqual(mockUISettings); expect(result.current.error).toBeNull(); - expect(getUiSettings).toHaveBeenCalledWith("test-access-token"); + expect(getUiSettings).toHaveBeenCalledWith(); expect(getUiSettings).toHaveBeenCalledTimes(1); }); @@ -98,58 +80,10 @@ describe("useUISettings", () => { expect(result.current.error).toEqual(testError); expect(result.current.data).toBeUndefined(); - expect(getUiSettings).toHaveBeenCalledWith("test-access-token"); + expect(getUiSettings).toHaveBeenCalledWith(); expect(getUiSettings).toHaveBeenCalledTimes(1); }); - it("should not execute query when accessToken is missing", async () => { - // Mock missing accessToken - mockUseAuthorized.mockReturnValue({ - accessToken: null, - userRole: "Admin", - userId: "test-user-id", - token: null, - userEmail: "test@example.com", - premiumUser: false, - disabledPersonalKeyCreation: null, - showSSOBanner: false, - }); - - const { result } = renderHook(() => useUISettings(), { wrapper }); - - // Query should not execute - expect(result.current.isLoading).toBe(false); - expect(result.current.data).toBeUndefined(); - expect(result.current.isFetched).toBe(false); - - // API should not be called - expect(getUiSettings).not.toHaveBeenCalled(); - }); - - it("should not execute query when accessToken is empty string", async () => { - // Mock empty accessToken - mockUseAuthorized.mockReturnValue({ - accessToken: "", - userRole: "Admin", - userId: "test-user-id", - token: "", - userEmail: "test@example.com", - premiumUser: false, - disabledPersonalKeyCreation: null, - showSSOBanner: false, - }); - - const { result } = renderHook(() => useUISettings(), { wrapper }); - - // Query should not execute - expect(result.current.isLoading).toBe(false); - expect(result.current.data).toBeUndefined(); - expect(result.current.isFetched).toBe(false); - - // API should not be called - expect(getUiSettings).not.toHaveBeenCalled(); - }); - it("should return empty object when API returns empty settings", async () => { // Mock API returning empty object (getUiSettings as any).mockResolvedValue({}); @@ -163,7 +97,7 @@ describe("useUISettings", () => { }); expect(result.current.data).toEqual({}); - expect(getUiSettings).toHaveBeenCalledWith("test-access-token"); + expect(getUiSettings).toHaveBeenCalledWith(); }); it("should handle network timeout error", async () => { diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts index f6d5035018c..14c6c5e3888 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/uiSettings/useUISettings.ts @@ -1,7 +1,6 @@ import { getUiSettings } from "@/components/networking"; import { useQuery } from "@tanstack/react-query"; import { createQueryKeys } from "../common/queryKeysFactory"; -import useAuthorized from "../useAuthorized"; const uiSettingsKeys = createQueryKeys("uiSettings"); diff --git a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx index a88ce0d7938..048fc9195a8 100644 --- a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx @@ -1,6 +1,6 @@ import * as networking from "@/components/networking"; -import { render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; +import { renderWithProviders, screen, waitFor } from "../../../tests/test-utils"; import ModelHubTable from "./ModelHubTable"; vi.mock("@/components/networking", () => ({ @@ -11,6 +11,8 @@ vi.mock("@/components/networking", () => ({ getProxyBaseUrl: vi.fn(() => "http://localhost:4000"), getAgentsList: vi.fn(), fetchMCPServers: vi.fn(), + getUiSettings: vi.fn(), + getClaudeCodeMarketplace: vi.fn(), })); vi.mock("next/navigation", () => ({ @@ -39,8 +41,11 @@ describe("ModelHubTable", () => { agents: [], }); vi.mocked(networking.fetchMCPServers).mockResolvedValue([]); + vi.mocked(networking.getUiSettings).mockResolvedValue({ + values: {}, + }); - render(); + renderWithProviders(); await waitFor(() => { expect(screen.getByText("AI Hub")).toBeInTheDocument(); @@ -58,8 +63,11 @@ describe("ModelHubTable", () => { admin_ui_disabled: false, }); modelHubPublicModelsCallMock.mockResolvedValue([]); + vi.mocked(networking.getUiSettings).mockResolvedValue({ + values: {}, + }); - render(); + renderWithProviders(); await waitFor(() => { expect(getUiConfigMock).toHaveBeenCalled(); From d016ac863bab52a8c46f465b53840b57a70a8c96 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 17:05:06 -0800 Subject: [PATCH 010/300] Adding tests for model hub --- .../components/AIHub/ModelHubTable.test.tsx | 137 +++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx index 048fc9195a8..0a5cd17e571 100644 --- a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.test.tsx @@ -3,6 +3,11 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { renderWithProviders, screen, waitFor } from "../../../tests/test-utils"; import ModelHubTable from "./ModelHubTable"; +const mockUseUISettings = vi.hoisted(() => vi.fn()); +const mockGetCookie = vi.hoisted(() => vi.fn()); +const mockCheckTokenValidity = vi.hoisted(() => vi.fn()); +const mockRouterReplace = vi.hoisted(() => vi.fn()); + vi.mock("@/components/networking", () => ({ getUiConfig: vi.fn(), modelHubPublicModelsCall: vi.fn(), @@ -17,7 +22,7 @@ vi.mock("@/components/networking", () => ({ vi.mock("next/navigation", () => ({ useRouter: () => ({ - replace: vi.fn(), + replace: mockRouterReplace, }), })); @@ -25,11 +30,81 @@ vi.mock("@/components/public_model_hub", () => ({ default: () =>
Public Model Hub
, })); +vi.mock("@/app/(dashboard)/hooks/uiSettings/useUISettings", () => ({ + useUISettings: mockUseUISettings, +})); + +vi.mock("@/utils/cookieUtils", () => ({ + getCookie: mockGetCookie, +})); + +vi.mock("@/utils/jwtUtils", () => ({ + checkTokenValidity: mockCheckTokenValidity, +})); + describe("ModelHubTable", () => { afterEach(() => { vi.clearAllMocks(); }); + // Reusable helper function to setup mocks for auth redirect tests + const setupAuthRedirectTest = ( + requireAuth: boolean, + tokenValue: string | null, + isTokenValid: boolean + ) => { + mockUseUISettings.mockReturnValue({ + data: { + values: { + require_auth_for_public_ai_hub: requireAuth, + }, + }, + isLoading: false, + }); + mockGetCookie.mockReturnValue(tokenValue); + mockCheckTokenValidity.mockReturnValue(isTokenValid); + mockRouterReplace.mockClear(); + + // Setup other required mocks + vi.mocked(networking.getUiConfig).mockResolvedValue({ + server_root_path: "/", + proxy_base_url: "http://localhost:4000", + auto_redirect_to_sso: false, + admin_ui_disabled: false, + }); + vi.mocked(networking.modelHubPublicModelsCall).mockResolvedValue([]); + vi.mocked(networking.getUiSettings).mockResolvedValue({ + values: { + require_auth_for_public_ai_hub: requireAuth, + }, + }); + }; + + // Reusable test function for auth redirect scenarios + const testAuthRedirect = ( + requireAuth: boolean, + tokenValue: string | null, + isTokenValid: boolean, + shouldRedirect: boolean, + description: string + ) => { + it(description, async () => { + setupAuthRedirectTest(requireAuth, tokenValue, isTokenValid); + + renderWithProviders( + + ); + + await waitFor(() => { + if (shouldRedirect) { + expect(mockRouterReplace).toHaveBeenCalledWith("http://localhost:4000/ui/login"); + } else { + expect(mockRouterReplace).not.toHaveBeenCalled(); + } + }); + }); + }; + it("should render", async () => { vi.mocked(networking.modelHubCall).mockResolvedValue({ data: [], @@ -44,6 +119,10 @@ describe("ModelHubTable", () => { vi.mocked(networking.getUiSettings).mockResolvedValue({ values: {}, }); + mockUseUISettings.mockReturnValue({ + data: { values: {} }, + isLoading: false, + }); renderWithProviders(); @@ -66,6 +145,10 @@ describe("ModelHubTable", () => { vi.mocked(networking.getUiSettings).mockResolvedValue({ values: {}, }); + mockUseUISettings.mockReturnValue({ + data: { values: {} }, + isLoading: false, + }); renderWithProviders(); @@ -79,4 +162,56 @@ describe("ModelHubTable", () => { expect(getUiConfigCallOrder).toBeLessThan(modelHubPublicModelsCallOrder); }); + + describe("authentication redirect behavior", () => { + // Test cases where requireAuth is true - should redirect on invalid tokens + testAuthRedirect( + true, + null, + false, + true, + "should redirect to login when requireAuth is true and there is no token" + ); + + testAuthRedirect( + true, + "expired-token", + false, + true, + "should redirect to login when requireAuth is true and token is expired" + ); + + testAuthRedirect( + true, + "malformed-token", + false, + true, + "should redirect to login when requireAuth is true and token is malformed" + ); + + // Test cases where requireAuth is false - should NOT redirect regardless of token state + testAuthRedirect( + false, + null, + false, + false, + "should not redirect when requireAuth is false and there is no token" + ); + + testAuthRedirect( + false, + "expired-token", + false, + false, + "should not redirect when requireAuth is false and token is expired" + ); + + testAuthRedirect( + false, + "malformed-token", + false, + false, + "should not redirect when requireAuth is false and token is malformed" + ); + }); }); From fa86f1a10afe83172fc611011b4add18cc6018ba Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 4 Feb 2026 20:14:01 -0800 Subject: [PATCH 011/300] Fix input and output label --- .../src/components/model_info_view.test.tsx | 561 +++++++++++++----- .../src/components/model_info_view.tsx | 12 +- 2 files changed, 417 insertions(+), 156 deletions(-) diff --git a/ui/litellm-dashboard/src/components/model_info_view.test.tsx b/ui/litellm-dashboard/src/components/model_info_view.test.tsx index 4b9f7d217dc..7158c452d94 100644 --- a/ui/litellm-dashboard/src/components/model_info_view.test.tsx +++ b/ui/litellm-dashboard/src/components/model_info_view.test.tsx @@ -1,59 +1,36 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { render, waitFor } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import React, { ReactNode } from "react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import ModelInfoView from "./model_info_view"; +import NotificationsManager from "./molecules/notifications_manager"; +import * as networking from "./networking"; vi.mock("../../utils/dataUtils", () => ({ copyToClipboard: vi.fn().mockResolvedValue(true), })); -vi.mock("./networking", () => ({ - modelInfoV1Call: vi.fn().mockResolvedValue({ - data: [ - { - model_name: "GPT-4", - litellm_params: { - model: "gpt-4", - api_base: "https://api.openai.com/v1", - custom_llm_provider: "openai", - }, - model_info: { - id: "123", - created_by: "123", - db_model: true, - input_cost_per_token: 0.00003, - output_cost_per_token: 0.00006, - }, - }, - ], - }), - credentialGetCall: vi.fn().mockResolvedValue({ - credential_name: "test-credential", - credential_values: {}, - credential_info: {}, - }), - getGuardrailsList: vi.fn().mockResolvedValue({ - guardrails: [{ guardrail_name: "content_filter" }, { guardrail_name: "toxicity_filter" }], - }), - tagListCall: vi.fn().mockResolvedValue({ - test_tag: { - name: "test_tag", - description: "A test tag", - }, - production_tag: { - name: "production_tag", - description: "Production ready models", - }, - }), - testConnectionRequest: vi.fn().mockResolvedValue({ - status: "success", - }), - modelPatchUpdateCall: vi.fn().mockResolvedValue({}), - modelDeleteCall: vi.fn().mockResolvedValue({}), +vi.mock("./molecules/notifications_manager", () => ({ + default: { + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + fromBackend: vi.fn(), + }, +})); + +vi.mock("./networking", () => ({ + modelInfoV1Call: vi.fn(), + credentialGetCall: vi.fn(), + getGuardrailsList: vi.fn(), + tagListCall: vi.fn(), + testConnectionRequest: vi.fn(), + modelPatchUpdateCall: vi.fn(), + modelDeleteCall: vi.fn(), + credentialCreateCall: vi.fn(), })); -// Mock the useModelsInfo hook since it uses React Query const mockUseModelsInfo = vi.fn(); const mockUseModelHub = vi.fn(); @@ -62,12 +39,21 @@ vi.mock("@/app/(dashboard)/hooks/models/useModels", () => ({ useModelHub: (...args: any[]) => mockUseModelHub(...args), })); -// Mock the useModelCostMap hook const mockUseModelCostMap = vi.fn(); vi.mock("@/app/(dashboard)/hooks/models/useModelCostMap", () => ({ useModelCostMap: (...args: any[]) => mockUseModelCostMap(...args), })); +const mockNotificationsManager = vi.mocked(NotificationsManager); +const mockModelInfoV1Call = vi.mocked(networking.modelInfoV1Call); +const mockCredentialGetCall = vi.mocked(networking.credentialGetCall); +const mockGetGuardrailsList = vi.mocked(networking.getGuardrailsList); +const mockTagListCall = vi.mocked(networking.tagListCall); +const mockTestConnectionRequest = vi.mocked(networking.testConnectionRequest); +const mockModelPatchUpdateCall = vi.mocked(networking.modelPatchUpdateCall); +const mockModelDeleteCall = vi.mocked(networking.modelDeleteCall); +const mockCredentialCreateCall = vi.mocked(networking.credentialCreateCall); + describe("ModelInfoView", () => { let queryClient: QueryClient; @@ -88,6 +74,16 @@ describe("ModelInfoView", () => { }, }; + const DEFAULT_ADMIN_PROPS = { + modelId: "123", + onClose: vi.fn(), + accessToken: "test-token", + userID: "123", + userRole: "Admin", + onModelUpdate: vi.fn(), + modelAccessGroups: ["group1", "group2"], + }; + beforeEach(() => { queryClient = new QueryClient({ defaultOptions: { @@ -98,7 +94,6 @@ describe("ModelInfoView", () => { }); vi.clearAllMocks(); - // Set up default mocks mockUseModelsInfo.mockReturnValue({ data: { data: [defaultModelData], @@ -120,89 +115,170 @@ describe("ModelInfoView", () => { isLoading: false, error: null, }); + + mockModelInfoV1Call.mockResolvedValue({ + data: [defaultModelData], + }); + + mockCredentialGetCall.mockResolvedValue({ + credential_name: "test-credential", + credential_values: {}, + credential_info: {}, + }); + + mockGetGuardrailsList.mockResolvedValue({ + guardrails: [{ guardrail_name: "content_filter" }, { guardrail_name: "toxicity_filter" }], + }); + + mockTagListCall.mockResolvedValue({ + test_tag: { + name: "test_tag", + description: "A test tag", + models: [], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }, + production_tag: { + name: "production_tag", + description: "Production ready models", + models: [], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }, + }); + + mockTestConnectionRequest.mockResolvedValue({ + status: "success", + }); + + mockModelPatchUpdateCall.mockResolvedValue({}); + mockModelDeleteCall.mockResolvedValue({}); + mockCredentialCreateCall.mockResolvedValue({}); }); const wrapper = ({ children }: { children: ReactNode }) => React.createElement(QueryClientProvider, { client: queryClient }, children); - const DEFAULT_ADMIN_PROPS = { - modelId: "123", - onClose: () => {}, - accessToken: "123", - userID: "123", - userRole: "Admin", - onModelUpdate: () => {}, - modelAccessGroups: [], - }; - - describe("Edit Model", () => { - it("should render the model info view", async () => { - const { getByText } = render(, { wrapper }); - await waitFor(() => { - expect(getByText("Model Settings")).toBeInTheDocument(); - }); - }); - - it("should not render an edit settings button if the model is not a DB model", async () => { - const nonDbModelData = { - ...defaultModelData, - model_info: { - ...defaultModelData.model_info, - db_model: false, - }, - }; - - mockUseModelsInfo.mockReturnValue({ - data: { - data: [nonDbModelData], - }, - isLoading: false, - error: null, - }); - - const { queryByText } = render(, { wrapper }); - await waitFor(() => { - expect(queryByText("Edit Settings")).not.toBeInTheDocument(); - }); - }); - - it("should render tags in the edit model", async () => { - const { getByText } = render(, { wrapper }); - await waitFor(() => { - expect(getByText("Tags")).toBeInTheDocument(); - }); - }); - - it("should render the litellm params in the edit model", async () => { - const { getByText } = render(, { wrapper }); - await waitFor(() => { - expect(getByText("LiteLLM Params")).toBeInTheDocument(); - }); - }); - }); - - it("should render a test connection button", async () => { - const { getByTestId } = render(, { wrapper }); + it("should render", async () => { + render(, { wrapper }); await waitFor(() => { - expect(getByTestId("test-connection-button")).toBeInTheDocument(); + expect(screen.getByText("Model Settings")).toBeInTheDocument(); }); }); - it("should render a reuse credentials button", async () => { - const { getByTestId } = render(, { wrapper }); + it("should display loading state when model data is loading", () => { + mockUseModelsInfo.mockReturnValue({ + data: null, + isLoading: true, + error: null, + }); + + render(, { wrapper }); + expect(screen.getByText("Loading...")).toBeInTheDocument(); + }); + + it("should display not found message when model data is not available", async () => { + mockUseModelsInfo.mockReturnValue({ + data: { + data: [], + }, + isLoading: false, + error: null, + }); + + render(, { wrapper }); await waitFor(() => { - expect(getByTestId("reuse-credentials-button")).toBeInTheDocument(); + expect(screen.getByText("Model not found")).toBeInTheDocument(); }); }); - it("should render a delete model button", async () => { - const { getByTestId } = render(, { wrapper }); + it("should display model name in the header", async () => { + render(, { wrapper }); await waitFor(() => { - expect(getByTestId("delete-model-button")).toBeInTheDocument(); + expect(screen.getByText(/Public Model Name:/)).toBeInTheDocument(); }); }); - it("should render a disabled delete model button if the model is not a DB model", async () => { + it("should display back button that calls onClose when clicked", async () => { + const mockOnClose = vi.fn(); + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByText("Model Settings")).toBeInTheDocument(); + }); + + const backButton = screen.getByRole("button", { name: /back to models/i }); + await user.click(backButton); + + expect(mockOnClose).toHaveBeenCalledTimes(1); + }); + + it("should display test connection button", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("button", { name: /test connection/i })).toBeInTheDocument(); + }); + }); + + it("should test connection when test connection button is clicked", async () => { + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByText("Model Settings")).toBeInTheDocument(); + }); + + const testButton = screen.getByRole("button", { name: /test connection/i }); + await user.click(testButton); + + await waitFor(() => { + expect(mockTestConnectionRequest).toHaveBeenCalled(); + expect(mockNotificationsManager.success).toHaveBeenCalledWith("Connection test successful!"); + }); + }); + + it("should display error notification when connection test fails", async () => { + const user = userEvent.setup(); + mockTestConnectionRequest.mockRejectedValue(new Error("Connection failed")); + + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByText("Model Settings")).toBeInTheDocument(); + }); + + const testButton = screen.getByRole("button", { name: /test connection/i }); + await user.click(testButton); + + await waitFor(() => { + expect(mockNotificationsManager.error).toHaveBeenCalled(); + }); + }); + + it("should display reuse credentials button for admin users", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("button", { name: /re-use credentials/i })).toBeInTheDocument(); + }); + }); + + it("should disable reuse credentials button for non-admin users", async () => { + render(, { wrapper }); + await waitFor(() => { + const button = screen.getByRole("button", { name: /re-use credentials/i }); + expect(button).toBeDisabled(); + }); + }); + + it("should display delete model button", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("button", { name: /delete model/i })).toBeInTheDocument(); + }); + }); + + it("should disable delete button when model is not a DB model", async () => { const nonDbModelData = { ...defaultModelData, model_info: { @@ -219,13 +295,14 @@ describe("ModelInfoView", () => { error: null, }); - const { getByTestId } = render(, { wrapper }); + render(, { wrapper }); await waitFor(() => { - expect(getByTestId("delete-model-button")).toBeDisabled(); + const deleteButton = screen.getByRole("button", { name: /delete model/i }); + expect(deleteButton).toBeDisabled(); }); }); - it("should render a disabled delete model button if the user is not an admin and model is not created by the user", async () => { + it("should disable delete button when user is not admin and did not create the model", async () => { const nonCreatedByUserModelData = { ...defaultModelData, model_info: { @@ -242,18 +319,177 @@ describe("ModelInfoView", () => { error: null, }); - const NON_CREATED_BY_USER_ADMIN_PROPS = { - ...DEFAULT_ADMIN_PROPS, - userRole: "User", - }; - - const { getByTestId } = render(, { wrapper }); + render(, { wrapper }); await waitFor(() => { - expect(getByTestId("delete-model-button")).toBeDisabled(); + const deleteButton = screen.getByRole("button", { name: /delete model/i }); + expect(deleteButton).toBeDisabled(); }); }); - it("should render health check model field for wildcard routes", async () => { + it("should display overview and raw JSON tabs", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /overview/i })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /raw json/i })).toBeInTheDocument(); + }); + }); + + it("should display model information in overview tab", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText("Provider")).toBeInTheDocument(); + expect(screen.getByText("LiteLLM Model")).toBeInTheDocument(); + expect(screen.getByText("Pricing")).toBeInTheDocument(); + }); + }); + + it("should display edit settings button when user can edit model", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + }); + + it("should not display edit settings button when model is not a DB model", async () => { + const nonDbModelData = { + ...defaultModelData, + model_info: { + ...defaultModelData.model_info, + db_model: false, + }, + }; + + mockUseModelsInfo.mockReturnValue({ + data: { + data: [nonDbModelData], + }, + isLoading: false, + error: null, + }); + + render(, { wrapper }); + await waitFor(() => { + expect(screen.queryByRole("button", { name: /edit settings/i })).not.toBeInTheDocument(); + }); + }); + + it("should enter edit mode when edit settings button is clicked", async () => { + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + + const editButton = screen.getByRole("button", { name: /edit settings/i }); + await user.click(editButton); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /save changes/i })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument(); + }); + }); + + it("should display form fields in edit mode", async () => { + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + + const editButton = screen.getByRole("button", { name: /edit settings/i }); + await user.click(editButton); + + await waitFor(() => { + expect(screen.getByPlaceholderText("Enter model name")).toBeInTheDocument(); + expect(screen.getByPlaceholderText("Enter LiteLLM model name")).toBeInTheDocument(); + }); + }); + + it("should allow editing model name in edit mode", async () => { + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + + const editButton = screen.getByRole("button", { name: /edit settings/i }); + await user.click(editButton); + + const modelNameInput = await screen.findByPlaceholderText("Enter model name"); + await user.clear(modelNameInput); + await user.type(modelNameInput, "Updated Model Name"); + + expect(modelNameInput).toHaveValue("Updated Model Name"); + }); + + it("should cancel editing when cancel button is clicked", async () => { + const user = userEvent.setup(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + + const editButton = screen.getByRole("button", { name: /edit settings/i }); + await user.click(editButton); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument(); + }); + + const cancelButton = screen.getByRole("button", { name: /cancel/i }); + await user.click(cancelButton); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: /save changes/i })).not.toBeInTheDocument(); + }); + }); + + it("should save model changes when save button is clicked", async () => { + const user = userEvent.setup(); + const mockOnModelUpdate = vi.fn(); + render(, { wrapper }); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit settings/i })).toBeInTheDocument(); + }); + + const editButton = screen.getByRole("button", { name: /edit settings/i }); + await user.click(editButton); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /save changes/i })).toBeInTheDocument(); + }); + + const saveButton = screen.getByRole("button", { name: /save changes/i }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockModelPatchUpdateCall).toHaveBeenCalled(); + expect(mockNotificationsManager.success).toHaveBeenCalledWith("Model settings updated successfully"); + expect(mockOnModelUpdate).toHaveBeenCalled(); + }); + }); + + it("should display tags section", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText("Tags")).toBeInTheDocument(); + }); + }); + + it("should display LiteLLM Params section", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText("LiteLLM Params")).toBeInTheDocument(); + }); + }); + + it("should display health check model field for wildcard models", async () => { const wildcardModelData = { ...defaultModelData, litellm_params: { @@ -270,38 +506,71 @@ describe("ModelInfoView", () => { error: null, }); - const { getByText } = render(, { wrapper }); + render(, { wrapper }); await waitFor(() => { - expect(getByText("Model Settings")).toBeInTheDocument(); - }); - await waitFor(() => { - expect(getByText("Health Check Model")).toBeInTheDocument(); + expect(screen.getByText("Health Check Model")).toBeInTheDocument(); }); }); - it("should not render health check model field for non-wildcard routes", async () => { - const { queryByText } = render(, { wrapper }); + it("should not display health check model field for non-wildcard models", async () => { + render(, { wrapper }); await waitFor(() => { - expect(queryByText("Model Settings")).toBeInTheDocument(); - }); - await waitFor(() => { - expect(queryByText("Health Check Model")).not.toBeInTheDocument(); + expect(screen.getByText("Model Settings")).toBeInTheDocument(); + expect(screen.queryByText("Health Check Model")).not.toBeInTheDocument(); }); }); - describe("View Model", () => { - it("should render the model info view", async () => { - const { getByText } = render(, { wrapper }); - await waitFor(() => { - expect(getByText("Model Settings")).toBeInTheDocument(); - }); + it("should display edit auto router button for auto router models", async () => { + const autoRouterModelData = { + ...defaultModelData, + litellm_params: { + ...defaultModelData.litellm_params, + auto_router_config: {}, + }, + }; + + mockUseModelsInfo.mockReturnValue({ + data: { + data: [autoRouterModelData], + }, + isLoading: false, + error: null, }); - it("should render tags in the view model", async () => { - const { getByText } = render(, { wrapper }); - await waitFor(() => { - expect(getByText("Tags")).toBeInTheDocument(); - }); + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByRole("button", { name: /edit auto router/i })).toBeInTheDocument(); + }); + }); + + + it("should display model access groups field", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText("Model Access Groups")).toBeInTheDocument(); + }); + }); + + it("should display guardrails field", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText("Guardrails")).toBeInTheDocument(); + }); + }); + + it("should display pricing information", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText(/Input:/)).toBeInTheDocument(); + expect(screen.getByText(/Output:/)).toBeInTheDocument(); + }); + }); + + it("should display created at and created by information", async () => { + render(, { wrapper }); + await waitFor(() => { + expect(screen.getByText(/Created At/)).toBeInTheDocument(); + expect(screen.getByText(/Created By/)).toBeInTheDocument(); }); }); }); diff --git a/ui/litellm-dashboard/src/components/model_info_view.tsx b/ui/litellm-dashboard/src/components/model_info_view.tsx index a55149124c9..e2fc8caa21c 100644 --- a/ui/litellm-dashboard/src/components/model_info_view.tsx +++ b/ui/litellm-dashboard/src/components/model_info_view.tsx @@ -136,11 +136,9 @@ export default function ModelInfoView({ useEffect(() => { const getExistingCredential = async () => { - console.log("accessToken, ", accessToken); if (!accessToken) return; if (usingExistingCredential) return; let existingCredentialResponse = await credentialGetCall(accessToken, null, modelId); - console.log("existingCredentialResponse, ", existingCredentialResponse); setExistingCredential({ credential_name: existingCredentialResponse["credential_name"], credential_values: existingCredentialResponse["credential_values"], @@ -153,7 +151,6 @@ export default function ModelInfoView({ // Only fetch if we don't have modelData yet if (modelData) return; let modelInfoResponse = await modelInfoV1Call(accessToken, modelId); - console.log("modelInfoResponse, ", modelInfoResponse); let specificModelData = modelInfoResponse.data[0]; if (specificModelData && !specificModelData.litellm_model_name) { specificModelData = { @@ -201,7 +198,6 @@ export default function ModelInfoView({ }, [accessToken, modelId]); const handleReuseCredential = async (values: any) => { - console.log("values, ", values); if (!accessToken) return; let credentialItem = { credential_name: values.credential_name, @@ -212,7 +208,6 @@ export default function ModelInfoView({ }; NotificationsManager.info("Storing credential.."); let credentialResponse = await credentialCreateCall(accessToken, credentialItem); - console.log("credentialResponse, ", credentialResponse); NotificationsManager.success("Credential stored successfully"); }; @@ -221,8 +216,6 @@ export default function ModelInfoView({ if (!accessToken) return; setIsSaving(true); - console.log("values.model_name, ", values.model_name); - // Parse LiteLLM extra params from JSON text area let parsedExtraParams: Record = {}; try { @@ -412,7 +405,6 @@ export default function ModelInfoView({ } }; const isWildcardModel = modelData.litellm_model_name.includes("*"); - console.log("isWildcardModel, ", isWildcardModel); return (
@@ -657,7 +649,7 @@ export default function ModelInfoView({ ? (localModelData.litellm_params?.input_cost_per_token * 1_000_000).toFixed(4) : localModelData?.model_info?.input_cost_per_token ? (localModelData.model_info.input_cost_per_token * 1_000_000).toFixed(4) - : null} + : "Not Set"}
)} @@ -674,7 +666,7 @@ export default function ModelInfoView({ ? (localModelData.litellm_params.output_cost_per_token * 1_000_000).toFixed(4) : localModelData?.model_info?.output_cost_per_token ? (localModelData.model_info.output_cost_per_token * 1_000_000).toFixed(4) - : null} + : "Not Set"} )} From 666feef2a97d30b14b2ac4e1d7bc13614f5aff38 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:27:41 +0530 Subject: [PATCH 012/300] Add chat completion support for websearch --- .../websearch_interception/handler.py | 265 +++++++++++++++++- 1 file changed, 258 insertions(+), 7 deletions(-) diff --git a/litellm/integrations/websearch_interception/handler.py b/litellm/integrations/websearch_interception/handler.py index 5d36b760afb..1e109dc9e39 100644 --- a/litellm/integrations/websearch_interception/handler.py +++ b/litellm/integrations/websearch_interception/handler.py @@ -48,7 +48,8 @@ class WebSearchInterceptionLogger(CustomLogger): Args: enabled_providers: List of LLM providers to enable interception for. Use LlmProviders enum values (e.g., [LlmProviders.BEDROCK]) - Default: [LlmProviders.BEDROCK] + If None or empty list, enables for ALL providers. + Default: None (all providers enabled) search_tool_name: Name of search tool configured in router's search_tools. If None, will attempt to use first available search tool. """ @@ -183,10 +184,10 @@ class WebSearchInterceptionLogger(CustomLogger): verbose_logger.debug( f"WebSearchInterception: Pre-request hook called" f" - custom_llm_provider={custom_llm_provider}" - f" - enabled_providers={self.enabled_providers}" + f" - enabled_providers={self.enabled_providers or 'ALL'}" ) - if custom_llm_provider not in self.enabled_providers: + if self.enabled_providers is not None and custom_llm_provider not in self.enabled_providers: verbose_logger.debug( f"WebSearchInterception: Skipping - provider {custom_llm_provider} not in {self.enabled_providers}" ) @@ -245,7 +246,12 @@ class WebSearchInterceptionLogger(CustomLogger): custom_llm_provider: str, kwargs: Dict, ) -> Tuple[bool, Dict]: - """Check if WebSearch tool interception is needed""" + """ + Check if WebSearch tool interception is needed for Anthropic Messages API. + + This is the legacy method for Anthropic-style responses. + For chat completions, use async_should_run_chat_completion_agentic_loop instead. + """ verbose_logger.debug(f"WebSearchInterception: Hook called! provider={custom_llm_provider}, stream={stream}") verbose_logger.debug(f"WebSearchInterception: Response type: {type(response)}") @@ -253,7 +259,7 @@ class WebSearchInterceptionLogger(CustomLogger): # Check if provider should be intercepted # Note: custom_llm_provider is already normalized by get_llm_provider() # (e.g., "bedrock/invoke/..." -> "bedrock") - if custom_llm_provider not in self.enabled_providers: + if self.enabled_providers is not None and custom_llm_provider not in self.enabled_providers: verbose_logger.debug( f"WebSearchInterception: Skipping provider {custom_llm_provider} (not in enabled list: {self.enabled_providers})" ) @@ -267,10 +273,11 @@ class WebSearchInterceptionLogger(CustomLogger): ) return False, {} - # Detect WebSearch tool_use in response + # Detect WebSearch tool_use in response (Anthropic format) should_intercept, tool_calls = WebSearchTransformation.transform_request( response=response, stream=stream, + response_format="anthropic", ) if not should_intercept: @@ -288,6 +295,67 @@ class WebSearchInterceptionLogger(CustomLogger): "tool_calls": tool_calls, "tool_type": "websearch", "provider": custom_llm_provider, + "response_format": "anthropic", + } + return True, tools_dict + + async def async_should_run_chat_completion_agentic_loop( + self, + response: Any, + model: str, + messages: List[Dict], + tools: Optional[List[Dict]], + stream: bool, + custom_llm_provider: str, + kwargs: Dict, + ) -> Tuple[bool, Dict]: + """ + Check if WebSearch tool interception is needed for Chat Completions API. + + Similar to async_should_run_agentic_loop but for OpenAI-style chat completions. + """ + + verbose_logger.debug(f"WebSearchInterception: Chat completion hook called! provider={custom_llm_provider}, stream={stream}") + verbose_logger.debug(f"WebSearchInterception: Response type: {type(response)}") + + # Check if provider should be intercepted + if self.enabled_providers is not None and custom_llm_provider not in self.enabled_providers: + verbose_logger.debug( + f"WebSearchInterception: Skipping provider {custom_llm_provider} (not in enabled list: {self.enabled_providers})" + ) + return False, {} + + # Check if tools include any web search tool + has_websearch_tool = any(is_web_search_tool(t) for t in (tools or [])) + if not has_websearch_tool: + verbose_logger.debug( + "WebSearchInterception: No web search tool in request" + ) + return False, {} + + # Detect WebSearch tool_calls in response (OpenAI format) + should_intercept, tool_calls = WebSearchTransformation.transform_request( + response=response, + stream=stream, + response_format="openai", + ) + + if not should_intercept: + verbose_logger.debug( + "WebSearchInterception: No WebSearch tool_calls detected in response" + ) + return False, {} + + verbose_logger.debug( + f"WebSearchInterception: Detected {len(tool_calls)} WebSearch tool call(s), executing agentic loop" + ) + + # Return tools dict with tool calls + tools_dict = { + "tool_calls": tool_calls, + "tool_type": "websearch", + "provider": custom_llm_provider, + "response_format": "openai", } return True, tools_dict @@ -303,7 +371,11 @@ class WebSearchInterceptionLogger(CustomLogger): stream: bool, kwargs: Dict, ) -> Any: - """Execute agentic loop with WebSearch execution""" + """ + Execute agentic loop with WebSearch execution for Anthropic Messages API. + + This is the legacy method for Anthropic-style responses. + """ tool_calls = tools["tool_calls"] @@ -321,6 +393,41 @@ class WebSearchInterceptionLogger(CustomLogger): kwargs=kwargs, ) + async def async_run_chat_completion_agentic_loop( + self, + tools: Dict, + model: str, + messages: List[Dict], + response: Any, + optional_params: Dict, + logging_obj: Any, + stream: bool, + kwargs: Dict, + ) -> Any: + """ + Execute agentic loop with WebSearch execution for Chat Completions API. + + Similar to async_run_agentic_loop but for OpenAI-style chat completions. + """ + + tool_calls = tools["tool_calls"] + response_format = tools.get("response_format", "openai") + + verbose_logger.debug( + f"WebSearchInterception: Executing chat completion agentic loop for {len(tool_calls)} search(es)" + ) + + return await self._execute_chat_completion_agentic_loop( + model=model, + messages=messages, + tool_calls=tool_calls, + optional_params=optional_params, + logging_obj=logging_obj, + stream=stream, + kwargs=kwargs, + response_format=response_format, + ) + async def _execute_agentic_loop( self, model: str, @@ -521,6 +628,150 @@ class WebSearchInterceptionLogger(CustomLogger): ) raise + async def _execute_chat_completion_agentic_loop( + self, + model: str, + messages: List[Dict], + tool_calls: List[Dict], + optional_params: Dict, + logging_obj: Any, + stream: bool, + kwargs: Dict, + response_format: str = "openai", + ) -> Any: + """Execute litellm.search() and make follow-up chat completion request""" + + # Extract search queries from tool_calls + search_tasks = [] + for tool_call in tool_calls: + # Handle both Anthropic-style input and OpenAI-style function.arguments + query = None + if "input" in tool_call and isinstance(tool_call["input"], dict): + query = tool_call["input"].get("query") + elif "function" in tool_call: + func = tool_call["function"] + if isinstance(func, dict): + args = func.get("arguments", {}) + if isinstance(args, dict): + query = args.get("query") + + if query: + verbose_logger.debug( + f"WebSearchInterception: Queuing search for query='{query}'" + ) + search_tasks.append(self._execute_search(query)) + else: + verbose_logger.warning( + f"WebSearchInterception: Tool call {tool_call.get('id')} has no query" + ) + # Add empty result for tools without query + search_tasks.append(self._create_empty_search_result()) + + # Execute searches in parallel + verbose_logger.debug( + f"WebSearchInterception: Executing {len(search_tasks)} search(es) in parallel" + ) + search_results = await asyncio.gather(*search_tasks, return_exceptions=True) + + # Handle any exceptions in search results + final_search_results: List[str] = [] + for i, result in enumerate(search_results): + if isinstance(result, Exception): + verbose_logger.error( + f"WebSearchInterception: Search {i} failed with error: {str(result)}" + ) + final_search_results.append( + f"Search failed: {str(result)}" + ) + elif isinstance(result, str): + final_search_results.append(cast(str, result)) + else: + verbose_logger.warning( + f"WebSearchInterception: Unexpected result type {type(result)} at index {i}" + ) + final_search_results.append(str(result)) + + # Build assistant and tool messages using transformation + assistant_message, tool_messages_or_user = WebSearchTransformation.transform_response( + tool_calls=tool_calls, + search_results=final_search_results, + response_format=response_format, + ) + + # Make follow-up request with search results + # For OpenAI format, tool_messages_or_user is a list of tool messages + if response_format == "openai": + follow_up_messages = messages + [assistant_message] + tool_messages_or_user + else: + # For Anthropic format (shouldn't happen in this method, but handle it) + follow_up_messages = messages + [assistant_message, tool_messages_or_user] + + verbose_logger.debug( + "WebSearchInterception: Making follow-up chat completion request with search results" + ) + verbose_logger.debug( + f"WebSearchInterception: Follow-up messages count: {len(follow_up_messages)}" + ) + + # Use litellm.acompletion for follow-up request + try: + # Remove internal parameters that shouldn't be passed to follow-up request + internal_params = { + '_websearch_interception', + 'acompletion', + 'litellm_logging_obj', + 'custom_llm_provider', + 'model_alias_map', + 'stream_response', + 'custom_prompt_dict', + } + kwargs_for_followup = { + k: v for k, v in kwargs.items() + if not k.startswith('_websearch_interception') and k not in internal_params + } + + # Get full model name from kwargs + full_model_name = model + if "custom_llm_provider" in kwargs: + custom_llm_provider = kwargs["custom_llm_provider"] + # Reconstruct full model name with provider prefix if needed + if not model.startswith(custom_llm_provider): + # Check if model already has a provider prefix + if "/" not in model: + full_model_name = f"{custom_llm_provider}/{model}" + + verbose_logger.debug( + f"WebSearchInterception: Using model name: {full_model_name}" + ) + + # Prepare tools for follow-up request (same as original) + tools_param = optional_params.get("tools") + + # Remove tools and extra_body from optional_params to avoid issues + # extra_body often contains internal LiteLLM params that shouldn't be forwarded + optional_params_clean = { + k: v for k, v in optional_params.items() + if k not in {"tools", "extra_body", "model_alias_map","stream_response", "custom_prompt_dict" } + } + + final_response = await litellm.acompletion( + model=full_model_name, + messages=follow_up_messages, + tools=tools_param, + **optional_params_clean, + **kwargs_for_followup, + ) + + verbose_logger.debug( + f"WebSearchInterception: Follow-up request completed, response type: {type(final_response)}" + ) + return final_response + except Exception as e: + verbose_logger.exception( + f"WebSearchInterception: Follow-up request failed: {str(e)}" + ) + raise + async def _create_empty_search_result(self) -> str: """Create an empty search result for tool calls without queries""" return "No search query provided" From ea4e48e13a6d7b6a21d087e836201a52c55f2d72 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:28:06 +0530 Subject: [PATCH 013/300] Add chat completion tool calls support and response transformation --- .../websearch_interception/transformation.py | 185 ++++++++++++++++-- 1 file changed, 171 insertions(+), 14 deletions(-) diff --git a/litellm/integrations/websearch_interception/transformation.py b/litellm/integrations/websearch_interception/transformation.py index 313358822a5..0884d408c84 100644 --- a/litellm/integrations/websearch_interception/transformation.py +++ b/litellm/integrations/websearch_interception/transformation.py @@ -1,7 +1,7 @@ """ WebSearch Tool Transformation -Transforms between Anthropic tool_use format and LiteLLM search format. +Transforms between Anthropic/OpenAI tool_use format and LiteLLM search format. """ from typing import Any, Dict, List, Tuple @@ -17,28 +17,31 @@ class WebSearchTransformation: Handles transformation between: - Anthropic tool_use format → LiteLLM search requests - - LiteLLM SearchResponse → Anthropic tool_result format + - OpenAI tool_calls format → LiteLLM search requests + - LiteLLM SearchResponse → Anthropic/OpenAI tool_result format """ @staticmethod def transform_request( response: Any, stream: bool, + response_format: str = "anthropic", ) -> Tuple[bool, List[Dict]]: """ - Transform Anthropic response to extract WebSearch tool calls. + Transform model response to extract WebSearch tool calls. - Detects if response contains WebSearch tool_use blocks and extracts + Detects if response contains WebSearch tool_use/tool_calls blocks and extracts the search queries for execution. Args: - response: Model response (dict or AnthropicMessagesResponse) + response: Model response (dict, AnthropicMessagesResponse, or ModelResponse) stream: Whether response is streaming + response_format: Response format - "anthropic" or "openai" (default: "anthropic") Returns: (has_websearch, tool_calls): has_websearch: True if WebSearch tool_use found - tool_calls: List of tool_use dicts with id, name, input + tool_calls: List of tool_use/tool_calls dicts with id, name, input/function Note: Streaming requests are handled by converting stream=True to stream=False @@ -54,8 +57,11 @@ class WebSearchTransformation: ) return False, [] - # Parse non-streaming response - return WebSearchTransformation._detect_from_non_streaming_response(response) + # Parse non-streaming response based on format + if response_format == "openai": + return WebSearchTransformation._detect_from_openai_response(response) + else: + return WebSearchTransformation._detect_from_non_streaming_response(response) @staticmethod def _detect_from_non_streaming_response( @@ -114,26 +120,143 @@ class WebSearchTransformation: return len(tool_calls) > 0, tool_calls + @staticmethod + def _detect_from_openai_response( + response: Any, + ) -> Tuple[bool, List[Dict]]: + """Parse OpenAI-style response for WebSearch tool_calls""" + + # Handle both dict and ModelResponse objects + if isinstance(response, dict): + choices = response.get("choices", []) + else: + if not hasattr(response, "choices"): + verbose_logger.debug( + "WebSearchInterception: Response has no choices attribute" + ) + return False, [] + choices = response.choices or [] + + if not choices: + verbose_logger.debug( + "WebSearchInterception: Response has empty choices" + ) + return False, [] + + # Get first choice's message + first_choice = choices[0] + if isinstance(first_choice, dict): + message = first_choice.get("message", {}) + else: + message = getattr(first_choice, "message", None) + + if not message: + verbose_logger.debug( + "WebSearchInterception: First choice has no message" + ) + return False, [] + + # Get tool_calls from message + if isinstance(message, dict): + openai_tool_calls = message.get("tool_calls", []) + else: + openai_tool_calls = getattr(message, "tool_calls", None) or [] + + if not openai_tool_calls: + verbose_logger.debug( + "WebSearchInterception: Message has no tool_calls" + ) + return False, [] + + # Find all WebSearch tool calls + tool_calls = [] + for tool_call in openai_tool_calls: + # Handle both dict and object tool calls + if isinstance(tool_call, dict): + tool_id = tool_call.get("id") + tool_type = tool_call.get("type") + function = tool_call.get("function", {}) + function_name = function.get("name") if isinstance(function, dict) else getattr(function, "name", None) + function_arguments = function.get("arguments") if isinstance(function, dict) else getattr(function, "arguments", None) + else: + tool_id = getattr(tool_call, "id", None) + tool_type = getattr(tool_call, "type", None) + function = getattr(tool_call, "function", None) + function_name = getattr(function, "name", None) if function else None + function_arguments = getattr(function, "arguments", None) if function else None + + # Check for LiteLLM standard or legacy web search tools + if tool_type == "function" and function_name in ( + LITELLM_WEB_SEARCH_TOOL_NAME, "WebSearch", "web_search" + ): + # Parse arguments (might be JSON string) + import json + if isinstance(function_arguments, str): + try: + arguments = json.loads(function_arguments) + except json.JSONDecodeError: + verbose_logger.warning( + f"WebSearchInterception: Failed to parse function arguments: {function_arguments}" + ) + arguments = {} + else: + arguments = function_arguments or {} + + # Convert to internal format (similar to Anthropic) + tool_call_dict = { + "id": tool_id, + "type": "function", + "name": function_name, + "function": { + "name": function_name, + "arguments": arguments, + }, + "input": arguments, # For compatibility with Anthropic format + } + tool_calls.append(tool_call_dict) + verbose_logger.debug( + f"WebSearchInterception: Found {function_name} tool_call with id={tool_id}" + ) + + return len(tool_calls) > 0, tool_calls + @staticmethod def transform_response( tool_calls: List[Dict], search_results: List[str], + response_format: str = "anthropic", ) -> Tuple[Dict, Dict]: """ - Transform LiteLLM search results to Anthropic tool_result format. + Transform LiteLLM search results to Anthropic/OpenAI tool_result format. - Builds the assistant and user messages needed for the agentic loop + Builds the assistant and user/tool messages needed for the agentic loop follow-up request. Args: - tool_calls: List of tool_use dicts from transform_request + tool_calls: List of tool_use/tool_calls dicts from transform_request search_results: List of search result strings (one per tool_call) + response_format: Response format - "anthropic" or "openai" (default: "anthropic") Returns: - (assistant_message, user_message): - assistant_message: Message with tool_use blocks - user_message: Message with tool_result blocks + (assistant_message, user_or_tool_messages): + For Anthropic: assistant_message with tool_use blocks, user_message with tool_result blocks + For OpenAI: assistant_message with tool_calls, tool_messages list with tool results """ + if response_format == "openai": + return WebSearchTransformation._transform_response_openai( + tool_calls, search_results + ) + else: + return WebSearchTransformation._transform_response_anthropic( + tool_calls, search_results + ) + + @staticmethod + def _transform_response_anthropic( + tool_calls: List[Dict], + search_results: List[str], + ) -> Tuple[Dict, Dict]: + """Transform to Anthropic format (single user message with tool_result blocks)""" # Build assistant message with tool_use blocks assistant_message = { "role": "assistant", @@ -163,6 +286,40 @@ class WebSearchTransformation: return assistant_message, user_message + @staticmethod + def _transform_response_openai( + tool_calls: List[Dict], + search_results: List[str], + ) -> Tuple[Dict, List[Dict]]: + """Transform to OpenAI format (assistant with tool_calls, separate tool messages)""" + # Build assistant message with tool_calls + assistant_message = { + "role": "assistant", + "tool_calls": [ + { + "id": tc["id"], + "type": "function", + "function": { + "name": tc["name"], + "arguments": str(tc["input"]), + }, + } + for tc in tool_calls + ], + } + + # Build separate tool messages (one per tool call) + tool_messages = [ + { + "role": "tool", + "tool_call_id": tool_calls[i]["id"], + "content": search_results[i], + } + for i in range(len(tool_calls)) + ] + + return assistant_message, tool_messages + @staticmethod def format_search_response(result: SearchResponse) -> str: """ From 245d705e6ca7ee9c8cda2dccb2d40256480726f2 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:28:28 +0530 Subject: [PATCH 014/300] Add new methods in chat completion --- litellm/integrations/custom_logger.py | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/litellm/integrations/custom_logger.py b/litellm/integrations/custom_logger.py index 07d237c4758..4a341863d4b 100644 --- a/litellm/integrations/custom_logger.py +++ b/litellm/integrations/custom_logger.py @@ -664,6 +664,37 @@ class CustomLogger: # https://docs.litellm.ai/docs/observability/custom_callbac return final_response """ pass + + async def async_should_run_chat_completion_agentic_loop( + self, + response: Any, + model: str, + messages: List[Dict], + tools: Optional[List[Dict]], + stream: bool, + custom_llm_provider: str, + kwargs: Dict, + ) -> Tuple[bool, Dict]: + """ + Hook to determine if chat completion agentic loop should be executed. + """ + return False, {} + + async def async_run_chat_completion_agentic_loop( + self, + tools: Dict, + model: str, + messages: List[Dict], + response: Any, + optional_params: Dict, + logging_obj: "LiteLLMLoggingObj", + stream: bool, + kwargs: Dict, + ) -> Any: + """ + Hook to execute chat completion agentic loop based on context from should_run hook. + """ + pass # Useful helpers for custom logger classes From 6207bf8f6856c185844c481aebe9f5eebb261801 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:28:43 +0530 Subject: [PATCH 015/300] Add chat completion tool format --- .../integrations/websearch_interception/tools.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/litellm/integrations/websearch_interception/tools.py b/litellm/integrations/websearch_interception/tools.py index 4f8b7372fe3..c92c66f41ee 100644 --- a/litellm/integrations/websearch_interception/tools.py +++ b/litellm/integrations/websearch_interception/tools.py @@ -55,6 +55,7 @@ def is_web_search_tool(tool: Dict[str, Any]) -> bool: Detects: - LiteLLM standard: name == "litellm_web_search" + - OpenAI format: type == "function" with function.name == "litellm_web_search" - Anthropic native: type starts with "web_search_" (e.g., "web_search_20250305") - Claude Code: name == "web_search" with a type field - Custom: name == "WebSearch" (legacy format) @@ -68,15 +69,25 @@ def is_web_search_tool(tool: Dict[str, Any]) -> bool: Example: >>> is_web_search_tool({"name": "litellm_web_search"}) True + >>> is_web_search_tool({"type": "function", "function": {"name": "litellm_web_search"}}) + True >>> is_web_search_tool({"type": "web_search_20250305", "name": "web_search"}) True >>> is_web_search_tool({"name": "calculator"}) False """ + print(f"🔥tool: {tool}") tool_name = tool.get("name", "") tool_type = tool.get("type", "") + + # Check for OpenAI format: {"type": "function", "function": {"name": "..."}} + if tool_type == "function" and "function" in tool: + function_def = tool.get("function", {}) + function_name = function_def.get("name", "") + if function_name == LITELLM_WEB_SEARCH_TOOL_NAME: + return True - # Check for LiteLLM standard tool + # Check for LiteLLM standard tool (Anthropic format) if tool_name == LITELLM_WEB_SEARCH_TOOL_NAME: return True From 88778a871dce4378f84e56fbae5b10e60476dd5e Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:29:21 +0530 Subject: [PATCH 016/300] Add callback for websearch in completion method --- litellm/llms/custom_httpx/llm_http_handler.py | 128 +++++++++++++++++- litellm/llms/openai/openai.py | 92 ++++++++++++- 2 files changed, 214 insertions(+), 6 deletions(-) diff --git a/litellm/llms/custom_httpx/llm_http_handler.py b/litellm/llms/custom_httpx/llm_http_handler.py index d2ea7e872a2..3907ff7abf7 100644 --- a/litellm/llms/custom_httpx/llm_http_handler.py +++ b/litellm/llms/custom_httpx/llm_http_handler.py @@ -302,7 +302,7 @@ class BaseLLMHTTPHandler: logging_obj=logging_obj, signed_json_body=signed_json_body, ) - return provider_config.transform_response( + initial_response = provider_config.transform_response( model=model, raw_response=response, model_response=model_response, @@ -316,6 +316,20 @@ class BaseLLMHTTPHandler: json_mode=json_mode, ) + # Call agentic chat completion hooks + final_response = await self._call_agentic_chat_completion_hooks( + response=initial_response, + model=model, + messages=messages, + optional_params=optional_params, + logging_obj=logging_obj, + stream=False, + custom_llm_provider=custom_llm_provider, + kwargs=litellm_params, + ) + + return final_response if final_response is not None else initial_response + def completion( self, model: str, @@ -412,6 +426,11 @@ class BaseLLMHTTPHandler: }, ) + # Check if stream was converted for WebSearch interception + # This is set by the async_pre_request_hook in WebSearchInterceptionLogger + if litellm_params.get("_websearch_interception_converted_stream", False): + logging_obj.model_call_details["websearch_interception_converted_stream"] = True + if acompletion is True: if stream is True: data = self._add_stream_param_to_request_body( @@ -419,7 +438,7 @@ class BaseLLMHTTPHandler: provider_config=provider_config, fake_stream=fake_stream, ) - return self.acompletion_stream_function( + response = self.acompletion_stream_function( model=model, messages=messages, api_base=api_base, @@ -4361,10 +4380,10 @@ class BaseLLMHTTPHandler: kwargs: Dict, ) -> Optional[Any]: """ - Call agentic completion hooks for all custom loggers. + Call agentic completion hooks for all custom loggers (Anthropic Messages API). - 1. Call async_should_run_agentic_completion to check if agentic loop is needed - 2. If yes, call async_run_agentic_completion to execute the loop + 1. Call async_should_run_agentic_loop to check if agentic loop is needed + 2. If yes, call async_run_agentic_loop to execute the loop Returns the response from agentic loop, or None if no hook runs. """ @@ -4453,6 +4472,105 @@ class BaseLLMHTTPHandler: return None + async def _call_agentic_chat_completion_hooks( + self, + response: Any, + model: str, + messages: List[Dict], + optional_params: Dict, + logging_obj: "LiteLLMLoggingObj", + stream: bool, + custom_llm_provider: str, + kwargs: Dict, + ) -> Optional[Any]: + """ + Call agentic chat completion hooks for all custom loggers (Chat Completions API). + + 1. Call async_should_run_chat_completion_agentic_loop to check if agentic loop is needed + 2. If yes, call async_run_chat_completion_agentic_loop to execute the loop + + Returns the response from agentic loop, or None if no hook runs. + """ + from litellm._logging import verbose_logger + from litellm.integrations.custom_logger import CustomLogger + + callbacks = litellm.callbacks + ( + logging_obj.dynamic_success_callbacks or [] + ) + tools = optional_params.get("tools", []) + + for callback in callbacks: + try: + if isinstance(callback, CustomLogger): + # Check if callback has the chat completion agentic loop method + if not hasattr(callback, "async_should_run_chat_completion_agentic_loop"): + continue + + # First: Check if agentic loop should run + should_run, tool_calls = ( + await callback.async_should_run_chat_completion_agentic_loop( + response=response, + model=model, + messages=messages, + tools=tools, + stream=stream, + custom_llm_provider=custom_llm_provider, + kwargs=kwargs, + ) + ) + + if should_run: + # Second: Execute agentic loop + # Add custom_llm_provider to kwargs so the agentic loop can reconstruct the full model name + kwargs_with_provider = kwargs.copy() if kwargs else {} + kwargs_with_provider["custom_llm_provider"] = custom_llm_provider + agentic_response = await callback.async_run_chat_completion_agentic_loop( + tools=tool_calls, + model=model, + messages=messages, + response=response, + optional_params=optional_params, + logging_obj=logging_obj, + stream=stream, + kwargs=kwargs_with_provider, + ) + # First hook that runs agentic loop wins + return agentic_response + + except Exception as e: + verbose_logger.exception( + f"LiteLLM.AgenticHookError: Exception in chat completion agentic hooks: {str(e)}" + ) + + # Check if we need to convert response to fake stream for chat completions + # This happens when: + # 1. Stream was originally True but converted to False for WebSearch interception + # 2. No agentic loop ran (LLM didn't use the tool) + # 3. We have a non-streaming response that needs to be converted to streaming + websearch_converted_stream = ( + logging_obj.model_call_details.get("websearch_interception_converted_stream", False) + if logging_obj is not None + else False + ) + + if websearch_converted_stream: + from litellm._logging import verbose_logger + from litellm.llms.base_llm.base_model_iterator import ( + convert_model_response_to_streaming, + ) + + verbose_logger.debug( + "WebSearchInterception: No tool call made, converting non-streaming chat completion to fake stream" + ) + + # Convert the non-streaming ModelResponse to a fake stream + if hasattr(response, "choices"): + # Use the existing converter for ModelResponse + fake_stream = convert_model_response_to_streaming(response) + return fake_stream + + return None + def _handle_error( self, e: Exception, diff --git a/litellm/llms/openai/openai.py b/litellm/llms/openai/openai.py index 8a8070240da..2f0e5e480b5 100644 --- a/litellm/llms/openai/openai.py +++ b/litellm/llms/openai/openai.py @@ -501,6 +501,82 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): else: raise e + async def _call_agentic_completion_hooks_openai( + self, + response: Any, + model: str, + messages: List[Dict], + optional_params: Dict, + logging_obj: LiteLLMLoggingObj, + stream: bool, + litellm_params: Dict, + ) -> Optional[Any]: + """ + Call agentic completion hooks for all custom loggers (OpenAI Chat Completions API). + + 1. Call async_should_run_chat_completion_agentic_loop to check if agentic loop is needed + 2. If yes, call async_run_chat_completion_agentic_loop to execute the loop + + Returns the response from agentic loop, or None if no hook runs. + """ + from litellm._logging import verbose_logger + from litellm.integrations.custom_logger import CustomLogger + + callbacks = litellm.callbacks + ( + logging_obj.dynamic_success_callbacks or [] + ) + print(f"🔥callbacks: {callbacks}") + tools = optional_params.get("tools", []) + print(f"🔥tools: {tools}") + # Get custom_llm_provider from litellm_params + custom_llm_provider = litellm_params.get("custom_llm_provider", "openai") + + for callback in callbacks: + try: + if isinstance(callback, CustomLogger): + # Check if the callback has the chat completion agentic loop methods + if not hasattr(callback, 'async_should_run_chat_completion_agentic_loop'): + continue + + # First: Check if agentic loop should run (using chat completion method) + should_run, tool_calls = ( + await callback.async_should_run_chat_completion_agentic_loop( + response=response, + model=model, + messages=messages, + tools=tools, + stream=stream, + custom_llm_provider=custom_llm_provider, + kwargs=litellm_params, + ) + ) + + if should_run: + # Second: Execute agentic loop + kwargs_with_provider = litellm_params.copy() if litellm_params else {} + kwargs_with_provider["custom_llm_provider"] = custom_llm_provider + + # For OpenAI Chat Completions, use the chat completion agentic loop method + agentic_response = await callback.async_run_chat_completion_agentic_loop( + tools=tool_calls, + model=model, + messages=messages, + response=response, + optional_params=optional_params, + logging_obj=logging_obj, + stream=stream, + kwargs=kwargs_with_provider, + ) + # First hook that runs agentic loop wins + return agentic_response + + except Exception as e: + verbose_logger.exception( + f"LiteLLM.AgenticHookError: Exception in agentic completion hooks for OpenAI: {str(e)}" + ) + + return None + def mock_streaming( self, response: ModelResponse, @@ -844,7 +920,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): logging_obj=logging_obj, ) stringified_response = response.model_dump() - + print(f"🔥stringified_response: {stringified_response}") logging_obj.post_call( input=data["messages"], api_key=api_key, @@ -859,6 +935,20 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): _response_headers=headers, ) + # Call agentic completion hooks (e.g., for websearch_interception) + agentic_response = await self._call_agentic_completion_hooks_openai( + response=final_response_obj, + model=model, + messages=messages, + optional_params=optional_params, + logging_obj=logging_obj, + stream=False, + litellm_params=litellm_params, + ) + + if agentic_response is not None: + final_response_obj = agentic_response + if fake_stream is True: return self.mock_streaming( response=cast(ModelResponse, final_response_obj), From 4b0eb50ddddfe3bc0b70c4ef649391be603e8923 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 5 Feb 2026 14:29:31 +0530 Subject: [PATCH 017/300] Add test for web search --- test_websearch_chat_completion.py | 136 ++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 test_websearch_chat_completion.py diff --git a/test_websearch_chat_completion.py b/test_websearch_chat_completion.py new file mode 100644 index 00000000000..e572e4d860c --- /dev/null +++ b/test_websearch_chat_completion.py @@ -0,0 +1,136 @@ +""" +Test script for WebSearch interception with chat completions API. + +This script demonstrates how to use the websearch_interception callback +with litellm.acompletion() for transparent server-side web search execution. +""" +import asyncio +import litellm + +# Enable verbose logging to see what's happening +litellm.set_verbose = True + + +async def test_websearch_chat_completion(): + """Test websearch interception with chat completions API.""" + + # Configure WebSearch interception + litellm.callbacks = ["websearch_interception"] + + print("\n" + "="*80) + print("Testing WebSearch Interception with Chat Completions API") + print("="*80 + "\n") + + # User makes a simple completion call with tools + print("Making request to GPT-4o with litellm_web_search tool...") + print("Question: What's the weather in San Francisco today?") + print("\nExpected behavior:") + print("1. Model calls litellm_web_search tool") + print("2. Server executes web search automatically") + print("3. Server makes follow-up request with search results") + print("4. User gets final answer\n") + + response = await litellm.acompletion( + model="gpt-4o", + messages=[ + {"role": "user", "content": "What's the weather in San Francisco today?"} + ], + tools=[ + { + "type": "function", + "function": { + "name": "litellm_web_search", + "description": "Search the web for information", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "Search query"} + }, + "required": ["query"] + } + } + } + ] + ) + + print("\n" + "-"*80) + print("FINAL RESPONSE:") + print("-"*80) + print(f"\nContent: {response.choices[0].message.content}") + print(f"\nFinish reason: {response.choices[0].finish_reason}") + + # Check if we got tool_calls (should NOT if agentic loop worked) + if hasattr(response.choices[0].message, 'tool_calls') and response.choices[0].message.tool_calls: + print("\n⚠️ WARNING: Got tool_calls in response!") + print("This means the agentic loop did NOT execute automatically.") + print(f"Tool calls: {response.choices[0].message.tool_calls}") + else: + print("\n✅ SUCCESS: No tool_calls in response!") + print("The agentic loop executed automatically and returned the final answer.") + + print("\n" + "="*80 + "\n") + + +async def test_streaming_websearch(): + """Test websearch interception with streaming.""" + + # Configure WebSearch interception + litellm.callbacks = ["websearch_interception"] + + print("\n" + "="*80) + print("Testing WebSearch Interception with STREAMING") + print("="*80 + "\n") + + print("Making STREAMING request to GPT-4o with litellm_web_search tool...") + print("Question: What are the latest AI news?") + + response = await litellm.acompletion( + model="gpt-4o", + messages=[ + {"role": "user", "content": "What are the latest AI news from today?"} + ], + tools=[ + { + "type": "function", + "function": { + "name": "litellm_web_search", + "description": "Search the web for information", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string"} + } + } + } + } + ], + stream=True + ) + + print("\n" + "-"*80) + print("STREAMING RESPONSE:") + print("-"*80 + "\n") + + full_content = "" + async for chunk in response: + if hasattr(chunk.choices[0].delta, 'content') and chunk.choices[0].delta.content: + content = chunk.choices[0].delta.content + print(content, end="", flush=True) + full_content += content + + print("\n\n✅ Streaming completed successfully!") + print(f"Total content length: {len(full_content)} chars") + print("\n" + "="*80 + "\n") + + +if __name__ == "__main__": + print("\nWebSearch Interception Test Suite") + print("==================================\n") + print("This test demonstrates transparent server-side web search execution.") + print("The agentic loop happens automatically - user just gets the final answer.\n") + + # Run tests + asyncio.run(test_websearch_chat_completion()) + + # Uncomment to test streaming + # asyncio.run(test_streaming_websearch()) From a2e70a561d103497fed719829c48eb597142f214 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 08:20:50 +0530 Subject: [PATCH 018/300] Potential fix for code scanning alert no. 4046: Clear-text logging of sensitive information Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- litellm/llms/openai/openai.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/litellm/llms/openai/openai.py b/litellm/llms/openai/openai.py index 2f0e5e480b5..c6f502d3a25 100644 --- a/litellm/llms/openai/openai.py +++ b/litellm/llms/openai/openai.py @@ -525,9 +525,15 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): callbacks = litellm.callbacks + ( logging_obj.dynamic_success_callbacks or [] ) - print(f"🔥callbacks: {callbacks}") + # Avoid logging full callback objects to prevent leaking sensitive data + verbose_logger.debug( + "LiteLLM.AgenticHooks: callbacks_count=%s", len(callbacks) + ) tools = optional_params.get("tools", []) - print(f"🔥tools: {tools}") + # Avoid logging full tools payloads; they may contain sensitive parameters + verbose_logger.debug( + "LiteLLM.AgenticHooks: tools_count=%s", len(tools) if isinstance(tools, list) else 1 if tools else 0 + ) # Get custom_llm_provider from litellm_params custom_llm_provider = litellm_params.get("custom_llm_provider", "openai") From f12875bd428d74cb46cc24d19ec44d4f3bdafc32 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 08:21:09 +0530 Subject: [PATCH 019/300] Update litellm/integrations/websearch_interception/tools.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- litellm/integrations/websearch_interception/tools.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/integrations/websearch_interception/tools.py b/litellm/integrations/websearch_interception/tools.py index c92c66f41ee..be8808622da 100644 --- a/litellm/integrations/websearch_interception/tools.py +++ b/litellm/integrations/websearch_interception/tools.py @@ -76,7 +76,6 @@ def is_web_search_tool(tool: Dict[str, Any]) -> bool: >>> is_web_search_tool({"name": "calculator"}) False """ - print(f"🔥tool: {tool}") tool_name = tool.get("name", "") tool_type = tool.get("type", "") From 524970b8d2db45dc86ff1e38e5082409a900292f Mon Sep 17 00:00:00 2001 From: Kelvin Tran Date: Thu, 5 Feb 2026 19:40:35 -0800 Subject: [PATCH 020/300] feat: add opus 4.5 and 4.6 to use outout_format param --- litellm/llms/anthropic/chat/transformation.py | 4 + poetry.lock | 50 ++++------- .../test_anthropic_chat_transformation.py | 87 ++++++++++++++++++- 3 files changed, 109 insertions(+), 32 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 1b61b533275..37c2310cd96 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -826,6 +826,10 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): "sonnet-4-5", "opus-4.1", "opus-4-1", + "opus-4.5", + "opus-4-5", + "opus-4.6", + "opus-4-6", } ): _output_format = ( diff --git a/poetry.lock b/poetry.lock index 5e926509d54..06b5cdff8c5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "a2a-sdk" @@ -398,7 +398,6 @@ files = [ {file = "azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b"}, {file = "azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] requests = ">=2.21.0" @@ -419,7 +418,6 @@ files = [ {file = "azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651"}, {file = "azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] azure-core = ">=1.31.0" @@ -720,7 +718,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "(platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} +markers = {main = "platform_python_implementation != \"PyPy\" or extra == \"proxy\"", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -1151,6 +1149,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] +markers = "python_version == \"3.9\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1180,7 +1179,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1202,6 +1200,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main", "dev", "proxy-dev"] +markers = "python_version >= \"3.10\"" files = [ {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, @@ -1258,7 +1257,6 @@ files = [ {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} [package.dependencies] cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} @@ -2277,11 +2275,11 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0.dev0", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0.dev0" -proto-plus = ">=1.22.3,<2.0.0.dev0" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] name = "google-cloud-resource-manager" @@ -3284,7 +3282,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.3.6" +jsonschema-specifications = ">=2023.03.6" referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -3948,7 +3946,6 @@ files = [ {file = "msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1"}, {file = "msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] cryptography = ">=2.5,<49" @@ -3969,7 +3966,6 @@ files = [ {file = "msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca"}, {file = "msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] msal = ">=1.29,<2" @@ -4220,7 +4216,6 @@ files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -markers = {main = "extra == \"extra-proxy\""} [[package]] name = "numpy" @@ -4428,7 +4423,7 @@ files = [ {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] importlib-metadata = ">=6.0,<8.8.0" @@ -4543,7 +4538,7 @@ files = [ {file = "opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c"}, {file = "opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -4561,7 +4556,7 @@ files = [ {file = "opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb"}, {file = "opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -5038,7 +5033,6 @@ files = [ {file = "prisma-0.11.0-py3-none-any.whl", hash = "sha256:22bb869e59a2968b99f3483bb417717273ffbc569fd1e9ceed95e5614cbaf53a"}, {file = "prisma-0.11.0.tar.gz", hash = "sha256:3f2f2fd2361e1ec5ff655f2a04c7860c2f2a5bc4c91f78ca9c5c6349735bf693"}, ] -markers = {main = "extra == \"extra-proxy\""} [package.dependencies] click = ">=7.1.2" @@ -5355,7 +5349,7 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -5578,7 +5572,6 @@ files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] -markers = {main = "extra == \"extra-proxy\" or extra == \"proxy\""} [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} @@ -6680,10 +6673,10 @@ files = [ ] [package.dependencies] -botocore = ">=1.37.4,<2.0a0" +botocore = ">=1.37.4,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.37.4,<2.0a0)"] +crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] [[package]] name = "scikit-learn" @@ -6916,9 +6909,9 @@ tornado = ">=6.4.2,<7" urllib3 = ">=1.26,<3" [package.extras] -all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.0)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] +all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.00)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] bedrock = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)"] -cohere = ["cohere (>=5.9.4,<6.0)"] +cohere = ["cohere (>=5.9.4,<6.00)"] dev = ["dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "ipykernel (>=6.25.0,<7)", "mypy (>=1.7.1,<2)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] docs = ["pydoc-markdown (>=4.8.2) ; python_version < \"3.12\""] fastembed = ["fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\""] @@ -7762,7 +7755,6 @@ files = [ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, ] -markers = {main = "extra == \"extra-proxy\""} [[package]] name = "tornado" @@ -8531,8 +8523,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -<<<<<<< litellm_oss_staging_02_04_2026 -content-hash = "797603dcfef0a79781c7d3cba5dfe18f6aea4aa792220f47487ebc7bd04ae2e3" -======= -content-hash = "e5447e14dd37e324ac07a8fc6286d27e9a0d355ed93ebb24fc11e3f5df12fd3e" ->>>>>>> main +content-hash = "b70033cb74265482e16caa7780858ac86e7b4110ffb69e35b01533a30eda8a34" diff --git a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py index eee0b267fad..8684af46c70 100644 --- a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py +++ b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py @@ -3,7 +3,6 @@ import os import sys import pytest -from fastapi.testclient import TestClient sys.path.insert( 0, os.path.abspath("../../../../..") @@ -908,6 +907,92 @@ def test_anthropic_structured_output_beta_header(): ) +@pytest.mark.parametrize( + "model_name", + [ + "claude-opus-4-6-20250918", + "claude-opus-4.6-20250918", + "claude-opus-4-5-20251101", + "claude-opus-4.5-20251101", + ], +) +def test_opus_uses_native_structured_output(model_name): + """ + Test that Opus 4.5 and 4.6 models use native Anthropic structured outputs + (output_format) rather than the tool-based workaround. + """ + config = AnthropicConfig() + + response_format = { + "type": "json_schema", + "json_schema": { + "name": "test_schema", + "schema": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "age": {"type": "integer"}, + }, + "required": ["name", "age"], + "additionalProperties": False, + }, + }, + } + + optional_params = config.map_openai_params( + non_default_params={"response_format": response_format}, + optional_params={}, + model=model_name, + drop_params=False, + ) + + # Should use output_format (native structured outputs) + assert "output_format" in optional_params + assert optional_params["output_format"]["type"] == "json_schema" + + # Should NOT create a tool-based workaround + assert "tools" not in optional_params + assert "tool_choice" not in optional_params + + # Should set json_mode + assert optional_params.get("json_mode") is True + + +def test_non_structured_output_model_uses_tool_workaround(): + """ + Test that models NOT in the native structured output list still use the + tool-based workaround for response_format. + """ + config = AnthropicConfig() + + response_format = { + "type": "json_schema", + "json_schema": { + "name": "test_schema", + "schema": { + "type": "object", + "properties": {"result": {"type": "string"}}, + "required": ["result"], + "additionalProperties": False, + }, + }, + } + + optional_params = config.map_openai_params( + non_default_params={"response_format": response_format}, + optional_params={}, + model="claude-3-5-sonnet-20241022", + drop_params=False, + ) + + # Should NOT use output_format + assert "output_format" not in optional_params + + # Should use tool-based workaround + assert "tools" in optional_params + assert "tool_choice" in optional_params + + # ============ Tool Search Tests ============ From 186fd2e64e93f773943bdc3a3a8dd1e1602c8601 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 09:24:43 +0530 Subject: [PATCH 021/300] Add adaptive thinking support for anthropic opus 4.6 --- litellm/llms/anthropic/chat/transformation.py | 19 +++-- .../test_anthropic_chat_transformation.py | 69 +++++++++++++++++++ 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 1b61b533275..f7a11add35b 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -170,9 +170,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): tool_call["caller"] = cast(Dict[str, Any], anthropic_tool_content["caller"]) # type: ignore[typeddict-item] return tool_call - def _is_claude_opus_4_5(self, model: str) -> bool: + def _is_claude_opus_4_6(self, model: str) -> bool: """Check if the model is Claude Opus 4.5.""" - return "opus-4-5" in model.lower() or "opus_4_5" in model.lower() + return "opus-4-6" in model.lower() or "opus_4_6" in model.lower() def get_supported_openai_params(self, model: str): params = [ @@ -860,14 +860,13 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if param == "thinking": optional_params["thinking"] = value elif param == "reasoning_effort" and isinstance(value, str): - # For Claude Opus 4.5, map reasoning_effort to output_config - if self._is_claude_opus_4_5(model): - optional_params["output_config"] = {"effort": value} - - # For other models, map to thinking parameter - optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( - value - ) + # For Claude Opus 4.6, map reasoning_effort to new adaptive thinking type + if self._is_claude_opus_4_6(model): + optional_params["thinking"] = {"type": "adaptive"} + else: + optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( + value + ) elif param == "web_search_options" and isinstance(value, dict): hosted_web_search_tool = self.map_web_search_tool( cast(OpenAIWebSearchOptions, value) diff --git a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py index eee0b267fad..f556c4abe51 100644 --- a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py +++ b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py @@ -1934,6 +1934,75 @@ def test_calculate_usage_completion_tokens_details_with_reasoning(): assert usage.completion_tokens == 500 +# ============ Reasoning Effort Tests ============ + + +def test_reasoning_effort_maps_to_adaptive_thinking_for_opus_4_6(): + """ + Test that reasoning_effort maps to adaptive thinking type for Claude Opus 4.6. + + For Claude Opus 4.6, reasoning_effort should map to {"type": "adaptive"} + regardless of the effort level specified. + """ + config = AnthropicConfig() + + # Test with different reasoning_effort values - all should map to adaptive + for effort in ["low", "medium", "high", "minimal"]: + non_default_params = {"reasoning_effort": effort} + optional_params = {} + + result = config.map_openai_params( + non_default_params=non_default_params, + optional_params=optional_params, + model="claude-opus-4-6-20250514", + drop_params=False + ) + + # Should map to adaptive thinking type + assert "thinking" in result + assert result["thinking"]["type"] == "adaptive" + # Should not have budget_tokens for adaptive type + assert "budget_tokens" not in result["thinking"] + # reasoning_effort should not be in the result (it's transformed to thinking) + assert "reasoning_effort" not in result + + +def test_reasoning_effort_maps_to_budget_thinking_for_non_opus_4_6(): + """ + Test that reasoning_effort maps to budget-based thinking config for non-Opus 4.6 models. + + For models other than Claude Opus 4.6, reasoning_effort should map to + thinking config with budget_tokens based on the effort level. + """ + config = AnthropicConfig() + + # Test with Claude Sonnet 4.5 (non-Opus 4.6 model) + test_cases = [ + ("low", 1024), # DEFAULT_REASONING_EFFORT_LOW_THINKING_BUDGET + ("medium", 2048), # DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET + ("high", 4096), # DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET + ("minimal", 128), # DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET + ] + + for effort, expected_budget in test_cases: + non_default_params = {"reasoning_effort": effort} + optional_params = {} + + result = config.map_openai_params( + non_default_params=non_default_params, + optional_params=optional_params, + model="claude-sonnet-4-5-20250929", + drop_params=False + ) + + # Should map to enabled thinking type with budget_tokens + assert "thinking" in result + assert result["thinking"]["type"] == "enabled" + assert result["thinking"]["budget_tokens"] == expected_budget + # reasoning_effort should not be in the result (it's transformed to thinking) + assert "reasoning_effort" not in result + + def test_code_execution_tool_results_extraction(): """ Test that code execution tool results (bash_code_execution_tool_result, From f15dd691b479190353fc984749717c4eb8bcce4f Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 09:28:50 +0530 Subject: [PATCH 022/300] Fix anthropic.claude-opus-4-6-v1 for bedrock --- ...model_prices_and_context_window_backup.json | 2 +- model_prices_and_context_window.json | 2 +- .../test_claude_opus_4_6_config.py | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 66c8e55c3ae..39c95b893f5 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -1023,7 +1023,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us.anthropic.claude-opus-4-6-v1:0": { + "us.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 66c8e55c3ae..39c95b893f5 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -1023,7 +1023,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us.anthropic.claude-opus-4-6-v1:0": { + "us.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, diff --git a/tests/test_litellm/test_claude_opus_4_6_config.py b/tests/test_litellm/test_claude_opus_4_6_config.py index 2b01ba6d99c..8823f0d66a6 100644 --- a/tests/test_litellm/test_claude_opus_4_6_config.py +++ b/tests/test_litellm/test_claude_opus_4_6_config.py @@ -72,7 +72,7 @@ def test_opus_4_6_bedrock_regional_model_pricing(): model_data = json.load(f) expected_models = { - "global.anthropic.claude-opus-4-6-v1:0": { + "global.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, "cache_creation_input_token_cost": 6.25e-06, @@ -82,7 +82,7 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost_above_200k_tokens": 1e-06, }, - "us.anthropic.claude-opus-4-6-v1:0": { + "us.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, "cache_creation_input_token_cost": 6.875e-06, @@ -92,7 +92,7 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, }, - "eu.anthropic.claude-opus-4-6-v1:0": { + "eu.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, "cache_creation_input_token_cost": 6.875e-06, @@ -102,7 +102,7 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, }, - "apac.anthropic.claude-opus-4-6-v1:0": { + "apac.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, "cache_creation_input_token_cost": 6.875e-06, @@ -128,8 +128,8 @@ def test_opus_4_6_bedrock_regional_model_pricing(): def test_opus_4_6_bedrock_converse_registration(): - assert "anthropic.claude-opus-4-6-v1:0" in litellm.BEDROCK_CONVERSE_MODELS - assert "global.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models - assert "us.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models - assert "eu.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models - assert "apac.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models + assert "anthropic.claude-opus-4-6-v1" in litellm.BEDROCK_CONVERSE_MODELS + assert "global.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models + assert "us.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models + assert "eu.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models + assert "apac.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models From 1bcd407af6581ace682e9a5e56ace4319d6ac025 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 09:40:16 +0530 Subject: [PATCH 023/300] Add adaptive thiking for bedrock converse --- litellm/llms/anthropic/chat/transformation.py | 63 ++++++++++--------- .../bedrock/chat/converse_transformation.py | 5 +- .../llms/databricks/chat/transformation.py | 3 +- ...odel_prices_and_context_window_backup.json | 8 +-- model_prices_and_context_window.json | 8 +-- 5 files changed, 45 insertions(+), 42 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index f7a11add35b..61616c7f1b4 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -170,7 +170,8 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): tool_call["caller"] = cast(Dict[str, Any], anthropic_tool_content["caller"]) # type: ignore[typeddict-item] return tool_call - def _is_claude_opus_4_6(self, model: str) -> bool: + @staticmethod + def _is_claude_opus_4_6(model: str) -> bool: """Check if the model is Claude Opus 4.5.""" return "opus-4-6" in model.lower() or "opus_4_6" in model.lower() @@ -659,32 +660,38 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): @staticmethod def _map_reasoning_effort( - reasoning_effort: Optional[Union[REASONING_EFFORT, str]], + reasoning_effort: Optional[Union[REASONING_EFFORT, str]], + model: str, ) -> Optional[AnthropicThinkingParam]: - if reasoning_effort is None: - return None - elif reasoning_effort == "low": + if AnthropicConfig._is_claude_opus_4_6(model): return AnthropicThinkingParam( - type="enabled", - budget_tokens=DEFAULT_REASONING_EFFORT_LOW_THINKING_BUDGET, - ) - elif reasoning_effort == "medium": - return AnthropicThinkingParam( - type="enabled", - budget_tokens=DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET, - ) - elif reasoning_effort == "high": - return AnthropicThinkingParam( - type="enabled", - budget_tokens=DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET, - ) - elif reasoning_effort == "minimal": - return AnthropicThinkingParam( - type="enabled", - budget_tokens=DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET, + type="adaptive", ) else: - raise ValueError(f"Unmapped reasoning effort: {reasoning_effort}") + if reasoning_effort is None: + return None + elif reasoning_effort == "low": + return AnthropicThinkingParam( + type="enabled", + budget_tokens=DEFAULT_REASONING_EFFORT_LOW_THINKING_BUDGET, + ) + elif reasoning_effort == "medium": + return AnthropicThinkingParam( + type="enabled", + budget_tokens=DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET, + ) + elif reasoning_effort == "high": + return AnthropicThinkingParam( + type="enabled", + budget_tokens=DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET, + ) + elif reasoning_effort == "minimal": + return AnthropicThinkingParam( + type="enabled", + budget_tokens=DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET, + ) + else: + raise ValueError(f"Unmapped reasoning effort: {reasoning_effort}") def _extract_json_schema_from_response_format( self, value: Optional[dict] @@ -860,13 +867,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if param == "thinking": optional_params["thinking"] = value elif param == "reasoning_effort" and isinstance(value, str): - # For Claude Opus 4.6, map reasoning_effort to new adaptive thinking type - if self._is_claude_opus_4_6(model): - optional_params["thinking"] = {"type": "adaptive"} - else: - optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( - value - ) + optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( + reasoning_effort=value, model=model + ) elif param == "web_search_options" and isinstance(value, dict): hosted_web_search_tool = self.map_web_search_tool( cast(OpenAIWebSearchOptions, value) diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index 6591e152a14..22fccd8f943 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -30,8 +30,6 @@ from litellm.litellm_core_utils.prompt_templates.factory import ( from litellm.llms.anthropic.chat.transformation import AnthropicConfig from litellm.llms.base_llm.chat.transformation import BaseConfig, BaseLLMException from litellm.types.llms.bedrock import * - -from ..common_utils import is_claude_4_5_on_bedrock from litellm.types.llms.openai import ( AllMessageValues, ChatCompletionAssistantMessage, @@ -68,6 +66,7 @@ from ..common_utils import ( BedrockModelInfo, get_anthropic_beta_from_headers, get_bedrock_tool_name, + is_claude_4_5_on_bedrock, ) # Computer use tool prefixes supported by Bedrock @@ -431,7 +430,7 @@ class AmazonConverseConfig(BaseConfig): else: # Anthropic and other models: convert to thinking parameter optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( - reasoning_effort + reasoning_effort=reasoning_effort, model=model ) def get_supported_openai_params(self, model: str) -> List[str]: diff --git a/litellm/llms/databricks/chat/transformation.py b/litellm/llms/databricks/chat/transformation.py index 2b7f5dd5995..e9ae94307d4 100644 --- a/litellm/llms/databricks/chat/transformation.py +++ b/litellm/llms/databricks/chat/transformation.py @@ -298,7 +298,8 @@ class DatabricksConfig(DatabricksBase, OpenAILikeChatConfig, AnthropicConfig): if "reasoning_effort" in non_default_params and "claude" in model: optional_params["thinking"] = AnthropicConfig._map_reasoning_effort( - non_default_params.get("reasoning_effort") + reasoning_effort=non_default_params.get("reasoning_effort"), + model=model ) optional_params.pop("reasoning_effort", None) ## handle thinking tokens diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 39c95b893f5..5099218e592 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -963,7 +963,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 159 }, - "anthropic.claude-opus-4-6-v1:0": { + "anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost": 5e-07, @@ -993,7 +993,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "global.anthropic.claude-opus-4-6-v1:0": { + "global.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost": 5e-07, @@ -1053,7 +1053,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "eu.anthropic.claude-opus-4-6-v1:0": { + "eu.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1083,7 +1083,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "apac.anthropic.claude-opus-4-6-v1:0": { + "apac.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 39c95b893f5..5099218e592 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -963,7 +963,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 159 }, - "anthropic.claude-opus-4-6-v1:0": { + "anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost": 5e-07, @@ -993,7 +993,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "global.anthropic.claude-opus-4-6-v1:0": { + "global.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost": 5e-07, @@ -1053,7 +1053,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "eu.anthropic.claude-opus-4-6-v1:0": { + "eu.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1083,7 +1083,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "apac.anthropic.claude-opus-4-6-v1:0": { + "apac.anthropic.claude-opus-4-6-v1": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, From 08a6fe2bfa2ad937bc2e340ab47b35399857fed2 Mon Sep 17 00:00:00 2001 From: Swayambhu Date: Fri, 6 Feb 2026 09:44:02 +0530 Subject: [PATCH 024/300] refactor: migrate Ant Design notifications to use `App.useApp()` context via a new global provider. 1. notifications_manager.tsx - Hybrid notification approach: Added notificationInstance variable to store the context-based instance Added setNotificationInstance() function to inject the instance from context Created getNotification() helper that prefers context instance, falls back to static Added COMMON_NOTIFICATION_PROPS (exported) with showProgress: true and pauseOnHover: true All notification methods ( error , warning , info , success , fromBackend ) now spread COMMON_NOTIFICATION_PROPS 2. AntdGlobalProvider.tsx - New context provider: Wraps app with Antd's component Uses App.useApp() hook to get the context-based notification instance Injects it into NotificationManager via setNotificationInstance() --- ui/litellm-dashboard/src/app/layout.tsx | 6 ++- .../molecules/notifications_manager.tsx | 38 ++++++++++++------- .../src/contexts/AntdGlobalProvider.tsx | 25 ++++++++++++ 3 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx diff --git a/ui/litellm-dashboard/src/app/layout.tsx b/ui/litellm-dashboard/src/app/layout.tsx index 95c485fe2f0..1233da9046f 100644 --- a/ui/litellm-dashboard/src/app/layout.tsx +++ b/ui/litellm-dashboard/src/app/layout.tsx @@ -2,6 +2,8 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; +import AntdGlobalProvider from "@/contexts/AntdGlobalProvider"; + const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -17,7 +19,9 @@ export default function RootLayout({ }>) { return ( - {children} + + {children} + ); } diff --git a/ui/litellm-dashboard/src/components/molecules/notifications_manager.tsx b/ui/litellm-dashboard/src/components/molecules/notifications_manager.tsx index 71b14bee885..59b048b412c 100644 --- a/ui/litellm-dashboard/src/components/molecules/notifications_manager.tsx +++ b/ui/litellm-dashboard/src/components/molecules/notifications_manager.tsx @@ -1,8 +1,18 @@ import React from "react"; -import { notification } from "antd"; +import { notification as staticNotification } from "antd"; +import type { NotificationInstance } from "antd/es/notification/interface"; import { parseErrorMessage } from "../shared/errorUtils"; import { ArgsProps } from "antd/es/notification"; +let notificationInstance: NotificationInstance | null = null; + +export const setNotificationInstance = (instance: NotificationInstance) => { + notificationInstance = instance; +}; + +// Helper to get the best available notification instance +const getNotification = () => notificationInstance || staticNotification; + type Placement = "top" | "topLeft" | "topRight" | "bottom" | "bottomLeft" | "bottomRight"; type NotificationConfig = { @@ -251,7 +261,7 @@ function looksErrorPayload(input: any, status?: number): boolean { const NotificationManager = { error(input: string | NotificationConfig) { const cfg = normalize(input, "Error"); - notification.error({ + getNotification().error({ ...COMMON_NOTIFICATION_PROPS, ...cfg, placement: cfg.placement ?? defaultPlacement(), @@ -261,7 +271,7 @@ const NotificationManager = { warning(input: string | NotificationConfig) { const cfg = normalize(input, "Warning"); - notification.warning({ + getNotification().warning({ ...COMMON_NOTIFICATION_PROPS, ...cfg, placement: cfg.placement ?? defaultPlacement(), @@ -271,7 +281,7 @@ const NotificationManager = { info(input: string | NotificationConfig) { const cfg = normalize(input, "Info"); - notification.info({ + getNotification().info({ ...COMMON_NOTIFICATION_PROPS, ...cfg, placement: cfg.placement ?? defaultPlacement(), @@ -281,7 +291,7 @@ const NotificationManager = { success(input: string | React.ReactNode | NotificationConfig) { if (React.isValidElement(input)) { - notification.success({ + getNotification().success({ ...COMMON_NOTIFICATION_PROPS, message: "Success", description: input, @@ -291,7 +301,7 @@ const NotificationManager = { return; } const cfg = normalize(input as string | NotificationConfig, "Success"); - notification.success({ + getNotification().success({ ...COMMON_NOTIFICATION_PROPS, ...cfg, placement: cfg.placement ?? defaultPlacement(), @@ -316,11 +326,11 @@ const NotificationManager = { title === "Content Blocked" || title === "Integration Error" ) { - notification.warning({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 7 }); + getNotification().warning({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 7 }); return; } if (title === "Server Error") { - notification.error({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 8 }); + getNotification().error({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 8 }); return; } if ( @@ -331,10 +341,10 @@ const NotificationManager = { title === "Error" || title === "Already Exists" ) { - notification.error({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 6 }); + getNotification().error({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 6 }); return; } - notification.info({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 4 }); + getNotification().info({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 4 }); return; } @@ -343,18 +353,18 @@ const NotificationManager = { const payload = { ...base, message: cls?.title ?? "Info" }; if (cls?.kind === "success") { - notification.success({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 3.5 }); + getNotification().success({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 3.5 }); return; } if (cls?.kind === "warning") { - notification.warning({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 6 }); + getNotification().warning({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 6 }); return; } - notification.info({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 4 }); + getNotification().info({ ...COMMON_NOTIFICATION_PROPS, ...payload, duration: extra?.duration ?? 4 }); }, clear() { - notification.destroy(); + getNotification().destroy(); }, }; diff --git a/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx new file mode 100644 index 00000000000..b10aa715ed5 --- /dev/null +++ b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx @@ -0,0 +1,25 @@ +"use client"; + +import React, { useEffect } from "react"; +import { App } from "antd"; +import { setNotificationInstance } from "@/components/molecules/notifications_manager"; + +// Inner component to use the hook +const AntdAppInit = () => { + const { notification } = App.useApp(); + + useEffect(() => { + setNotificationInstance(notification); + }, [notification]); + + return null; +}; + +export default function AntdGlobalProvider({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + ); +} From eee37c569ddad6ca13d9055980506e605a77430e Mon Sep 17 00:00:00 2001 From: Swayambhu Date: Fri, 6 Feb 2026 10:01:44 +0530 Subject: [PATCH 025/300] fix: ensure Ant Design notification instance is initialized only once using `useRef`. --- ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx index b10aa715ed5..c5adbff86b2 100644 --- a/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx +++ b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx @@ -1,15 +1,19 @@ "use client"; -import React, { useEffect } from "react"; +import React, { useEffect, useRef } from "react"; import { App } from "antd"; import { setNotificationInstance } from "@/components/molecules/notifications_manager"; // Inner component to use the hook const AntdAppInit = () => { const { notification } = App.useApp(); + const initialized = useRef(false); useEffect(() => { - setNotificationInstance(notification); + if (!initialized.current) { + setNotificationInstance(notification); + initialized.current = true; + } }, [notification]); return null; From ec5dc0be514543c742ae98729e60ef9060e42c48 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 20:42:43 -0800 Subject: [PATCH 026/300] email soft budgets --- ...litellm_enterprise-0.1.29-py3-none-any.whl | Bin 111358 -> 112486 bytes .../dist/litellm_enterprise-0.1.29.tar.gz | Bin 48839 -> 49967 bytes .../send_emails/base_email.py | 102 ++++++++++++++++-- .../integrations/email_templates/templates.py | 24 +++++ litellm/proxy/_types.py | 5 + litellm/proxy/auth/auth_checks.py | 67 ++++++++++++ litellm/proxy/auth/user_api_key_auth.py | 1 + litellm/proxy/utils.py | 29 ++++- 8 files changed, 216 insertions(+), 12 deletions(-) diff --git a/enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl index 0895ecbc4271ba78bed1da72468e19f87324b33a..5eedd1fe876e110a84047318cefd194078254fbb 100644 GIT binary patch delta 24676 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 z�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 z od7yM;6%-|N^R|L8C=&!$Q+ANI}{Q4geJ+dQ_w7(SpEU(0%wsZItAM$Z^w~67= z?B<2vU+nV|bCn~I-!IgN-K^IYb!)Fmsuguftc9vl;a@vA$xDHdnHM9YD1Yk>XfE|k zJeEAJ5uW|*b{A_W$4Vx3>2O7Wak^B7`>IqTH82|%I_S)DQ>jCbZAK2onO^@<`ek(U z<<2GHCe`|BQ00Tu=*b3)y4XH7+u6jcrdoY=%=vJ#D%`W z`E9t*G#lxTu^d9Pnd*qREsz%4i)$hX-VjLNFKB5&0IhXRUf9Y#yuP0X+E3bMf3I5m zhAqAGPo}Kdq27H=9aRsPuF-5wLyET9v%qW`#CJbszNpH6t!JBOxR;EjS8%&Kw&yxF z9k=n13NHe)hpZBL;lld<(q~Foia(7N>4f&fvh_?scL72M1qYjw2cw@jP3bqAjj9Ub z6!#LLl{F%qXKg2=I%zNgs3(joij)VHlxvtcO{eF`@47q+`d2_~%v<_(82fLtrqLL@ zaPQ-dWct0Lmf*tD^vTkWh?oy%RF0^ey+WW%ES~Z7?^07iV z-sI!ZloU^@4wNp9ntuLj2kRiv@jB=IXKi&6$;7$5(cfXAHcQRI?q+j6WWg$|d0D{e z!7QGh8C1PIj#ED3;>HYB;k?pwwscty3~&ob^DnHN0523xNFJbkHspUxyhEA_K>+mr zc7kaJ%YW*;+ZTcOpgE8J%gaR|0chCMzf1x#Dh4q@w_N;Xl!U4?RLJN*4(|Go!-Jrg zfaF0H5Uf%VKE$B}qyqin{y)B27zCdnev1M@t^{F1Zc0GJ&`bZ@BVGnVgs_)_Bw=iz zK#-n4J&>4EkRXf==r3)Tg1|65@P7#%7K97YD+4jXtRenYE$|>BNb5hU4f(G!DF>lJ z(91z2WdAJ)L<$8Z0QK*c9{@)AH&`BK75iVpfh?ATgkW$8|EhVsKRKl6(Dh#WAVRqPyv#M>5}-D@E{o?e;(1l^3QbHrT)K1lK_!G$ZP(* zo-|1iCffgvo*(ci{Wnas3M2qCDf^cat3cc^hjM>us|v&g)35NCqGkT%P^$iu1Ed8? zaN@#+7}tQ{A;W4Q8c5SWT1@x98Wn=B`6v2MW+oV9{r_qy=pXvYwIF)P&l(UHw4u?T zdrjzve;Rtom>viR5?2etB>m4`7$FqYlNb~f)BjERPn!=aG5=5KW-SOG-pL2_$Ndj^ CK`&eY delta 23511 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 IfCrEN2dsIPi2wiq diff --git a/enterprise/dist/litellm_enterprise-0.1.29.tar.gz b/enterprise/dist/litellm_enterprise-0.1.29.tar.gz index 6781cf26cc9e9feab8ae6a0bacbb31fa52501dd0..1ea224f8f340cd67950787c29ca2591707495089 100644 GIT binary patch delta 49442 zcmX7v1zS~J*M&(DknS$&mJR^{LAqPIk(AC&cPZT|je>NSG)Q-Mcf&bne?IT`5BA#E z8e`sLUSkbH5q^auCJMsWeiIS}rs>N#Q{gP6Eo7`#-@Q{`ATKAKHJ*_Z0Zvx*Ps2~U2dw3jnUE;w!t$n|&Ky%)2ESGCG!U{EEzeDp1&dLb$ z!O>C3u;D}Gb*gTvhgacjhg|-lehl&DML6QcO>d0GJ+1K&MMlWCAMU6ira5_c zS!QO$m_@EM;!lNelXyj1fA_?`D67X9U zTy9*N){Ll6X&E9uU5)j;dm~(3=Pg)HrVG&^0TDai%iRY=o;uqNB zG^@W;BjK`d6!3fwQE%!nY~ASCm|c=*cjy5Wi)?#8*~v7`B8;F%1Gdb?Sk5UJ>> z4K1^!7OV7=Eb0hR^x~h;H0^i~92D)NOsqfe;8@PE-caGjceNtEnO!+g

ncGmQo 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 delta 48352 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 K4gO95Xa)d1`I`s; diff --git a/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py b/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py index 61e0745bab1..1e87e5594fc 100644 --- a/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py @@ -30,8 +30,15 @@ from litellm.integrations.email_templates.user_invitation_email import ( from litellm.integrations.email_templates.templates import ( MAX_BUDGET_ALERT_EMAIL_TEMPLATE, SOFT_BUDGET_ALERT_EMAIL_TEMPLATE, + TEAM_SOFT_BUDGET_ALERT_EMAIL_TEMPLATE, +) +from litellm.proxy._types import ( + CallInfo, + InvitationNew, + Litellm_EntityType, + UserAPIKeyAuth, + WebhookEvent, ) -from litellm.proxy._types import CallInfo, InvitationNew, UserAPIKeyAuth, WebhookEvent from litellm.secret_managers.main import get_secret_bool from litellm.types.integrations.slack_alerting import LITELLM_LOGO_URL from litellm.constants import ( @@ -217,6 +224,68 @@ class BaseEmailLogger(CustomLogger): ) pass + async def send_team_soft_budget_alert_email(self, event: WebhookEvent): + """ + Send email to team members when team soft budget is crossed + Supports multiple recipients via alert_emails field from team metadata + """ + # Collect all recipient emails + recipient_emails: List[str] = [] + + # Add additional alert emails from team metadata.soft_budget_alert_emails + if hasattr(event, "alert_emails") and event.alert_emails: + for email in event.alert_emails: + if email and email not in recipient_emails: # Avoid duplicates + recipient_emails.append(email) + + # If no recipients found, skip sending + if not recipient_emails: + verbose_proxy_logger.warning( + f"No recipient emails found for team soft budget alert. event={event.model_dump(exclude_none=True)}" + ) + return + + verbose_proxy_logger.debug( + f"send_team_soft_budget_alert_email_event: {json.dumps(event.model_dump(exclude_none=True), indent=4, default=str)}" + ) + + # Get email params using the first recipient email (for template formatting) + email_params = await self._get_email_params( + email_event=EmailEvent.soft_budget_crossed, + user_id=event.user_id, + user_email=recipient_emails[0], + event_message=event.event_message, + ) + + # Format budget values + soft_budget_str = f"${event.soft_budget}" if event.soft_budget is not None else "N/A" + spend_str = f"${event.spend}" if event.spend is not None else "$0.00" + max_budget_info = "" + if event.max_budget is not None: + max_budget_info = f"Maximum Budget: ${event.max_budget}
" + + # Use team alias or generic greeting + team_alias = event.team_alias or "Team" + + email_html_content = TEAM_SOFT_BUDGET_ALERT_EMAIL_TEMPLATE.format( + email_logo_url=email_params.logo_url, + team_alias=team_alias, + soft_budget=soft_budget_str, + spend=spend_str, + max_budget_info=max_budget_info, + base_url=email_params.base_url, + email_support_contact=email_params.support_contact, + ) + + # Send email to all recipients + await self.send_email( + from_email=self.DEFAULT_LITELLM_EMAIL, + to_email=recipient_emails, + subject=email_params.subject, + html_body=email_html_content, + ) + pass + async def send_max_budget_alert_email(self, event: WebhookEvent): """ Send email to user when max budget alert threshold is reached @@ -285,15 +354,29 @@ class BaseEmailLogger(CustomLogger): # - Don't re-alert, if alert already sent _cache: DualCache = self.internal_usage_cache - # percent of max_budget left to spend - if user_info.max_budget is None and user_info.soft_budget is None: - return - # For soft_budget alerts, check if we've already sent an alert if type == "soft_budget": + # For team soft budget alerts, we only need team soft_budget to be set + # For other entity types, we need either max_budget or soft_budget + if user_info.event_group == Litellm_EntityType.TEAM: + if user_info.soft_budget is None: + return + else: + # For non-team alerts, require either max_budget or soft_budget + if user_info.max_budget is None and user_info.soft_budget is None: + return if user_info.soft_budget is not None and user_info.spend >= user_info.soft_budget: # Generate cache key based on event type and identifier - _id = user_info.token or user_info.user_id or "default_id" + # Use appropriate ID based on event_group to ensure unique cache keys per entity type + if user_info.event_group == Litellm_EntityType.TEAM: + _id = user_info.team_id or "default_id" + elif user_info.event_group == Litellm_EntityType.ORGANIZATION: + _id = user_info.organization_id or "default_id" + elif user_info.event_group == Litellm_EntityType.USER: + _id = user_info.user_id or "default_id" + else: + # For KEY and other types, use token or user_id + _id = user_info.token or user_info.user_id or "default_id" _cache_key = f"email_budget_alerts:soft_budget_crossed:{_id}" # Check if we've already sent this alert @@ -318,10 +401,15 @@ class BaseEmailLogger(CustomLogger): projected_exceeded_date=user_info.projected_exceeded_date, projected_spend=user_info.projected_spend, event_group=user_info.event_group, + alert_emails=user_info.alert_emails, ) try: - await self.send_soft_budget_alert_email(webhook_event) + # Use team-specific function for team alerts, otherwise use standard function + if user_info.event_group == Litellm_EntityType.TEAM: + await self.send_team_soft_budget_alert_email(webhook_event) + else: + await self.send_soft_budget_alert_email(webhook_event) # Cache the alert to prevent duplicate sends await _cache.async_set_cache( diff --git a/litellm/integrations/email_templates/templates.py b/litellm/integrations/email_templates/templates.py index 5de23db0f24..091351df2bb 100644 --- a/litellm/integrations/email_templates/templates.py +++ b/litellm/integrations/email_templates/templates.py @@ -85,6 +85,30 @@ SOFT_BUDGET_ALERT_EMAIL_TEMPLATE = """ The LiteLLM team
""" +TEAM_SOFT_BUDGET_ALERT_EMAIL_TEMPLATE = """ + LiteLLM Logo + +

Hi {team_alias} team member,
+ + Your LiteLLM team has crossed its soft budget limit of {soft_budget}.

+ + Current Spend: {spend}
+ Soft Budget: {soft_budget}
+ {max_budget_info} + +

+ ⚠️ Note: Your API requests will continue to work, but you should monitor your usage closely. + If you reach your maximum budget, requests will be rejected. +

+ + You can view your usage and manage your budget in the
LiteLLM Dashboard.

+ + If you have any questions, please send an email to {email_support_contact}

+ + Best,
+ The LiteLLM team
+""" + MAX_BUDGET_ALERT_EMAIL_TEMPLATE = """ LiteLLM Logo diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 5b697249a41..f38f94f4c98 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2190,6 +2190,7 @@ class LiteLLM_VerificationTokenView(LiteLLM_VerificationToken): team_tpm_limit: Optional[int] = None team_rpm_limit: Optional[int] = None team_max_budget: Optional[float] = None + team_soft_budget: Optional[float] = None team_models: List = [] team_blocked: bool = False soft_budget: Optional[float] = None @@ -2648,6 +2649,10 @@ class CallInfo(LiteLLMPydanticObjectBase): projected_exceeded_date: Optional[str] = None projected_spend: Optional[float] = None event_group: Litellm_EntityType + alert_emails: Optional[List[str]] = Field( + default=None, + description="Additional email addresses to send alerts to (e.g., from team metadata)", + ) class WebhookEvent(CallInfo): diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 359bb944546..437ef0d438b 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -218,6 +218,13 @@ async def common_checks( valid_token=valid_token, ) + # 3.0.5. If team is over soft budget (alert only, doesn't block) + await _team_soft_budget_check( + team_object=team_object, + proxy_logging_obj=proxy_logging_obj, + valid_token=valid_token, + ) + # 3.1. If organization is in budget await _organization_max_budget_check( valid_token=valid_token, @@ -2421,6 +2428,66 @@ async def _team_max_budget_check( ) +async def _team_soft_budget_check( + team_object: Optional[LiteLLM_TeamTable], + valid_token: Optional[UserAPIKeyAuth], + proxy_logging_obj: ProxyLogging, +): + """ + Triggers a budget alert if the team is over it's soft budget. + """ + if ( + team_object is not None + and team_object.soft_budget is not None + and team_object.spend is not None + and team_object.spend >= team_object.soft_budget + ): + verbose_proxy_logger.debug( + "Crossed Soft Budget for team %s, spend %s, soft_budget %s", + team_object.team_id, + team_object.spend, + team_object.soft_budget, + ) + if valid_token: + # Extract alert emails from team metadata + alert_emails: Optional[List[str]] = None + if team_object.metadata is not None and isinstance(team_object.metadata, dict): + soft_budget_alert_emails = team_object.metadata.get("soft_budget_alerting_emails") + if soft_budget_alert_emails is not None: + if isinstance(soft_budget_alert_emails, list): + alert_emails = [email for email in soft_budget_alert_emails if isinstance(email, str) and email.strip()] + elif isinstance(soft_budget_alert_emails, str): + # Handle comma-separated string + alert_emails = [email.strip() for email in soft_budget_alert_emails.split(",") if email.strip()] + # Filter out empty strings + if alert_emails: + alert_emails = [email for email in alert_emails if email] + else: + alert_emails = None + + call_info = CallInfo( + token=valid_token.token, + spend=team_object.spend, + max_budget=team_object.max_budget, + soft_budget=team_object.soft_budget, + user_id=valid_token.user_id, + team_id=valid_token.team_id, + team_alias=valid_token.team_alias, + organization_id=valid_token.org_id, + user_email=None, # Team-level alert, no specific user email + key_alias=valid_token.key_alias, + event_group=Litellm_EntityType.TEAM, + alert_emails=alert_emails, + ) + + asyncio.create_task( + proxy_logging_obj.budget_alerts( + type="soft_budget", + user_info=call_info, + ) + ) + + async def _organization_max_budget_check( valid_token: Optional[UserAPIKeyAuth], team_object: Optional[LiteLLM_TeamTable], diff --git a/litellm/proxy/auth/user_api_key_auth.py b/litellm/proxy/auth/user_api_key_auth.py index a153c6e51cc..05eeab3f611 100644 --- a/litellm/proxy/auth/user_api_key_auth.py +++ b/litellm/proxy/auth/user_api_key_auth.py @@ -1149,6 +1149,7 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 _team_obj: Optional[LiteLLM_TeamTable] = LiteLLM_TeamTable( team_id=valid_token.team_id, max_budget=valid_token.team_max_budget, + soft_budget=valid_token.team_soft_budget, spend=valid_token.team_spend, tpm_limit=valid_token.team_tpm_limit, rpm_limit=valid_token.team_rpm_limit, diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 6bbf0df74de..00491675876 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1370,17 +1370,35 @@ class ProxyLogging: ], user_info: CallInfo, ): - if self.alerting is None: - # do nothing if alerting is not switched on + # For soft_budget alerts with alert_emails set, allow email sending even if alerting is None + # This enables team-specific soft budget email alerts via metadata.soft_budget_alerting_emails + # Note: user_info is a CallInfo that can represent user/team/org level info. For team budgets, + # alert_emails is populated from team_object.metadata.soft_budget_alerting_emails (see auth_checks.py) + is_soft_budget_with_alert_emails = ( + type == "soft_budget" + and user_info.alert_emails is not None + and len(user_info.alert_emails) > 0 + ) + + if self.alerting is None and not is_soft_budget_with_alert_emails: + # do nothing if alerting is not switched on (unless it's a soft_budget alert with team-specific emails) return - if "slack" in self.alerting: + if self.alerting is not None and "slack" in self.alerting: await self.slack_alerting_instance.budget_alerts( type=type, user_info=user_info, ) - if "email" in self.alerting and self.email_logging_instance is not None: + # Call email_logging_instance if: + # 1. "email" is in alerting config, OR + # 2. It's a soft_budget alert with team-specific alert_emails (bypasses global alerting config) + should_send_email = ( + (self.alerting is not None and "email" in self.alerting) + or is_soft_budget_with_alert_emails + ) + + if should_send_email and self.email_logging_instance is not None: await self.email_logging_instance.budget_alerts( type=type, user_info=user_info, @@ -2607,7 +2625,8 @@ class PrismaClient: SELECT v.*, t.spend AS team_spend, - t.max_budget AS team_max_budget, + t.max_budget AS team_max_budget, + t.soft_budget AS team_soft_budget, t.tpm_limit AS team_tpm_limit, t.rpm_limit AS team_rpm_limit, t.models AS team_models, From 828b13279ebcb7c242ae4f310cf291f53fb8cc29 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 20:44:43 -0800 Subject: [PATCH 027/300] =?UTF-8?q?bump:=20version=200.1.29=20=E2=86=92=20?= =?UTF-8?q?0.1.30?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- enterprise/pyproject.toml | 4 ++-- requirements.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/enterprise/pyproject.toml b/enterprise/pyproject.toml index c5aaa0a3407..4cb838be036 100644 --- a/enterprise/pyproject.toml +++ b/enterprise/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm-enterprise" -version = "0.1.29" +version = "0.1.30" description = "Package for LiteLLM Enterprise features" authors = ["BerriAI"] readme = "README.md" @@ -22,7 +22,7 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "0.1.29" +version = "0.1.30" version_files = [ "pyproject.toml:version", "../requirements.txt:litellm-enterprise==", diff --git a/requirements.txt b/requirements.txt index 1fb8a22cc90..f0e5059928b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -73,4 +73,4 @@ pypdf>=6.6.2 # for PDF text extraction in RAG ingestion ######################## # LITELLM ENTERPRISE DEPENDENCIES ######################## -litellm-enterprise==0.1.29 +litellm-enterprise==0.1.30 From 7f11fa0a05ade3d606c6672d1728fa36bf8da246 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 20:48:07 -0800 Subject: [PATCH 028/300] enterprise build --- .../dist/litellm_enterprise-0.1.29.tar.gz | Bin 49967 -> 0 bytes ...itellm_enterprise-0.1.30-py3-none-any.whl} | Bin 112486 -> 112487 bytes .../dist/litellm_enterprise-0.1.30.tar.gz | Bin 0 -> 49964 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 enterprise/dist/litellm_enterprise-0.1.29.tar.gz rename enterprise/dist/{litellm_enterprise-0.1.29-py3-none-any.whl => litellm_enterprise-0.1.30-py3-none-any.whl} (91%) create mode 100644 enterprise/dist/litellm_enterprise-0.1.30.tar.gz diff --git a/enterprise/dist/litellm_enterprise-0.1.29.tar.gz b/enterprise/dist/litellm_enterprise-0.1.29.tar.gz deleted file mode 100644 index 1ea224f8f340cd67950787c29ca2591707495089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49967 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 diff --git a/enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.30-py3-none-any.whl similarity index 91% rename from enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl rename to enterprise/dist/litellm_enterprise-0.1.30-py3-none-any.whl index 5eedd1fe876e110a84047318cefd194078254fbb..0165bb096c03e47256e1dbfa11b01b1980590411 100644 GIT binary patch delta 6981 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

<919!*}Nh=QU?pJ}ji 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 Date: Thu, 5 Feb 2026 20:51:55 -0800 Subject: [PATCH 029/300] reverting .29 deletion --- .../litellm_enterprise-0.1.29-py3-none-any.whl | Bin 0 -> 111358 bytes .../dist/litellm_enterprise-0.1.29.tar.gz | Bin 0 -> 48839 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl create mode 100644 enterprise/dist/litellm_enterprise-0.1.29.tar.gz diff --git a/enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.29-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..0895ecbc4271ba78bed1da72468e19f87324b33a GIT binary patch literal 111358 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 literal 0 HcmV?d00001 diff --git a/enterprise/dist/litellm_enterprise-0.1.29.tar.gz b/enterprise/dist/litellm_enterprise-0.1.29.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6781cf26cc9e9feab8ae6a0bacbb31fa52501dd0 GIT binary patch literal 48839 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 Date: Thu, 5 Feb 2026 21:00:05 -0800 Subject: [PATCH 030/300] Adding tests + update pyproject --- poetry.lock | 62 +++++------- pyproject.toml | 2 +- tests/proxy_unit_tests/test_auth_checks.py | 80 ++++++++++++++++ tests/test_litellm/test_utils.py | 105 +++++++++++++++++++++ 4 files changed, 211 insertions(+), 38 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5e926509d54..9a7b9d9d5b2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "a2a-sdk" @@ -398,7 +398,6 @@ files = [ {file = "azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b"}, {file = "azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] requests = ">=2.21.0" @@ -419,7 +418,6 @@ files = [ {file = "azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651"}, {file = "azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] azure-core = ">=1.31.0" @@ -720,7 +718,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "(platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} +markers = {main = "platform_python_implementation != \"PyPy\" or extra == \"proxy\"", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -1151,6 +1149,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] +markers = "python_version == \"3.9\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1180,7 +1179,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1202,6 +1200,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main", "dev", "proxy-dev"] +markers = "python_version >= \"3.10\"" files = [ {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, @@ -1258,7 +1257,6 @@ files = [ {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} [package.dependencies] cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} @@ -2277,11 +2275,11 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0.dev0", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0.dev0" -proto-plus = ">=1.22.3,<2.0.0.dev0" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] name = "google-cloud-resource-manager" @@ -3284,7 +3282,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.3.6" +jsonschema-specifications = ">=2023.03.6" referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -3448,28 +3446,28 @@ openai = ["openai (>=0.27.8)"] [[package]] name = "litellm-enterprise" -version = "0.1.27" +version = "0.1.30" description = "Package for LiteLLM Enterprise features" optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_enterprise-0.1.27-py3-none-any.whl", hash = "sha256:41b9d41d04123f492060a742091006dc1d182b54ce3a1c0e18ee75d623c63e91"}, - {file = "litellm_enterprise-0.1.27.tar.gz", hash = "sha256:aa40c87f7c8df64beb79e75f71e1b5c0a458350efa68527e3491e6f27f2cbd57"}, + {file = "litellm_enterprise-0.1.30-py3-none-any.whl", hash = "sha256:9715e0b99ae431fcc9621cc515b329b55d7dd291c611c3a0842e94869de219dc"}, + {file = "litellm_enterprise-0.1.30.tar.gz", hash = "sha256:5ffbf25720b75e59c157dca5edff5db61b85e85072c340b1aa02f04e3924fe3e"}, ] [[package]] name = "litellm-proxy-extras" -version = "0.4.30" +version = "0.4.31" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_proxy_extras-0.4.30-py3-none-any.whl", hash = "sha256:0b7df68f0968eb817462b847eaee81bba23d935adb2e84d2e342a77711887051"}, - {file = "litellm_proxy_extras-0.4.30.tar.gz", hash = "sha256:5d32f8dc3d37d36fb15ab6995fea706dd8a453ff7f12e70b47cba35e5368da10"}, + {file = "litellm_proxy_extras-0.4.31-py3-none-any.whl", hash = "sha256:f50bee4b21dbe0b1c47ed88dc90cf7a2024b221ff8f6da9343197a1df8ea3ecd"}, + {file = "litellm_proxy_extras-0.4.31.tar.gz", hash = "sha256:0b99a522ca31f2da835bb49037d787257e90269f90c2b5b81a4e8d575edd0778"}, ] [[package]] @@ -3948,7 +3946,6 @@ files = [ {file = "msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1"}, {file = "msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] cryptography = ">=2.5,<49" @@ -3969,7 +3966,6 @@ files = [ {file = "msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca"}, {file = "msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4"}, ] -markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] msal = ">=1.29,<2" @@ -4220,7 +4216,6 @@ files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -markers = {main = "extra == \"extra-proxy\""} [[package]] name = "numpy" @@ -4428,7 +4423,7 @@ files = [ {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] importlib-metadata = ">=6.0,<8.8.0" @@ -4543,7 +4538,7 @@ files = [ {file = "opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c"}, {file = "opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -4561,7 +4556,7 @@ files = [ {file = "opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb"}, {file = "opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953"}, ] -markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} +markers = {main = "python_version >= \"3.10\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -5038,7 +5033,6 @@ files = [ {file = "prisma-0.11.0-py3-none-any.whl", hash = "sha256:22bb869e59a2968b99f3483bb417717273ffbc569fd1e9ceed95e5614cbaf53a"}, {file = "prisma-0.11.0.tar.gz", hash = "sha256:3f2f2fd2361e1ec5ff655f2a04c7860c2f2a5bc4c91f78ca9c5c6349735bf693"}, ] -markers = {main = "extra == \"extra-proxy\""} [package.dependencies] click = ">=7.1.2" @@ -5355,7 +5349,7 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -5578,7 +5572,6 @@ files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] -markers = {main = "extra == \"extra-proxy\" or extra == \"proxy\""} [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} @@ -6680,10 +6673,10 @@ files = [ ] [package.dependencies] -botocore = ">=1.37.4,<2.0a0" +botocore = ">=1.37.4,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.37.4,<2.0a0)"] +crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] [[package]] name = "scikit-learn" @@ -6916,9 +6909,9 @@ tornado = ">=6.4.2,<7" urllib3 = ">=1.26,<3" [package.extras] -all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.0)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] +all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.00)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] bedrock = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)"] -cohere = ["cohere (>=5.9.4,<6.0)"] +cohere = ["cohere (>=5.9.4,<6.00)"] dev = ["dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "ipykernel (>=6.25.0,<7)", "mypy (>=1.7.1,<2)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] docs = ["pydoc-markdown (>=4.8.2) ; python_version < \"3.12\""] fastembed = ["fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\""] @@ -7762,7 +7755,6 @@ files = [ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, ] -markers = {main = "extra == \"extra-proxy\""} [[package]] name = "tornado" @@ -8531,8 +8523,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -<<<<<<< litellm_oss_staging_02_04_2026 -content-hash = "797603dcfef0a79781c7d3cba5dfe18f6aea4aa792220f47487ebc7bd04ae2e3" -======= -content-hash = "e5447e14dd37e324ac07a8fc6286d27e9a0d355ed93ebb24fc11e3f5df12fd3e" ->>>>>>> main +content-hash = "16433b6ceb3c56276021223166394591cfd5a18da40c2244799d56ee3167c366" diff --git a/pyproject.toml b/pyproject.toml index 768a41d2e8b..c4ff0aac209 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ mcp = {version = ">=1.25.0,<2.0.0", optional = true, python = ">=3.10"} a2a-sdk = {version = "^0.3.22", optional = true, python = ">=3.10"} litellm-proxy-extras = {version = "0.4.31", optional = true} rich = {version = "13.7.1", optional = true} -litellm-enterprise = {version = "0.1.27", optional = true} +litellm-enterprise = {version = "0.1.30", optional = true} diskcache = {version = "^5.6.1", optional = true} polars = {version = "^1.31.0", optional = true, python = ">=3.10"} semantic-router = {version = ">=0.1.12", optional = true, python = ">=3.9,<3.14"} diff --git a/tests/proxy_unit_tests/test_auth_checks.py b/tests/proxy_unit_tests/test_auth_checks.py index 05c6e4984af..ee595092995 100644 --- a/tests/proxy_unit_tests/test_auth_checks.py +++ b/tests/proxy_unit_tests/test_auth_checks.py @@ -21,11 +21,13 @@ from litellm.proxy._types import ( LiteLLM_BudgetTable, LiteLLM_UserTable, LiteLLM_TeamTable, + Litellm_EntityType, ) from litellm.proxy.utils import PrismaClient from litellm.proxy.auth.auth_checks import ( can_team_access_model, _virtual_key_soft_budget_check, + _team_soft_budget_check, ) from litellm.proxy.utils import ProxyLogging from litellm.proxy.utils import CallInfo @@ -478,6 +480,84 @@ async def test_virtual_key_soft_budget_check(spend, soft_budget, expect_alert): ), f"Expected alert_triggered to be {expect_alert} for spend={spend}, soft_budget={soft_budget}" +@pytest.mark.parametrize( + "spend, soft_budget, expect_alert, metadata, expected_alert_emails", + [ + (100, 50, True, None, None), # Over soft budget, no metadata + (50, 50, True, None, None), # At soft budget, no metadata + (25, 50, False, None, None), # Under soft budget + (100, None, False, None, None), # No soft budget set + (100, 50, True, {"soft_budget_alerting_emails": ["team1@example.com", "team2@example.com"]}, ["team1@example.com", "team2@example.com"]), # Over soft budget with list of emails + (100, 50, True, {"soft_budget_alerting_emails": "team1@example.com,team2@example.com"}, ["team1@example.com", "team2@example.com"]), # Over soft budget with comma-separated emails + (100, 50, True, {"soft_budget_alerting_emails": ["team1@example.com", "", " ", "team2@example.com"]}, ["team1@example.com", "team2@example.com"]), # Over soft budget with empty strings filtered + ], +) +@pytest.mark.asyncio +async def test_team_soft_budget_check(spend, soft_budget, expect_alert, metadata, expected_alert_emails): + """ + Test cases for _team_soft_budget_check: + 1. Spend over soft budget - should trigger alert + 2. Spend at soft budget - should trigger alert + 3. Spend under soft budget - should not trigger alert + 4. No soft budget set - should not trigger alert + 5. Team with alert emails in metadata (list) - should include alert_emails in CallInfo + 6. Team with alert emails in metadata (comma-separated string) - should parse and include alert_emails + 7. Team with alert emails containing empty strings - should filter them out + """ + alert_triggered = False + captured_call_info = None + + class MockProxyLogging: + async def budget_alerts(self, type, user_info): + nonlocal alert_triggered, captured_call_info + alert_triggered = True + captured_call_info = user_info + assert type == "soft_budget" + assert isinstance(user_info, CallInfo) + + valid_token = UserAPIKeyAuth( + token="test-token", + user_id="test-user", + team_id="test-team", + team_alias="test-team-alias", + key_alias="test-key", + ) + + team_object = LiteLLM_TeamTable( + team_id="test-team", + spend=spend, + soft_budget=soft_budget, + max_budget=100.0, + metadata=metadata, + ) + + proxy_logging_obj = MockProxyLogging() + + await _team_soft_budget_check( + team_object=team_object, + valid_token=valid_token, + proxy_logging_obj=proxy_logging_obj, + ) + + await asyncio.sleep(0.1) # Allow time for the alert task to complete + + assert ( + alert_triggered == expect_alert + ), f"Expected alert_triggered to be {expect_alert} for spend={spend}, soft_budget={soft_budget}" + + if expect_alert: + assert captured_call_info is not None + assert captured_call_info.team_id == "test-team" + assert captured_call_info.spend == spend + assert captured_call_info.soft_budget == soft_budget + assert captured_call_info.event_group == Litellm_EntityType.TEAM + # Verify alert_emails if expected + if expected_alert_emails is not None: + assert captured_call_info.alert_emails == expected_alert_emails + else: + assert captured_call_info.alert_emails is None or captured_call_info.alert_emails == [] + + @pytest.mark.asyncio async def test_can_user_call_model(): from litellm.proxy.auth.auth_checks import can_user_call_model diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index c7803445eb4..ee23811d5ac 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -2870,6 +2870,111 @@ class TestProxyLoggingBudgetAlerts: type=alert_type, user_info=user_info ) + async def test_budget_alerts_soft_budget_with_alert_emails_bypasses_alerting_none(self): + """ + Test that soft_budget alerts with alert_emails bypass the alerting=None check + and send emails even when alerting is None. + + This tests the new logic that allows team-specific soft budget email alerts + via metadata.soft_budget_alerting_emails to work even when global alerting is disabled. + """ + from litellm.caching.caching import DualCache + from litellm.proxy.utils import ProxyLogging + from litellm.proxy._types import CallInfo, Litellm_EntityType + + proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) + proxy_logging.alerting = None # Global alerting is disabled + proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.email_logging_instance = AsyncMock() + + # Create CallInfo with alert_emails set (simulating team metadata extraction) + user_info = CallInfo( + token="test-token", + spend=100.0, + soft_budget=50.0, + user_id="test-user", + team_id="test-team", + team_alias="test-team-alias", + event_group=Litellm_EntityType.TEAM, + alert_emails=["team1@example.com", "team2@example.com"], + ) + + # Should send email even though alerting is None (because of alert_emails) + await proxy_logging.budget_alerts(type="soft_budget", user_info=user_info) + + # Verify slack was NOT called (alerting is None) + proxy_logging.slack_alerting_instance.budget_alerts.assert_not_called() + + # Verify email WAS called (bypasses alerting=None check) + proxy_logging.email_logging_instance.budget_alerts.assert_called_once_with( + type="soft_budget", user_info=user_info + ) + + async def test_budget_alerts_soft_budget_without_alert_emails_respects_alerting_none(self): + """ + Test that soft_budget alerts WITHOUT alert_emails still respect alerting=None + and do not send emails when alerting is None. + """ + from litellm.caching.caching import DualCache + from litellm.proxy.utils import ProxyLogging + from litellm.proxy._types import CallInfo, Litellm_EntityType + + proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) + proxy_logging.alerting = None + proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.email_logging_instance = AsyncMock() + + # Create CallInfo WITHOUT alert_emails + user_info = CallInfo( + token="test-token", + spend=100.0, + soft_budget=50.0, + user_id="test-user", + team_id="test-team", + team_alias="test-team-alias", + event_group=Litellm_EntityType.TEAM, + alert_emails=None, # No alert emails + ) + + # Should NOT send email (alerting is None and no alert_emails) + await proxy_logging.budget_alerts(type="soft_budget", user_info=user_info) + + # Verify no calls were made + proxy_logging.slack_alerting_instance.budget_alerts.assert_not_called() + proxy_logging.email_logging_instance.budget_alerts.assert_not_called() + + async def test_budget_alerts_soft_budget_with_empty_alert_emails_respects_alerting_none(self): + """ + Test that soft_budget alerts with empty alert_emails list still respect alerting=None. + """ + from litellm.caching.caching import DualCache + from litellm.proxy.utils import ProxyLogging + from litellm.proxy._types import CallInfo, Litellm_EntityType + + proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) + proxy_logging.alerting = None + proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.email_logging_instance = AsyncMock() + + # Create CallInfo with empty alert_emails list + user_info = CallInfo( + token="test-token", + spend=100.0, + soft_budget=50.0, + user_id="test-user", + team_id="test-team", + team_alias="test-team-alias", + event_group=Litellm_EntityType.TEAM, + alert_emails=[], # Empty list + ) + + # Should NOT send email (alert_emails is empty) + await proxy_logging.budget_alerts(type="soft_budget", user_info=user_info) + + # Verify no calls were made + proxy_logging.slack_alerting_instance.budget_alerts.assert_not_called() + proxy_logging.email_logging_instance.budget_alerts.assert_not_called() + def test_azure_ai_claude_provider_config(): """Test that Azure AI Claude models return AzureAnthropicConfig for proper tool transformation.""" From b60d94d655a55c39b4694652d519e7bd68abc718 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 21:27:42 -0800 Subject: [PATCH 031/300] addressing comments --- .../send_emails/base_email.py | 21 ++++++- litellm/proxy/auth/auth_checks.py | 9 +++ litellm/proxy/utils.py | 9 +-- poetry.lock | 58 +++++++++++-------- 4 files changed, 66 insertions(+), 31 deletions(-) diff --git a/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py b/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py index 1e87e5594fc..d3e04769300 100644 --- a/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/send_emails/base_email.py @@ -245,15 +245,25 @@ class BaseEmailLogger(CustomLogger): ) return + # Validate that we have at least one valid email address + first_recipient_email = recipient_emails[0] + if not first_recipient_email or not first_recipient_email.strip(): + verbose_proxy_logger.warning( + f"Invalid recipient email found for team soft budget alert. event={event.model_dump(exclude_none=True)}" + ) + return + verbose_proxy_logger.debug( f"send_team_soft_budget_alert_email_event: {json.dumps(event.model_dump(exclude_none=True), indent=4, default=str)}" ) # Get email params using the first recipient email (for template formatting) + # For team alerts with alert_emails, we don't need user_id lookup since we already have email addresses + # Pass user_id=None to prevent _get_email_params from trying to look up email from a potentially None user_id email_params = await self._get_email_params( email_event=EmailEvent.soft_budget_crossed, - user_id=event.user_id, - user_email=recipient_emails[0], + user_id=None, # Team alerts don't require user_id when alert_emails are provided + user_email=first_recipient_email, event_message=event.event_message, ) @@ -361,6 +371,13 @@ class BaseEmailLogger(CustomLogger): if user_info.event_group == Litellm_EntityType.TEAM: if user_info.soft_budget is None: return + # For team soft budget alerts, require alert_emails to be configured + # Team soft budget alerts are sent via metadata.soft_budget_alerting_emails + if user_info.alert_emails is None or len(user_info.alert_emails) == 0: + verbose_proxy_logger.debug( + "Skipping team soft budget email alert: no alert_emails configured", + ) + return else: # For non-team alerts, require either max_budget or soft_budget if user_info.max_budget is None and user_info.soft_budget is None: diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 437ef0d438b..2bacd1f936d 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -2465,6 +2465,15 @@ async def _team_soft_budget_check( else: alert_emails = None + # Only send team soft budget alerts if alert_emails are configured + # Team soft budget alerts are sent via metadata.soft_budget_alerting_emails, not global alerting + if alert_emails is None or len(alert_emails) == 0: + verbose_proxy_logger.debug( + "Skipping team soft budget alert for team %s: no alert_emails configured in metadata.soft_budget_alerting_emails", + team_object.team_id, + ) + return + call_info = CallInfo( token=valid_token.token, spend=team_object.spend, diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 00491675876..0aace65ff6b 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1385,10 +1385,11 @@ class ProxyLogging: return if self.alerting is not None and "slack" in self.alerting: - await self.slack_alerting_instance.budget_alerts( - type=type, - user_info=user_info, - ) + if self.slack_alerting_instance is not None: + await self.slack_alerting_instance.budget_alerts( + type=type, + user_info=user_info, + ) # Call email_logging_instance if: # 1. "email" is in alerting config, OR diff --git a/poetry.lock b/poetry.lock index 9a7b9d9d5b2..b37fd863431 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. [[package]] name = "a2a-sdk" @@ -398,6 +398,7 @@ files = [ {file = "azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b"}, {file = "azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] requests = ">=2.21.0" @@ -418,6 +419,7 @@ files = [ {file = "azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651"}, {file = "azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] azure-core = ">=1.31.0" @@ -718,7 +720,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" or extra == \"proxy\"", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} +markers = {main = "(platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -1149,7 +1151,6 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] -markers = "python_version == \"3.9\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1179,6 +1180,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1200,7 +1202,6 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main", "dev", "proxy-dev"] -markers = "python_version >= \"3.10\"" files = [ {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, @@ -1257,6 +1258,7 @@ files = [ {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, ] +markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} [package.dependencies] cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} @@ -2275,11 +2277,11 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0.dev0", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0.dev0" +proto-plus = ">=1.22.3,<2.0.0.dev0" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [[package]] name = "google-cloud-resource-manager" @@ -3282,7 +3284,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" +jsonschema-specifications = ">=2023.3.6" referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -3446,28 +3448,28 @@ openai = ["openai (>=0.27.8)"] [[package]] name = "litellm-enterprise" -version = "0.1.30" +version = "0.1.27" description = "Package for LiteLLM Enterprise features" optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_enterprise-0.1.30-py3-none-any.whl", hash = "sha256:9715e0b99ae431fcc9621cc515b329b55d7dd291c611c3a0842e94869de219dc"}, - {file = "litellm_enterprise-0.1.30.tar.gz", hash = "sha256:5ffbf25720b75e59c157dca5edff5db61b85e85072c340b1aa02f04e3924fe3e"}, + {file = "litellm_enterprise-0.1.27-py3-none-any.whl", hash = "sha256:41b9d41d04123f492060a742091006dc1d182b54ce3a1c0e18ee75d623c63e91"}, + {file = "litellm_enterprise-0.1.27.tar.gz", hash = "sha256:aa40c87f7c8df64beb79e75f71e1b5c0a458350efa68527e3491e6f27f2cbd57"}, ] [[package]] name = "litellm-proxy-extras" -version = "0.4.31" +version = "0.4.30" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_proxy_extras-0.4.31-py3-none-any.whl", hash = "sha256:f50bee4b21dbe0b1c47ed88dc90cf7a2024b221ff8f6da9343197a1df8ea3ecd"}, - {file = "litellm_proxy_extras-0.4.31.tar.gz", hash = "sha256:0b99a522ca31f2da835bb49037d787257e90269f90c2b5b81a4e8d575edd0778"}, + {file = "litellm_proxy_extras-0.4.30-py3-none-any.whl", hash = "sha256:0b7df68f0968eb817462b847eaee81bba23d935adb2e84d2e342a77711887051"}, + {file = "litellm_proxy_extras-0.4.30.tar.gz", hash = "sha256:5d32f8dc3d37d36fb15ab6995fea706dd8a453ff7f12e70b47cba35e5368da10"}, ] [[package]] @@ -3946,6 +3948,7 @@ files = [ {file = "msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1"}, {file = "msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] cryptography = ">=2.5,<49" @@ -3966,6 +3969,7 @@ files = [ {file = "msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca"}, {file = "msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] msal = ">=1.29,<2" @@ -4216,6 +4220,7 @@ files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] +markers = {main = "extra == \"extra-proxy\""} [[package]] name = "numpy" @@ -4423,7 +4428,7 @@ files = [ {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] importlib-metadata = ">=6.0,<8.8.0" @@ -4538,7 +4543,7 @@ files = [ {file = "opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c"}, {file = "opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -4556,7 +4561,7 @@ files = [ {file = "opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb"}, {file = "opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -5033,6 +5038,7 @@ files = [ {file = "prisma-0.11.0-py3-none-any.whl", hash = "sha256:22bb869e59a2968b99f3483bb417717273ffbc569fd1e9ceed95e5614cbaf53a"}, {file = "prisma-0.11.0.tar.gz", hash = "sha256:3f2f2fd2361e1ec5ff655f2a04c7860c2f2a5bc4c91f78ca9c5c6349735bf693"}, ] +markers = {main = "extra == \"extra-proxy\""} [package.dependencies] click = ">=7.1.2" @@ -5349,7 +5355,7 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -5572,6 +5578,7 @@ files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] +markers = {main = "extra == \"extra-proxy\" or extra == \"proxy\""} [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} @@ -6673,10 +6680,10 @@ files = [ ] [package.dependencies] -botocore = ">=1.37.4,<2.0a.0" +botocore = ">=1.37.4,<2.0a0" [package.extras] -crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] +crt = ["botocore[crt] (>=1.37.4,<2.0a0)"] [[package]] name = "scikit-learn" @@ -6909,9 +6916,9 @@ tornado = ">=6.4.2,<7" urllib3 = ">=1.26,<3" [package.extras] -all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.00)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] +all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.0)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] bedrock = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)"] -cohere = ["cohere (>=5.9.4,<6.00)"] +cohere = ["cohere (>=5.9.4,<6.0)"] dev = ["dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "ipykernel (>=6.25.0,<7)", "mypy (>=1.7.1,<2)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] docs = ["pydoc-markdown (>=4.8.2) ; python_version < \"3.12\""] fastembed = ["fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\""] @@ -7755,6 +7762,7 @@ files = [ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, ] +markers = {main = "extra == \"extra-proxy\""} [[package]] name = "tornado" @@ -8523,4 +8531,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "16433b6ceb3c56276021223166394591cfd5a18da40c2244799d56ee3167c366" +content-hash = "e5447e14dd37e324ac07a8fc6286d27e9a0d355ed93ebb24fc11e3f5df12fd3e" From e39530d0e6cd7449be31a80bfe67c39064f0867b Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 21:28:13 -0800 Subject: [PATCH 032/300] =?UTF-8?q?bump:=20version=200.1.30=20=E2=86=92=20?= =?UTF-8?q?0.1.31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- enterprise/pyproject.toml | 4 ++-- pyproject.toml | 2 +- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/enterprise/pyproject.toml b/enterprise/pyproject.toml index 4cb838be036..eca5cdb97df 100644 --- a/enterprise/pyproject.toml +++ b/enterprise/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm-enterprise" -version = "0.1.30" +version = "0.1.31" description = "Package for LiteLLM Enterprise features" authors = ["BerriAI"] readme = "README.md" @@ -22,7 +22,7 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "0.1.30" +version = "0.1.31" version_files = [ "pyproject.toml:version", "../requirements.txt:litellm-enterprise==", diff --git a/pyproject.toml b/pyproject.toml index c4ff0aac209..fe76d8e15df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ mcp = {version = ">=1.25.0,<2.0.0", optional = true, python = ">=3.10"} a2a-sdk = {version = "^0.3.22", optional = true, python = ">=3.10"} litellm-proxy-extras = {version = "0.4.31", optional = true} rich = {version = "13.7.1", optional = true} -litellm-enterprise = {version = "0.1.30", optional = true} +litellm-enterprise = {version = "0.1.31", optional = true} diskcache = {version = "^5.6.1", optional = true} polars = {version = "^1.31.0", optional = true, python = ">=3.10"} semantic-router = {version = ">=0.1.12", optional = true, python = ">=3.9,<3.14"} diff --git a/requirements.txt b/requirements.txt index f0e5059928b..8b69d4ac85c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -73,4 +73,4 @@ pypdf>=6.6.2 # for PDF text extraction in RAG ingestion ######################## # LITELLM ENTERPRISE DEPENDENCIES ######################## -litellm-enterprise==0.1.30 +litellm-enterprise==0.1.31 From b3f0dccf56229d06a019054c2cd12ddf777badc1 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 21:31:20 -0800 Subject: [PATCH 033/300] enterprise build --- .../litellm_enterprise-0.1.31-py3-none-any.whl | Bin 0 -> 112741 bytes .../dist/litellm_enterprise-0.1.31.tar.gz | Bin 0 -> 50205 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 enterprise/dist/litellm_enterprise-0.1.31-py3-none-any.whl create mode 100644 enterprise/dist/litellm_enterprise-0.1.31.tar.gz diff --git a/enterprise/dist/litellm_enterprise-0.1.31-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.31-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..03cadbd902329b9f1ea76b9be23d1786eddf3224 GIT binary patch literal 112741 zcmbrGbxT3{7ejR{7{yKd92)>53g|msZwT+&Mt+R=vy`zPb z38S8#g{_6No*sj}2Plxj->%j@jO1(w0|L541p?yzpRfMEH_|gQu(mcdFtT!D{6A-U zMs~K&j&{~gU-ur=n6%yJKh8Porz~dA2$C%`{s4H!U=iq9D0%0JZ1=J>MlJ{aCWw*GPVdNFX2J4%Zh z3>$yBZr+_LSG6WD<&ZQLqeQo>gm7EfkYymzx@4qo(Jxe1rDx?syU2}|TAXfCo`c?L zHjK0e`vj0DLW8l5RAbX;#5atxsTc&a2I?C3D>`klb#%_sE(_Ze_tT4Wz$R}O*h$lj zaaEmXVd&KW=xxgPLSfcMMvavgRHR$P)x%>-$($UWwrF~-JPe{g!GBbi7Z_Mh%CIWe zldB}6sbwXn6nacbD?P&4`>un!<)U_CO}ID^yZLSFY)=s(xe;t($uQrxOy#JU^A zGs}!meE2KLYHP75^l*bWNY8>E+ddgpKK))|-?#h<^r)v?mv}b9M&nJ0z~lS7by5F7 z&i6p#>NwyyWe8txrJ;=C+?yP>=%owev6y{)M<=!V4(+1x14{|ec9hjs%d9`%!R2}k zJ08~8GPjnXvaLUPjG?Em{L>T%wH_yT%5yiHXREu{a27D2;Vo@i1LZqR_7%>qFTA>+ zEj08h%i18g>FT;#wuR^om#N~6iBF>vc6j}8l&r2%dh?3rTQct{;UMqH-}v)rPFomV ziqE8xC87s@d}k9Wl`T}BJlS9P<{kWjaPUZZUvHHV-_dzLr76UGq)?_%8g zeqpB>J`=IMUA+qLo^tjxc5mB8AtxHHP9$fJd9&K z6`oBV=Cc>Fd~$z=8!s3%=oa0r_SAjQ)BDqS8wMaG%_Oj54w{0L-$ON3%0528*2Pz1 z@s==NbZlK{?JO}?%s6^d$UKJ}=sx~hZneNsA+VPBvulAb{p#WMlmM8I_hRF?nWlU7 z50~@mW7A^AI=jRY(TW|_!)X7`F!aL&NBY*~$#$1rsl~Nwh_(IMZWCt54@*()%FfB3 zYICGw?5tU}Ja+;BNJUh#@(#vZS=K{}Y=pP^1(Sqf3yLJ%;0%fe<3C6g-Ewa@^R)Qa z>!V!~+$~{(Q{$JolGip-Cn_`p3~Sm*{c&%D+uJ3oy! zoDUeGyVEx~*6mO>?L0H~_mdTUJ(%8}m*?$4R1(d}HMFlZj+6I6v06 zxN{>Bt2Xs!5~49RNj68R78Zy+D`qoqMH{rA>wg5g^X3+h+k3{2DLV+9Ry$A(!eL_9 z2GmVEg4@_1>YOyL4*McCD!Q_nf+5W9zV=TO8sVxftR$h_ik+o+zaCUZgmhAx8Q|5n ze^O=KhMjOdiXSoJV%1ka%&4y-bk4%iAlTVC5EXN_a;B1gkPj<|BgPKM1aypGpKCJ9 z^4Ip-%_cZG${Rv5H~)ci5Gup66<*I7$VHafFRVj&dvw z4qlGm(hxe#q+}?*tu#R6^ieeijLMSi>VKf$`gUu!Kc8Qxw@-dUJJ7^1N2dG#muh*K3Of~@?B>y)?*`t0TpF~~gwZDdT`UJnwE2hGC zaD#|Y`&1-Zj0cwTc#D1%#rXFQot$a@=M9t;9ElM;vG!=v&t1=iMgj&6yA~~($xhKx zM6cJx3W_j6d0Q4j%Vqhdg!ZiJcn3p7c^>yFm1U8l7KT#2U(_YXcWK@Na>tmsrm z`y*@FC(+mjFtitYV@5)Og8V|&a}ks?niRfz(Tw!s?|+V$K7eQtHwrx*I$2yS1N$Wo zR#%mx_<97)cMV=Y5+c>EdBm`EyM|XmVW4vJs$2+_XYmqa~hEPeo z-p8VxhP{M{Z&;5LJaDA;Q_gn0#_jvDPZ1W#c0h;EDjUT29>G7pKo+54k8h2Sb@PFx20cMxVpdkV_MU03J z?w*!LX1`&NJMb#CzI@cm>;80jH0<(Ujv7C`!_LYw(9@#ZHEzr5{MMd6&ERM5;7w<; zraploz~|a4k{yFtT${p}oUK)fcM85qD!GeV>M(gi*hC7BhaM+s2NwUMXp9UQP5DZrFyG%|hVkc)cq0}D7-I6>nAHg>mSO0lrR2j)r z*&)~ujF-3}f-{ZK0LJTVMR&(kLoTAPA+G4CfJ$U2AdO7ePwU3xTF5o^kq!u;UnLT0 zL1w9kY>EV~NT|}SvL1gWo_}3w=IirqP}brI_tK`Wso=JJ6*c;Uv%j>Pc@{0a*&ox} ze&iLW8*@Fmi(VE7+MK;Ie7U-gvdE1@QnMO9(lA*9(Cwo`K#6#-7kBUV8;p_swYgoC zHGvr@$jE~8>U8}_Wvl{7qdfsD&!CUX@n9@4ejqNu;BBkP{a+v>PH!r?rnz z#lpk-p7qGiDtmSGGVc)88uWa;%B`G#r&+-d^N^uV+=}e!*O0cS)Gnc@u;MHP{^jY^p~V~3RzX)*H~W^>M_Vp& zm4Mr%@<*f zy{#<}>WnWe$CG#fN!a6TRPVv>5Er=upMRdN15<-tv-c}gqBB;DNLHDUOO&u( z8Q^kajxJoJ!FV0B48vfhejbThRm01RNj>bHo$cKl0i_lfgvVnBCMu)p@d_kn%I)`g zDKsku*@@L>=B=R>sL6N<6~{zJIg!Vqw!8BSTD5xepM~qAmu!=)OfyXR25dG=Sg#+m zgTX`--UX8~UJmMzk#9n9M*7%rKdr!aOoW%V9R*9wqSIr>1E94eB3NGumL>#zTwFXo96TP679_N_mE|*Wrc)8P4ui8-?w)j@eR1=FhOkh=^z__48wn)iTe!jQ--N=>*S9A5PB>-`rKg%#Xg&3hgbAZ&D67822oD6?U^NmdOX8Irn+lX`|a z^#Yj`A!1U%-hhTXt~&G4fg9*;N6xC*G9mQ>1qA5{Nv&Bw?O`U-Xq(eb4+1Wn5e~Ev zOQLmfyx)<+0J4+0Bq@epsSq@jKA` z?%BFsR|X+3Uf?c?7GFzVvdYQPRgJKCdP;wJz@j(2>97)Zg#Pi>@C!WTqB}+YFvaa~ zk~cDz98nh!m?(6gP$5n5(v_xR4EMsGy1|o2H$yJ6D6X7H37V37KWQXKw8%kf5zZiF z$lwZq;84Pk_At9z`Oa~*stT*Q=^G0aOURlM)AbL=>!PqpVR)ST_rlJ(kJL=Ovk!4Q z6O2`HJ|L(l8hO^NDk8VqyD~^!SBe-e*w$ScaW7WD^VZ`Md-!`S)3sAwvv4eIwlL8W ziT!%5yhbd<1Ha+~9kHt~8&EL7j_MSP1^dL|GUd{@Dr|D?^7P2S4Fy(Pkd1q-_dRz1 z!4vQi0=as4%B((H(_7D^U*CvrOJs1o>8G9O8+=Uf_gZ?HJ}es~qB~5YH&JkcGDOF# zpU*yrWq#^n<@!$31qsPRDl59B-e zXI#lhENpINiJ2LOX<=fYU+x8<V5+Y(C z{l>l3ahBe(M-uFK&qWn{42xrXX~3JYwg{@jB=`wW3tcll${HR1XAJVR! zud%%S;c_JCc(+YMQ0&*6aYZHV3v^r|2rt&^aG%-BWD7afZM>%aFKI)n+m->@c)zjo z38e?(EQZg%XKWp7-D_WJu#?0hxaF#r8_$kVgA*La?te?-7RslG+2a+o1*mdSx{`ONM*ParT1VTySL$_qzVZD4a+<_ z{z$DqZ(b4W{jr7ilD$a+Lo{)Kg?ong z$uGW}moxt%@4GYfLENuJweA-EX&*)VI2{O0t+PPuzXJKN!<%F+ZL7vC2rE1aIfbRk zM1w4!iqdKr++dQR@I6tZo=h`|3YHK^rUQZjI5O!Xf{%qCLL;U~k~DoN1ulKai2xQN zN+cDA`ixQ;90BCeAowS=0A29JQm^#b+v>1iP>PbEE(sO_)Ehnt zkG!odLzCxi9nKFHY%1~d2ch%OEEQ zaPfY+dw$GnJ)ME$<96c0K^O>!l(znWu{$xpHZOM%R*U`Y-esapE-^y>hH_ca11vTs zmJhEI6nKb+7D|q*SH<_kA8}W?QoIfPS_gIcwTmD4S~>XPFKG7lQN}#5`H&8f z>p4=&S^=oZk$p_}0h9XtPRsaMvyhuUwv~+7wV!_iDBR}$kapweXxKha zq3Kq*QZ>Vg=V=YYvZSo&Jizkq8X;!X7jpeHf$PZEf#B{pvMBV`{N5N%{_F;ha)A8J zGbo$tg1=QV2_BE2Pda1WuuEGa2+Ih%VkX$695106VqTkbrS>>ps2tk>Ats};hs*-G z-+zg`JE?=s3&c0|r5rK0pG7`ogS678m5ECIo5hVLqJB7kj$Wk(mZXzv+Sq(FC=x$ z)$hgZPOQcSUZMQ_R1{thY7haOmIJ)B)inX%d%E#SK>~ixz|5*40_}1^Zn{cc0geIY zcq%kexgOkvu+pp-_Ti-f`(PJ-P;y&&tJul!B~AOeR|bPs5CQB6BOW+myyv3 zVswO8v9>9T$tr<1vXJ;5Q`?G2SFWax>b7j>HA=9(tXDP1-*)gCN@NMnolkC83PoJ^ zG}Bz<*-|MEh+2w?!Z9CwNtmEE_s@IS&Lh>T?Qve(Urz&ToOmJ8J}jug8H)aD5JWS6@Jz{B$x5#>BO z=ZYKOIyHbYhXt#|=yy$wBZ#`C^7@7LWHVW#i!6azU_EMTy{Epy3*GEvk&j~;tIOnl zw@dM?b40hsEwU5L++)L_6$MTboI@o|WQBPlaCI5QZCK5`Vq3MT`-9aTwq-#>WF53< zI*n_1%lT}GYK$o)So3kC=HRQV2f>jKfl%fu(Ru*2e;=A|k z>!@I67fS!wYm<^+n~nqO?406y9t> z(Zs^ZTCC0!BOh4oG}1PhSX~FWo2hgzpn$U9s}5HnJYDh%;RRBq4E{?r4YpRW2aJq) zKZn|z0?)1?tr;tMe{CJ<{xU+WNL|BRDa&fSj(%MiW4j5fnIX)e}}}VMU^@hPW6XXsVnAcFtb_OQj@>XOlnHY z%;2-Cd-P;&@Pl6x>EnknUDmZ>Te|pQSDy}8IH<6!;vg~mP-RyO15Ype468p&nSA{$ zbl6r*l9S3B>kc%30PN$E{%%fnyHf4bQ(12fxcAdqxAFTuSAENU&G`MuEbXr1ypw@Z zx0kY6W#hQOWW$I=`f!M^TqAD%O>wz#-zMW7v8zsb0Y~l!`_q;kH9DH2LQ|m9CMI)q zX=ilk>M|92B%zOEGE-!nH<7ZPtv)IW28%WwKsPd8>b=@*rAnr$=*XSMI(y@^oh=lT z&C@SBQ`Swcd;^xQcFi5Xg!Hx{|D?gjsF@2SgWIk5n~aEeEt#=Mk8gMwpa6hvI*rmG zBbRB^S>9Lf@m`K|9L&#hn^@~y+8i)fz+2jt6iB9+h?%CW`m&pZtKG+l4zK4`9aI@J zGR-Q3h+p4D*-eEWK>eG$K%<6wJ1>I9a4NGrFTL>gJ3LMU4H=m9a^O%Uv4JcTt+JEh z<9unqvcEsLZYhVIBipsEwbKi?O|1jt2Rmc&1>+sjxQ-MsJR`vZnFfJ*VyDI3!V-KO zx5#A{eJ*K3UL@D0GS_hqm)_;`wbC~yflP-k;@!E%)t@uqElh_{Dw$MOIwGMDKFJ1* zk_XP4$O1G*icVvlt}-37*DK>`T4#!(7rAFktAL`-k2y6<=p$K67coXm>!CurmSVCX%a9?`nk1Mi5qpfup!NtC>GRm_db0B~J$CmL zo(1!tuCV;M#bYYFY&(s;)F;C-_GgrP*@SqWCl{wi7!qI)Fyy)ie;(IYxPtN97u42S z1g0I=58H~B6t$OjV3#c8RGB9IH_ULClB(vwoMo*~Ic*|gUAzX z%QxCn))pqwjpE9;a~lozwKK%ji*dB@gt6=4lFahizau!Wd9uT3ExsE!UM6Je3NLFb zZQnc8P5Q|9htYpka6q#US*Ye`IJU~hwG%%X#oA?Del4|omw^mYPStHpbSN2c|0IWD zqIDlJCE&PUJOtaj3K-TO7<^@N66<}0ap;jIre1L;i zHTA{r?}8+OFT67X76__7aW*k>wy?APQX`i-o3ZHD!hJ(?x_@)!Jmoy(k}av&-?Lys zC#-m@QK6$uic-%W9(th}4JC{Hjs?k|#kz~=6)z%D@(JTdzMt-Xf7knbuCRDR=oGvz zEVPXN2xnNpGTJ(y?Lbl@&HpKHS?tO8%uH8HfJhBVw0WHo(8=v@tI8Ui{IZD{+Mm{M zz;ptS9C`!ynQQDJeAA>?;@FqMJj{(5fXCF;qw%O?27L&$4EmAs=oQ4@=Rmpu- z!0KZw|-qO_Q38HXMr`Wg7t9rxrv>KmB#YDz8wCQIiL9} zYW(-v$vd`ZOdzwIWND?N%FKC4(|KSDlNLJ8k}PNc((ZT~u;Ul|6_eACT=A=mb+z}4CFer9rzLLmS!5xnZ%S~>$SGSV?IpzK+7g2E7!=4dEyp<-aqI3#NWPi; zK~vibS|g6S-Ak}|hgS;ncF*dvk|M12&1#)ZW}yMNSP5vl0LUo5rI0U1sX>nakW&*} zjv0N#17~!AXQnfSEtYqnC#iSGws(L>%6>O(QqN^Jlf#FhG+yEYp<$23;-V>)hhvux zhdo0B9|!xj!Ws@Uzz2b|3*}Xw2XcC$ZE$tID(L(O%dSTq$;H&IBiH6>=TG;#Cg>6i z9vMd_jX%izc0Vfwk7gKkP!M8N-bALSLmCdXBk4xdc%VzFK9N+;i$(hith6x zyFcWbHFa#+OQ*MG-VbE_Q-fDU_#U=M*fRM93;qyU&6sglMIq=I4#6scQxe;n9YRXacS!H5Md(>k&MR2TJ zjM*TXpNcUV;n1#eX28E1{1nk9x<@F`qahKM>`~@@B#VV_lVmfB2YBjGqxO17qmAet zWII4D{Jotm?ff>$Ehq6+6h-?yPLouQesty-u(xB3z5EpJ=>mG4@@@KgNem3t<6ia& zPeqPmSRbY_hcm`XP_#O6?Mv5$b@j(jge#`Z^+|7?=lO7-Wo=kRMbekGSKol>2{{`4 zHo9ox=Loeg(UoE&Qg)}zvpumlt&^pG>F*ix4V_rI&@!J1Y1kunRy+CX_eAz6*kwpc zyE1-8(sAL3tW7S6aydW?vfu-GEH5uB9@jG%^|cUK2KX(i|F>QigQJ%SGhbtp>VysD zgQ@}Qqpzeg)={zSR5^4nI%0S~lonhU5O}DJe72As>O?YFcrP?2l}8}k;mR4o`2KT*&Rw6F9D^-_Z9vtx)qQtOw6=oRJ!c` z+9d>jO0rga!j2}lbkN-n6#arbmLBinpD9y86SQ|%x=}_qgU!W}PT>PG6`!z*^Vxv1@jtl>m>OR542t0sG2sa*aIT5bfSG(9 z(Ck~gerp%P^zZ&kZ72RtkqVakSEB3k% zDAu!-Y#C^v#Zj3q-y8LUeShmq7Xm68bcouA5RV7K_8L*K$b%#1U-cBRPxSKRA*PRf zz1T>er6X;9YJkw(Z;>!8huFaM6hK#DkCh+`rc46Qb-)K@AA3~N$AXzg;-u$63#1Q`S8F^4ReluL?E$2tflx?*ggY9%*N{sG%ij7c^h*fqx zS_tu>N|=Ejaw%#8>!Va}0Qsh!=DE8J9BMJ$&a zIa(F$iUo(JfPF&23f?7=7KWhzNVcYl^L6Y(my#%N)rg}b&_iB)K*Na33smkMEV7%T zW?R2_M1RxsTZ&53#~4&taORW!t5DfIrXLJMCY%uk+9{$ZEUFs(`@^47%yyg1!4D-G zK9|Q3(e`HNrqVlR!AX3(9YFW2uR#tb1Xp7uGw=Ozbb6&WR;hxBl;ch9FPTGR2+rfH zD_;g=tgLKGXLY-!oFl4Ah za!sCA?qp&Hm{QmG7%Dwbr^5h{Mzj!%pgrSX8hp)IyUpwq;L`c()Gu1!R3R%(d8=7` z>7-MG>kkZgDQ*gzu$B z1|E(vNTs)BYv7hRmJDvzhk2pK&_iS%Hy2MoYLL2+jkn!k}{A$ zuiAz*6|qB#>hS*qC7Ll#GD@0AR*aF}ZEj0rDDK`_x7s+_%mswWF@C( z)sJJH5fOR5MPjRvW`>RxkX}cuG33uj$G~>Ptm0wbp6S*uAQ(-ino3z}TYKCCos8YpMJ7cE{>B_nUBAO{|?Ri2A#A>=52L0#WgUc`-fEkehom1G)g+T6I?o2aik}G&Njmhb;|v8#@u6n-PFc*UbJ- z-%O+FJ=@rnKFe{Nur{rSZ8yy-#V1Wws}Vryl3)ASyAJXan*N5&x#tbR{)pDuw)yn=)9${c?VCv{%;rv(MrNZp@ASN`QYxNDJBq0*8 zW^)X|AV@d9Bnz-Q|$r;*IJ^7&6C% zYDHmP*mN^q%yr>j9zdcdnaN;rSqMl#^kKo4U?_}oQ*t_t%G~*n!lxnfKE>B)+Ko-r zcs}PnEvBKlL>VqP_rAxd2KmG9JzuTxeo`I}5^Ob5rfhC8rMPJ2m*sFyCrR|G>v{Bb z6ZrNeL@6hHlO&$BG_?@pFMG&Tv)!rKYBrjZ50_@;l6lQL()p!{sCVW-o-;D%a>~i( zpM5;BTZYpx!#Ut@SR)&x+nq;O5*G|c;JWos)59P6q=sb@5gcJD--6{4f z^J6U_|8Oi28*t}@6x$RU$tWYvw$pCk{~)*sriAf5`k@bZ=LhCvB%0;{Z zP&oscQ&l69Q~57E1+3mmHZEE7MDD^gmF)hEm7`cKuHNx@iMy>v7K`O${75zeUfR^4 z*E&F{=mWn7DMU%NLP#+yfEYHkqkGJ$?PhVR#8jnTx3bf3otM&=V+ z|JM2X&0+)#{fqA8*O2-rbj?ik{Vz$7#7%d*U{%=J#!E-x+Qe=B5m`WdU9vkgv~=`g{c-T3SMUP{bTIt6VJM+GjpPviLp{}A?5>}LW5n5;h?5!6GYgGKq^8dgy&2j_dXx}u6_!3K?=Q@GWL{yK?T(te}jjSi?V>LFi zwobp&L_VtTvfAx6KXr;FLy+h-)q0#W;DC4AiWbRn=t)dd?mun~9f{FYs7%bBnvqgi8)fWyM494|FPbCRvXbPRK%`-%X&!b==4;I^lQB3z$H z>w?8%GeFze-RQNpD;B)h2StcoGerj17OeKPGSUWIwq8A!pXbw)VT)^zo*W|a&aA5S z*yT#xnTqZbYt6iTswMQag?Ca0K#X8aY!Xm9~%j9oygBg1Xz9 z6n+i5>V@*hZR6AQBiaI|aNXV=`-(e|npHA}FKa>M%`(i~dWd2zwl*BTA3q~(Wgr}z zBf@6AhiO_NqVDJ1=~|u>+cJ{PsB@jL=$P>f7?uT zKr}Uu{Dp4zYe@eSbk=5e))of;FS%GnnSLgu;q5!>Sdw&q+J4Ah=&49X5yH@`Dtc0@ z8f_-4KJp;deK$_+W@_2%%d3y4cD+P0Yk(3$oC2501_!gT|uul`Fi*JT<12!qyDG{+4f~S4(`drQCGtV{+W2s4nbB4L3>5ZmICak zou%`iG!3J5i^DfW+vUUHQx(s+g;cYPH@1^73zH=^ivzUD7mWzR-j{K@%y1n9{?MTH z+dI!^@@MyCy-*TpF?2od*Z$P7H$KXNBF<{47W;+i}#n&k-j!;2>&C) zTNoM`8hiz+kiT3-5Xrl{Mx#IN-_%3fSO3$GP5Xjawjd}~SR5fF(kNj-~?u;+m zrtN|x>?+@Cs{PREr`u?!FQ0}e)wtC#)GTR7$EL@tJ7X{EhDB@ch97d(d7Zr=?M$s$ zz15m%Vn6}?#f1V15P{~am)4baxk)2S0+hE{0(#6iYufADIgY4Wqk7X@!5qdDW4;>m zYl6o86ta`;8m;Rq$DhMnH}B{0Bsc%YmH?a2!TO7B$QN6|f5O(u!1gb)i;8kqUn!{b zx<VE??9?aX^@6R9%%C4P8)@VhmkQNT}e5e%MN-@M(%{ zCiNBOD*zJ3f46j`h9Z{gEwqL!cDc?s&7IHoSAe_ErHCesd(=4SLHEg#9CP=SEV*QQ z=qbLdMlk^wwmGK@sob=v2B5E?L{8*ig-es;P@-z+!hWwBDouG)WCZV`cP#4~l;uF( z>0~Mr{QWHJ@d%#Yk|%$xoz0{`ORcV|>+ch|%&xOYa2(5rke7LSILNfM;bfq($;;swed=L5r^;q4e>6JOGJ_TcQ0MGE6g=;5nA|^6$2WEzXJ6$9%deqIx2K45P8s&EJUs-$j5$HKU(TE1eGoh z3noI^C_DaoGJQWEh6i$A@dO4Tm%;H9+)qCGhcb)~hrc1latAliHy zzKf?im4YUK$q;OBtyAAir4_KXs$$t=DnJGdjI;m^Di!~QlBZ`0+?UU10(kuS&|7yN zW&^Y%BjeX5@WY0XD1d|exUv$X$8kna1&K#i_%r8OpiDpt9iiT3N@6*1Sar8T)ZE$~P?Pi>>s_vkA8a*c zOZpt?l?9Cd%r*F(eWL5SEt{TT{+*{^<~xwq7tiK@%G1T!+|k6zNzcH@=&!$j6)Q0b zdh%cLZE*XQ+IB`X+~0bheCi|%N6(viij%02HZ3L?*n)>u=V_C^R)8VO;psAK%ge8% z$^h%YDHVpQVUTT7i0IHd6eKaQ-<;SCFT|huwkDaF*NplIMLc@(3Rf)<%M)1Y*rb=- zo{VgF5YI4q#F#AJA-T`S4c1KxYB^tW1j8rql9A*LqHVYCdvAMAA{wDBP{|)gEDvFV= zNm;y?aFuuL6;BF^2LZwETejjdc1Mo$Vi0j>4*DI-B2pSA6kw8dcpN6QeqBt}nkYi*0yy@|x}Gny7JR z?cK_48AY~KxAfj17-NrE;~~gj}}JAPTAr3V>(l}R+ zxp*Xkf?N_%DLocILQGAc7Ed&s9#)ypRH16NL}v)abHzI4z?Uk>VlhHa9z5VNu+reJ?OM|r|{@ubp3 zUZyimCXQTym}vkX7_rCkub?qn-N3r$Q|H0BNa|F%1lSkyk_P`@cPKIu9ns$#gX9H= zv3Y&kD@ajB$rrygIa}OsfcWdb{8F=|zz=k}E8_BLCMOgn%Y6S4@(Ms7Ec`%Hgh^Tt z)xCjoR*`?pftmbFQ#h^c)^!W5ygRaN!-tL&=~>#*pb6{^;@i~r-*U{$Z2!Z_iZ}AnDqGk!`3*+Y3`09}OpT5uWKYn53U+X6S zck$H7+RoCz@heGw$@%}TdE$g*zEn!c^($@YL!v)4AGD`}k(dIQ%(^y|fgHu9W#SK0 zfIix1d**Q=6PJzdh!`yq}9Ws?;5_cJFh5Qv|Ajt4i5eQavWSn+VS&R7$FRRK2rtb z7w3kL^!<1JS`_~-zv0#FK-IsjocNW=|Fm(Ir87eR$R9Y6h!jbu1TMv z5H1L|Tq|rew>x#3{{t~FW1^yDJbJZe{^PT=LBA@-#oeFFiJ>8C|C=>0Bih2Dqnb({ zQ<8TqOtEm^uaSf(`Ick6l)$>@o=C1j{lNkZr6AFvVkJ5vi5MMuG{*?7m#U20ZPt+5 z{jNPYbwscOd3a69AuL8#maW4^X1OuMK|VDPVo(~b{TQ>wQ?YkbMVZcuqEf{(m-)kQ zA+FOAy2~dtbR`7$p?QtgRW`Hk)U@^=PW%>`MokQ`MSgrXm@@ZzELDnXr;36dkk;9~ zcV$)rg$cx%QEgPS??Ifb+yEXLUN^McrD5M8p=<7QAM#GAf?jz}p=LtsOrZigj0!cMpu;Y>-DRWE808*4Fn9^D$(cG)QUd;9e%RVzgmz%U)aQ1(?Anpx}XIRM+QfAy6A z0ntlN!^Zz#Q^F!LAyTh3nSp@INOsEDM}pv_fOtKL<@8at=X+_stO$n?$WI%$v|k47 za2d0e!db8M)$K|NQY<0DlliAb_Xu$ot!)df%wSy3VJj~yu!ZBQGO@*Pa`dgM+5UVLH?id z7I5(oKm;R3Nsl^8oCH%!@Nv7c<<17lN77!uPVd1Gz1*!uu%TpxJ;vNrWL zXfoaL{t4xPk@1dgy9Du(Moou=G=+($?8kORkN=zuETHZ+YylL%zOo+yICNu6 zC!jq3=|`kwdjHJrsfsAeg4jO;1nW0d+FcpGS6GRzN$1vBW~`Bds6DmSRgjxrc8{Ip zrroT!f8?mx{&eh?PE{O!OM;O@ALkhkQ!C$VMNz9C&ELneUyRC`QbkUHbcoKvPb=5= zmNremnEJC);VeO1jbt*Ds2uTvfzn9g#t!*2sT>sk@`udL@4>#8mFOw)41*DY$UF|L zk@pJ6S6Gv|mq;@G+WGfa2lKn7@kT-NbVrl}u<75vx~t`uRS$8RBJi3m6)X!}YQord zay*--<*A~#OzU_z!jRs@gw2x+J@j!tfE}~>-s{k{5R*t~kC(RdxCIT(57SBYlkIT}#GH|8_>lsRT+=P-a6Df{b8P zu&=wZL2?K42ci4a(PC#^1CBiCZhx6|)w#7|ui&(K#k6Ms-ejGQv4{ED!Gx6MWAw8H zLdQ(U4Pu?kKM~dBrHR%C5Pg{vURPUzSSo8rV<*dhJY-R_S}((%7cjhsej~sF%SsQe zWxE>qnD3DvNTAs$tSq{cHsYbzZQ3KANqO#<+BGf`a%lAcA!M~;Xxt{(HQ(9lgR zU>%ah@lSKK7gD#vD!MSSHIA?%%hN@2H-Td#K+Pko3xIh~*<`2~7+vQ#xFpWl`{f#Z z!PONe#C$#i4w_JrIL!x4szTe5K_~wAYEmS4AT*11lI646GR8?kOmd`<{a5d@>fqe{ z>Gw2)ky2T_cW;hOd0kM}JP_`qj7&mIgDsKLOqd5FU|gbBkTfcSh8D< zghgtVVp-|oBBLigHfzr};nK3I zhm~C)&rG$!vXC(+wnqLNDXOV#YMOBFM~0;*Tyd8m z{IKVyc&eeqWXKU<(FU`5DqCi8T5VJQhMu(KsNhF>DP&?ilUG$k`xfeJPSlT%wcIOl zmd!`w$1hfXV?~wqx4#?}O6lFd59XNv%J;o|bE!+RQ(Iwv>9e^O-TC#iq8|?yniqwO z)b`KxkTbPUBd~(Eta#Z2ZPsyS977czZf?B4Z=)ysqfbmd#0B)3+=Z`MYoPU5Gf1Ra ztJ6%x1dgthjvZ4tcnZOWzcpcaoMq1~O0rcNEN84{gPo@MoZ-SE7>slO)yZS1=Mb0z z&=mpDsl1{$F*GtZvo8GcQV2RD&t)s;erfL}N5L39@;A-Jx?uR}Edgytvz`MN2*yyns`~uUlx~ z92RDn;Ohjz232Q~W!RUC5ADVC-GL$0Cqj-2Dw_K6P-yMTo46!~j7YI|vAsw7K{v@T z-8yx2)q!jI=)crBH0=Uqm5cas!%Q~oi)chTU(Fv+{VE>PTmtv&o|TKUv=fdeD4j@ z#}{$}no6|VpNi;&QAYLkA>k~=?(Pet@L$Vm*mJC1UI5%X09=vRfNN%A=BQ_BV_>BB zvXw53{ckl)CQtQ+Lo3h)wdqvk=1FIg_uLgH4*+iFbIgyu0 z6~==JX2IXr$1J7V?=iw-$T(|}z(6wD|6quLX8+UW#8pqKoeFJt8ER`xGfJ_f)E7Aw zuUT5NwsXzgk~b&0M~p*m_{1a|NT_8n`HV?w-rQFSNA(!M)kyJ6BUfQ`}~wxV%c*9 zMr~f{zf~vpI`6-P10Y2LiIx1X0?EO^=3nVt|6PeJ=7hzf%2%+e58O>j*a&x^O%uR6 zD-6f4RhSvwZ)6!YsFz`E7xsbdjg5L-Bs<}Ta7w2ZC^7gLlP1N6I)cXUX-b2MMsBKI!x?g=BGwpXZFF|nun9nmbIKKqXl<6~Zt=s_%Mx>hSDms)#~u+RC@nl3RkO(&F2 zB$8E!v->scH=_u*t#u1`1D@sx9-kJW@1t(|W}dICZ4RV=i-6BUe~rUm$jaxz7m!^4 ztJW3|uGKvO2(JQYzh-MF6QVdNz5;pKlilO)H_}%HxZ3>q3-A~72P`MTQ+}Ubi z3UDIP-rPDAr(h(7uvO|UZbRlUY{s|{_-}80QSWQatAi-MvtENZ2(O^auD=yY?+%Ff zB7j_q^hjRHIjY$D4T)RIlB-#Q8K=pWUnLX8hjH=wY5zm~wH7_PgSgEIzT{M36s#Tb zLg_<0rOi=Q#?hG}TFRFJ^@qRC*_p}xt1@uLaj$Jh>}{-#49xydJ0iCx4Ulp`JHk8@ zNTW9rsQcY9Cm51`c&#yZDXZtZX-Xpr!R{K@8X{?q3C7y(_>Dt4d$fS@i1<{IHXWrj z+D<$T-;}&4dy@a#vI7)@9Mr5ZgiT5UcyrMP^T1g}P{Kk~Ds^9oqJ5ZDunPZiY4Eca zQ1{KwUQpHvDAbu`Y7)Z0IW~3t_|_cO{fzI~Fa12V=62NXLzmKu6rc!?%L6HCvQps{ zYZKacU-2!=q2>A!Q!-t9(HOMduru3Y2y`SMo*F9R&#ud~fZk+BJz!@^jn^K`QcJ6S z7#e&mRh0!8x1ra^e-57({8|-LbmYGN2>sZ$`YieAR%#Y|()&cP+7zIerfqz@Wr+8^ zk1MYRE5p^TA%7DZ5C+h&-YmCTc_5g=s_H6*K8-K1q!v2H>CIhuLp=W{0j5Z1i5DB9cD>f5~RiRTo0UN&98>fh27g%ByP zfwhE29fz(XZ5{_PfS#P9*3gATeZl99n!JKRJ6#(WzS?HJ-HqcIJD86wLUEEvV{9f9 z2Fk7e4Ij$jVQ8KHAgf}n%utX3EJ=c+8a*uqBtP803W4leB`v8BNj=k_$+}Qe-_SPg zQU(VqUl-YH_)-u^P@CVB#I_?Z_#L86l-T9D$2b~CDGOB`b zT%Fwu*=`ExKmipOvQ#U;O8wxP)|ZtYFv|$p(JVjpS$o7A_JnRD`!1fnr*f{{;$$R{ zPLWvl&Ik&i6y6M1Z%)C6vWd$A>L@YGu?+dgs~1EjlF zn}(T6x#q2=1B(I|_>cK%p6w=+GB>?vtdV`^e}n#ezv7mgTL=a~z6bnX!`T@+85PV z(Kk-}a%Rn7khZ1Y*DNgyv1%D;A%B1=D^QRi5@BQ5fC4)uW&Nb{xcG|3<0N zN!&nktM0cl>D2+9LCi5vgZn_isL`EwvUc*sq0_mY-4j~ow?jXL(7*hRvmMZIZ-Ilp z1b(lPEf~64>p9x%8T?C;_uqwN%s(EZ3YhfR%{Q~TR<n^d^4nt z7PzG89%DF6>|JAV>E!$)PA9rszR{_*C$-n-JWHDLbJ@dpQYyo{xGxL4`@4o7IhAB9 zx{~8Asq&tGtta$Y9Gc$&M@jSAYzw=SG@ddK-6O9nzb!hu!+*oH6J2bx!KsCdcN9o505Rw;bcDN$ zG(zHag`;MkzPGoRU~#>l%lDH(OY+?0yzlpj2SmuQ z1EfF&*QW5_q18-jRWYf!ih&{}}_#p6A{Kp3QexZ~yspd>_Y|kps@! z2RQ53bXi7@4sL%x{Z4Xgz)J5A`JeN$(%Tmy8ZHvvh&qKE^50zyg%z!m2tImpsmhrN zI=-7+1-O4;g3YLc*^z2dLq`)4EmQ^h)t>wyq&I>e^hS`oiYJ#pM$J%nptYp%J2K{o zQO6z@Iik5A0SWo#9rY!*JlIpdR{*KyXQ-iU4m%nwgFH!!<;cS?jso6p9;SAngC(XR zE^*2qQjVROdqafh;Y8=0wIJBeR5XhlL2z!}511ady05hjlpeF>(9$LCtl!?Xeo~=S~)vowlZud$hI) zRXe(++wHKfvrx<{@~ORA2sL{W<~Zc51XqZcUVwr@(G*UBj0OS~wzQw|)yK14phV9yzUz3c_ow%EQt!VK zZoB20YE>Ew38B${+s`qjCGj%AE#jv>VA{_?eIEg?2()hDqBZ3~FRfb(szkaUMCAvV zW}tPOmjPEO@;z&Qp{Qc&2GEukcNRA9^~O^ul(3%Syx8N zGbcYwa8-23IAqrLL(s+?&7Pu+B`wo zB{d;8Xk#U<&R$@EwI=mZ9@q_-jj^kli=yi(`RI-CHP7ko&FHiEgIJzfthL9Qx6J}9 zvJrbpO-O=!D1vjSu(4_H2^?#j*w1%k28Klal8oWyh&t$njtwDXtP`^{zGh8lpPGl1f29&%$n2S-cb3jQxQEC<+M{wP?R z|B(GFrbOa3gQ=K0*jG`+V0va@s6%Tk6xVlWr+gI^a~+V@CdMZF{(yYSN)Bo{vCK_Q z4g^{TgTPeV;VukMX@t7H*!bO=|egdby_-w#>CSL2s-k3+-%hu>i z$)qgW1qLA>vC1JT%TA%c2cZz+5ue2)WV5LB@*kZh-c3L4aky~6fK$oHBIw8$B|Xf^Dta1EcuXUqWx`I z*pZ*sg;U`$Op@BXS}+^)h4g4Gzm7p1B;qwM&Rl9s&M!@|pU&EEgRn~8X&>Mlg;i4r zvf`)H;!s&4v@jGK{u>CnUlDpt5#jtqY1;i{GY?%oUO_oH>EoZY_NhxW}a z4P0scwgEcl66>el8MNaLaokCw}ZgaenF@mm^`qqrov z6ty#5G&h!(@h|8{DeBT0u%%emr1>M*CI~ zgAx?oY(~Ib9IdaE^k*(k#%woM&qw{Ym>{ct7$j)awZn86X6P7(++j<8^?~QH z4d+iAre~`24`IOsS_pS30a6^IiHC)Qc+x+Ryc-Ca83j-(>59W7`E^WBiBXV@kQ!I;5mKOmq&PWpzAtN-h1xLA%RZt-owG zB7oBRnzr585}>$%1=3$U3-CPt4}ehCQ-XkT=zOWU14OMF7YFO@wDY&U*5@^_$&bX4GbXGrRZtsQp9=DJ#_%jTSB$l`3(0+-!HD3He^g)+bNJG+9{jtup z?Mp5!ZkQ>X&utOg3~Dk1QBtbHCWrt(H3!nv5jLn6O* zi&E5ZO1ASDc;Au;2Mjj-Sd1zaDY-naz$T{FYA#w_58R!KsM`q78&)SCeHV19pYd56 z_`mO+5hd0n>ec9PV|ITLt~T(oUxYRL6oBb}Lfef77nOGgv2 zcuuC_M_kAC_hr*H^qPIME@7RHqX`e%ONaQ&fnI+tHl$te6Q}?L8vz7`Uoi;)5&}oy zTSzW?&M!{Gtk@B0z)B-@^8`a>i5w;KCY2nlOEs8D#GDYqCr*b_ck8QV-}ejJ3m7Ba`=mb4>e(3s?xOsFbm zR5THye6IE+GOq2%nr@`bF=gfqsWkAr(vDy(PN&D5cGCfDXhKa!3m%+~lkZY)_JYN9 zXF9e;jUu>#p;o;FTr9)(wYVYjRa+ZMPFyxHFE`Soua~pHHJ3iC1j&e z=e-C7KJpLQqZ637_uzLR@Sl{wpH{%d*$!0hagsWS)1-@xMa<`6;zkmC{?T}lg+SJ) z%^)d4odx9RZtp*iPoE{M;amQ4rv!h_7xJEYG`E{nD{|>dLp=$3evYOgGx+rv91%oW z0WV937vA_a!-BCrAQU#U`De2dD7pOh2K? zEh4r$By%FdOvRq$2*)JRVNvl<9Kvp2DlzoN+(0+|_Qr>}>N9L42`pA0;M`DKNt#)5 z-BF22q578OD@)ktP&gWwxRhxR!^VDws}`~oQc_mq$7XN{8Ny(&LPB8U%Qd!BBRc@U)P2X?gCZI+-+Vk3vFo$x5ZB1Wt%jvvA8r#Z<&ViI? zd}lX;x+-EK;-ZRx?92Tezvo}0S%d-({7Yw;5B&4XzviDGP}ZBiH2D9O*Z*hp5F}@1 z0d)9J**ZwAel&~I9neS0YlDmXHMbQs@+)QN77F%Aj)Tvg5^aZqhA9YJ*&f=o{k7Dr z*(pOA<}6ee(Xqpp@I&tiZ!^F$Wr9=*e8w4hcMNKLvAK-nB9lghMF&Xfl|^fI*vN-w z!3Yy_CXaBZGK!!cLheDBRJ#ykyBZA%u?*Cb;;#tHN6hoR)vik>p)tSYNpaWJKbdSf z>j?Om7nt&vO0De5{_7|T`xh|W1>Rd$y;QLelQFsQ&@<=c%(dCkG*Z~uRgj%iYbVE{$mAcE z;H^2%qLq$Ru`Bg{gb3=e?|D2`o?PBo^>+TX&w$i&NhSb*dPUT4Z&YRp!*XTJaq+-E;JLr6_z%DL`9;tYV$`!FfoyiG6U*Y7$GJ; zD4r#Z%qu}g;kDp)#H{GB^r9mog|t@lJ#QFD!KPdIY%ge zsCL=wwu>y+rc}%GsXpVp;q@VT%YCtZE=&^elO29TsCkPsv*flZDdKE8hb9kV|d4B@ac$_cnN7ca4%YtbjvP+ip#W zOORL>10_D14?b*XprcUB?zD3pVv#8Oi05r09}>8B4-UH=(VDd^!k+Em<{$_==0|<4 zJ^0&iS1`XX_1v)s9%IM0&s1opkRlrCEO2EA*u7-|P5U;90w2hp6wEeBIf6Y>L^qvx zCDo`&ty4Te)zB;pj(J4M@)&RbQ|nL^A=;{B$^FaVQHkrgG?S4CvR&@9OHU(xpW(Il zTIl!?W9D zrcIvwY(%Nt+1M|^GuQFoB5yxDHGco=y6I$|c{2h~X9IPU?-g|ufZ9?|ALtjN;`n4h z8Gz;CBifj|Uq5LMZhruhLGQp@5b56F#M9$x)n#LL5~A}ij(2U?`iT4UX(?wNX=GwV z#ug|>)hpAVu=sMd1pp&68{=i3^6Cr}DhH8X4SmLD9Em?7_+8YfAMZ>p(tEa=I(a0+ ziY#8}Gnv()&j|W4{7_a(kqtsK){n}KXF)sqM`oti2qjj zEHO!-!ViJr!e&#t0CvtBB{B&8S9l>@__W){_r;e6shzab1B@#hjy!Jjo!kccpsL%v zx{7}q@tJ~~Y_Y(K8#KThMndTGV>C+lWsq{@DgHbYb?dwsA_Zi9_&2(4 zt36KStz{3oZ@k1tC~GAffIOy`s5h8Ol*2%-B8if^*F#g%3Bt`I{rWtMd!(c!eigv1 zMl$K~4Yp7k{`ZtLy`B9rkq5l~x$$~3+OmhcO8&c*?dh7YJ@tL5T|+K5j5kcqGpc?m z<&Rq}U579=vjKt`ed4&&bgTuz?gar?Sfshphwm=6iUp<}IpL*Nc)unW;Zf36y;wMF zh|_r;4oImec#Am~9hM=)Et4x*?w)eGJDDQ5C1c9y2DWc;=;^$X<)DJsHzYQLOaPC(V0#6B3IZ7#^Cp08yqW9ZDM1*vFR}!{qr634Bbyk-83dl(>C)D`6~}!{mIuuh(q87N6*TrAa_X{=;Hp z`a*?P!_OddFma#AZvF@3km4`P!)w}Gn-us}W!ap&ghdb0UyR^(abQ@QwKtmTPpwV% zmM{XDB75j1fBB!Ba2FI|4DYKKkp5thO+i<-%I1EPxwU!XwR-0C;c>gc3G?l*zuv_K zd9XQS0N4=VUF3gFv9#AS{+GMDA{KDr0{3y_M#Zu;%&K6~_uOAjFbd*x=x-9Mq1r6| z!eiDt4S~W3mlb=2bMUMtHizrcCId_eH~gURK{-ZPaHa0p7~UyfA}>C4`X2i@VpAnj z;Zw3LlH_6vP(qMl=qtXr3y(==NCl;Di+pK2Z0G|I1!#ZE6si#s28u|Q%ta?zpK4S< zCwwp5-j&PAbzyw9+~wd5(!~#7KhPo>`1Gzq|M4V$ z-r^$9$Jkl+S_KltW9KiUm`81c0tJ8~A8i8j*O)EL(Ahw+m3(hnJTVAJRbkPuifPL4LCYa z|F&m)-_-bcQRKDSpp#-V_c6GhulC{!i0je13CqH{#4025{Ry)upEBReHBk(5R#j~^ z$oGt!;a0eKI=VtZ7%4ohUO=`cA>Jq$k?*s9kTSGn(#l%O|9N%)(E^Qx@!>RN|4`qy z7FT4t6~z;Na4HxtBw@tSZuuM-fT}^%JhLnuunAqcAi;_oJ%XT}Qeg)>@s7TA$C?XIWxP|F$ogp9L;}~864g;P z@g#>3td%_85DQ{vb3$Du;HH1*b8!)-?6VPkjPlRErItBa$pApF7C=w@HMh!1-@(?# z@t^ShBZ11@n{DIi!c=ay_c zb#IrQiasQC0B7?PDQs6#85Sw1OwpOEGf(CoT-I`FH5*XlsyQ;O2)17$NsGVuo`P3K|Rej2OjyFr!7a*Td2{?ukzmv8Nv z7b&Z&zo7_S(5z)gag8bo?`E#&5!j+zQ3EfOQr<26^`_hebbuRxkY#qx-;XIO@QpIy z@Ekyzw437k9;hPCury5#c>!kg$*G)eoZ8{oY8Xw0j9shw+RM-f{F)JQ5t^!r$MGl_ zs`)rb-Y0TW{uMC1sy`CTcMVOe9{N&?fQ-AlBQE=m*P%3C)xC#JJ4gyfVW&}5N`tx1i z7s?bE47`BB;6E}#zPz|b?M>#I9z=dyeg7;|3Fwj)AxE)YLu8zv8)9v6sqA|hCn-0b zLwtzUhmvZ=WkMy)s;DF;rn&TBO%c-*;>}3Ndeo%q@A&s^WeO+FNi!L-2NO6_(?8C# z>ifAEm}}$M^A4%<8N;)&C(_oDLuWm&UyE$5PWYA+q8YeugH^6^}O=n;B09yz=J!sEozED@fjDI$CWpI6pOxPiD z^_#Md{bj3cSaVP{`1s{=`|>!#W8hrbF5CV&_y(TT#o9Yo&t(0yRaR_q8&7hUl1ULS zN5ZuVe3ju*Afxs#N_*g&g6vBMpalTaYsgSDz+z-?U}N<^SI$XR>qS%l;x8I{vHdlU z8d@G`UVqP6^2`sUZ#HG3E~p3_zuRzm_oESWGN3EVVr40 z*93RkmGhBIO75uRYF-!R%aYhGD zIz(q%x_Muk$h+L|OzePX@9EjAoC8lU;`h!|J@8A9lwv1Q&P4SbE> zZ^1n_RtEiGDSav&%stH6O?M8Miqox4vQ%F-yTJ!X9`?H%Nxjs1&k7tzvF?7YlD5v7{o_GMC*Z>!H zF}8o1&FrW_uev%ln-Ze>+Xi>RPhFjXXN!Kbq?*aa6}9hIS!0S(kgAJhBN_?c1@bG- zQs)Rp1Z7zX#^+{Uh|{_@0voVH4VOwlwsa(Yr%9Hc;iCjqVEY z#~r%rXX`~9kMfbr;Eash&;H ztSoF0W%tSFd<6ep$8`Kt|5`a(DcpFf6uXb6ed0WROHgRb@S%HeB8#Mq@-XVhYSwhJ z;ePVNugF94C-Uum>TDzQcu$sP9^8t1LE}~J(}xd3#Dg*OkwvGYQ7VwQ1+?2H$J}3N zjYf?UW>ZdDsBJa-4tKu|EqJMhD4ceC{hB+R%HgW69~pAsn(-Q5v)=KUI8w@cba}tj zY5yF+@ZsyTr6jHQUqry36J+m;ed!Vqoc{m$Jo?{`c5{~(aaL4)YH-)Sit1X5 za=uoHX<_b|B^3GCEUdePMmXhHJBiS3%oPeLtY@!raPz?6J)3>Dlp8K*`4YwQDJ=q! zFW=a8d67wezK_#IduJO?a)>(z-B%;ysf*yl(M^hnIY6jatEc2xhbG904g;mHMujBO z{UKbpArb6do?(6}6;5_G`0z4_T7nhpD$huSfu0(Ak*K(CTR#64se+e|CP$+$x4Ks- z(mh>S%S`zpBnHC={zA8%1T^wUTBTtzCFIspKXx$rFn$sa_ADp}N__JNhfWz)@wX+{ zeRT)Iv4d#x;ZV-^(uaF!hWj&LM>+Qn%kGK9y$Us>oD!61D~x zTj-3dU&2IL_}CAkjAgF(vn-LBRDMI&sq1mHq_1)Sn`(ZHt?}1IA`c}JaWnbCs{e&A zOsVuRCj?fnSKz=YOQJmOtN38GaU(Vs(TyHxjYlUF+&WKiy4Dvr8$VDA!qaOPV~gr3 z)9#S`7A;@;pM=r0MIL>GVkry@6^Rq=rj5ED|7SP#UygVRP{6?pMh)g#ntNUh9ITTQszygef|#`#I;=gPqV4@JM=Ufr z!#`c5DH$FvE(-qHzrc;=AVSncc1mQNPn^B7CJwJgmOtE0;hhjTVtjPN!{B(-s{zP3qGhVqwsmH7q_`5)3HDt3SxMWM*BtmoynB5jDVM^ z;F_;&S>p)7m$mdTbrxL-a)*#s0m`ILQ3=Zc26@b0p?2R@{g+Nw8)zsMdE(N z-`_r)LZ-5_ImdB9xSzYPqmnLqxN`KpTgmUO5$P#!VDO1MgO|TaXn|Ikjacx0p5CZ` zOXfs3zgMjfd0qyWmy7p9*UL|;7|Z)b1{a!YoIg3_p00+?@=1IBg(I#Zmh8rL#v?n9 zY&pN1KSO9_$jX_P#7sjvY*YQrzUSm^b9U)sCE5Ac8>B71C+P|xIRv~xe6M(eESwB% z%wCLJFCv^jGuFT3ZyK;G^ygeJ^vj$0u{DE}6G4~O$Of#R*VHEGg{5XQ+8~XA_s1r< zfjWX~j1gL?Gt(GcG!p!CZeTsCZPyN|-p9=R#Gi`eHL-{o(2=q46m4S~E>ne&sWlV} zWeH+y6cgWx$`Y!eEFl&yluDejB}3V)ie!HOk?gxuNtgnV{THd_>f0`hPos_yum`bM zpbdZAKqmtx^nwz ziX03HQQ+q=~w-;b3ddb*?W=Ugaa2;@fEOI>N!~(m>TNYTfC^`{wd`MlGCsNEVJGd zRZxt@y{IlhElbu0F&>y28;T?mUzN@CNhoGn9?v+YDv!vG&IvQmJU@nQe==mRLbW=Y zD@RrYN$`XZPmU_6vLyZ8u4^ynavA0z8!nvz{?Z@@6{t5x{qd<-CIg>Z)!hFhcI;6A z|11fzX1AdSabyA(o|3&P$`4hArH(%cXXdqtFu|4Vj+E);HVUlr__1uk0mXvI>w8zb4lI`W&_iNpI_;0_$5F%mR z%kA6&V0_K(v;=&!diKEWbdr;@`QuQjT71c32{vCTXf*Ajm2#(_!$IWNo0PI6Y_rI7 zdOXVlwK=cIraD$n7TS{_GfS(&h*W^C5ltpAQ--=5|5S8ob|<_)fMF|Ukc~H) zk_n>X2od&%^uC{;v{%`P@K2~?_@7WmqNP}Kl%?lL(#ha^5Fpf%IJQ%HhaZtYo-?`D zj=lSuVg?H^tIXGt>{a9&>HEa238m=O-JT0JRRa6%FqWQrT@Hh-^CC-*@8oZC-Qzf-1M8m~-)oi)O0 zL35RzlKDCdC1*=PHTdH=W=|AK1c@y`N8a_6G^o5^py8o3?p6U$_#rTEnEU38K@J8i zCZ@iROZWRu#u`4NEG5l88dW!U_YwB`93K5wyvuO)AiK4P=13go%eAt8uZUH#f?|xS z$LqANl6P^l6{;D1;qUt=K88ZHR(Tx3lleveJUYzag#5mOtJ|73J(I|BqyOO1dd z?`PMw7Snnh^o6(=q18eS!0(KB;%%5c*M{$PJe{z&`e=(t{vG^XvCBso2q2mSAo`lt z-qPlUI-UC;b1jfJRxmf)Pg#LYCyWqv1rbP1|A(Ek2w!`0F*$6Si};w*XS|+qW9+I6 zumKsy{>rzW@o0)~w$D+)q$H$uhC|n5vJoTMMETU>m={g)cGFU8$wPvDLexL?^HRl+ zmBvd9`^6@vFs1tjss`ggns5nyLPFvF*il9AH}Dqpo575xJ-=us6X9hwjd6CPniv21 z=BnLj_~Y=3-WY%DcI9^?aLswCB;HmtXd^AZKLig#ajfS_F~YQiwyXe7bjGR97&5u} zsK9BKjh==$&<$+Rc){Ob4pxid$iZs zvCIa%mspnW5|G`c47c@e4koelh2yagDlUU4?K;-qqQw8)+3J)Ok@_p7GPxnqhJ2Qw zqxpxamW@%m+ck)|f2{HW1IIvG&#&61>^fysfam$5^n*-xKluqYq)p=lAN2Q=#$yP* zBfR(r{h&EccBq2;eO}OCf040Ui@7LG0KR*#^a@((nOT}R{pphwHY`>ECF_C?VLP8y zsMLIIO_4)gR7a#7l*AIAJ__pnap{M!<>+uEb3S!C)=e%4OKCh&i6~TO5ojlZd6jPSSi>TuhsC5ThGLOPTG?r=AuCg_6 z=1*CMgq3ua&Ci<^2r|bqZksY6R-{L*Ft&fj2l*t}reR_i-k%?MdYZluYcwfw;-P~> z?D|B2y<)+!)FnXN2PtnMr&zd$!dpt^(J%H)B;e*-Md;^IuLa13?-K}}}^u2xN zEVY+x`278fcHy#7>7TvZe>F04Q`UbrZz{}|VX;tp zv`kny>|@&3)rP?8t)D zs1Vpnvw6!bCbGKzIu9n*5}@HUJaki3jI^m--0D6u%~_TAuOmt+r&Y2hb+mc z@-xlxUN6HdL?eoi2!;v_2cj`0oJ*{vzlKNpm)rgbcf-y+(mbS?%g)h1d zeBXYg8(nq}-dRLdbp1Ac`Z9Q7k-f&MsntAWc*!|>2rtn)h4{~z^lU&<; zRx_z*6*n6I{6I|YyO&BQc3X?vIpT}{tb267*1q;XlAUIX9uIJI@%+4@;S2mRFpR5w zZ2I6`H6#4AcDB;_#KeWeMK zlA|=qQMyU2!0Xd&Q|)_&0($Ep@?s7ugRMZ&^HRpR8nKrN(iS8~xBfL=xA!@y&5PzS zHz^Oi%V51HcW+NP$U?Ig=$hr!2k2l%lf$|UZ^KfZ2fX({*k zxML6vjD0-EetsU>AC2YRT)k~r+^bp1*&IMbP0~sHWY^dO-QGl65nn4@NWSd?TqwaNuptLo>Spt08Ixe__x1Fr7AqM9T)SO-{h+jhJVWtTb!6v=MjTLRcO>s)0F zlIoR4>20%`?$FQ53hpf9V>m_~|(yk!EI!zPZ+Ptlm17+_Af z?6f3^WRzaQ{_XO%A%fp9t6-9Pb{}aDet?tm5iyC5fEEU?;J^g-VdtgJCQawahH5II z49OaliUgMMOYu?3^eFH{y*qsyeSQ+|cU(lMA`TUo3_aC)QM+$F-I4tU{@O4DSvvVXqa9{R@hxVUqW>c@Ap2hdc!bl^J6K=r=#AOvDv0PtYI^?*eAvM zIaxj1&!$o0gE+tX&~yzf46fd`-O=GHOO%OeB_4S9WZ-Qqo?v9JoJpzYen4l8Sk<8u zZmjOt`^qEsa5IE2gzfJ-zjWffCq+zDhk|o&uOD;%$d;eW_OW9L4!=sPCoPAU$uYQ?4 zK)y4V{N?J*d82aML-(uW^fLx_#9zI%C-2VIOa9CXP=a5h_q8%Ju(xrrF?Q5(1Ok~I zbX<(|O#$`q%cAvvS$w_((<45QSR!pO@DelxDTwo(UGITJXN6Vpo1e%Eg{~^f$P;Zgc zB~(mF8vGoL;?o+9;WYNjuZ&O-d0$#?FYx1GVq!kvK?G!fJgH&Du9Fkz$`Gof6% z(c)9&GS|m;|Ce-T*5N=?6TmAK!0R=dC?EvN(#-h(EG1s-m;dsYyzCCKz?^82j1;!( z7+ODyLnRv!GZI*(z%D$VY3oU+NX3NMZ+P)kmKdoSHj@88q`g&CUE9(w8XyD-1b5fq z?gV#tcXxMpg1fs0cY-?sg1fs1x8QaMYyWaq&V4y853{xT+^dhO>Q$c*TMf;&6&D98 zo`Z{~&HHl)P=vP?!es;`I4b+_l5pwg1|tuDL;XjS<~q(e$G1!n6fLJ6?isW}6GsIfq^&Hao4XC69wEf#ipMSU#=?HmxA>?(h~4sx<+3v#67@GLF^F zU8FNGoxJNo9DkVtf&B~!3$gkNl#PKn&@3sdP3i6$Cr zxLroJpR`voPM1^u9lgVy%r_bnJ})vd}-n!*z*mUU={IPW_)a zfCiqDOrQBNc}KBq!F2@`328j0B&(i@MC9tr8Ed-f_Yhm`+pS}Py?NI45wrojAI}DS zvdQ6U1b%dK2SkWFiT(sMdVxl^o* zuUeIrBE?y)67)W;rYWq>{6b7>hInC*QO5boOhcRS-XvXrCG&Q71;$7LwP5}0l4%}Y zlSI8R$+iqkyj0IpG#o36eQ?1hpOOUswf7dPuSn5s8;!VQl&hMh8+fa_!I@%rC%q;S}m^kTQ{LwU#=X1810hi#d zY5J?L+0D@msJMT2Op$W`GG3Yq^`Et-;D(!Qk7$TkTC+B?Qjd$Mpm}t$kNFE`Ix-DZs7DMr#cfd57vyAk~>Nr1d2BVRfd})QFt2jqu-RGF#~O5TUAzsWrkT zCx8)v+nA>X1WMApH^eSDf2ip3kOH58J7J{KyY&@(G5rDiInYoktgOf(eg+~nLnhSg z&>ockLN_v*%IMY9653)|Yd9UX=@{nCfN4GGSiKrtF-TyQ9wqJ;;bFtI7vuYj=$(_t zr}8p!f=*=%WV`b$d2+wH9pcX%h+GFoQmaWQ3p}ojy(WwCQ#GGKjtXcB(Jfa$akhN; z#5^~FUjfj^IGon?T@WM=Nj!YmF5!&fKQfCZyr_l-JoSMr%0?Z`EBahCs~a*#nLys5kRpN!T%~Qq_*Tj>rJp!m)+7Z zBCbJ#W&YVkrbK$Q_9mBo{oZ=R4L6ks~_xsc|72;jzNhLSi^ z5aL3M)*b%CjsFhF8Uft+kKmgA%CT4SlOiR)-VW=!pVB|SFWvWhlQn82QC~(+W(a&b zel`$`fe(Y=Y`d!ERI~qO8Vc8r%q7~6^9|bkkOI|xIiM=10t{2Scxnn`IpFB~ak0ye z$5fra^)ie2E9Me;JbZhSdcg4|(e3d&Ho7hSSyt-1*K@tEc-u1RUD>3dSc|OTy~_+w zhI-vhk(XMY+)=l^fQ!~pq*vP)-Y5HLQ*%<%MXik(%wSgf+Y&JZM$0ty#h-NJIUnZJ z(-#gaZ@q(|QsPmmMqE@3_Rmr>^`gL8)`(iVq9JsLzDYDujRPhT}Mh870g=fo)d zXPevIqR-l?hG(X`83bKcG~goAMnEuHc+cS{=Ov2gB~&-N5{Kl~7r8$m;wzTsPY8tj z3p+;y%QmI)X||gRvl-#pMccR>Os>gn@`{shGhLPBN3k$_rr*1DG%3f>z%HPlyk@Zi z`q+)J{DN_M^3=|B(aVGI^d^p4AiJ>D6OuTziz1gXR)OWQI>$cE)DPWiNqE1C8vQ!ag7&Sx6#d;?#e^kxUU@FwC|KEAvsGN(Em`OZ#jpk6=}5R=ksx?7*#tNhZY%PAOBIrI?PiG zb;(oUNTHYxo!&t9!qi6KZnpU7y=2r^9k0(Op`j_md4euQ>m$c~t9+Z2p_EReA)^rk z1Xnt(FSD@M2AG02X#1IKyRAUA+f)D3xx1cy4Ic-bb4)+U(g8 z8HP3{f6b*l(P>1c;ObGLc~xd2#QS%sTI&S&Fo95k{bkmA6Th+g($A}jo3+Y)H~kJ}n1-ct zKsrF|9uq@c03OTv`wU&Uj-GXgtOIeIGhgu%rage(75f$pinC|kor1&>^#N5xVi2;k z4zH=_#K8iY_PLsXKu}w3uQxSS={Z(loks_X6m-d)(Q{8;2WHXa_(L`oM);0%J4JOM z!B)=+)kB052Jao@vFSUP*#_2vZq99OL)2oIM12=fX9|J{{R8Z{v9Vu+ljtL4tlyPT z9$ue1=DGW`OYyZHE*_7mB@I=hdLEA-joWxamoK=_i{f`$#M((`rNpI%q*~gsnBmkM zP#k$KlQFTC{x2(mdJQxra3BWV!0&G=hpoMlv5~=lz@Ps!5sTt`gMYrM5q%(6gcHw! zH-#2ca6gb*TFDEUq*p5iLI7Q}`f^*jG$HVF#dytQy$v7o$0;#}3fApEe< zm0)zmroAn|Z`xWjoGT7iu6>4xTF#;qldy;m?22*Xh>@ zzoUQkR(%oNH2&V{qPD@X%V3YudfcYjRJ5`x#ErVUh4$|&@2G>9^mg3s!0&J7kG4*h zPFDZP`2WXg|Bpq++l{w}|L4Zr@OfD9i^YqzHZ5uyvrKFNa?}MV-BW<{6YILio1PgT zgDUfJ;fMaTG%yCo;2iXs2?se*T`w>+QF~z~UcRgz8(Y zG!Cr0#kqC$g!+2p#Day$&s1v6T~uD4!RWnvcS)oM35i7E$@INL+0L5nK8qT-?)`2S zH316U6 zP{V~h=`Kw}fHdCxk{^GJ8tf%x z=wE^Q+Vr=V+YP9!PPUdddWQc?iHxF`2?Q?p<1-2pg=nCzT@Y$NW11_@#aMrQj1xvv zvA;#wXqc64hN}zxjXDT%mK|<_^K}43qw-_ES z?GEB((4N3g8YGYLBt=pA7fZ2DqTVSDm{=*4%HFnsc^9eQZ|H?-7~Ic4MGgtnZDklN zjv?|FU%>{fWKvM3JPJBACq(2H$IJrggIcU@IkXyGu$*kxcAc-kaeUV)l3{ornGWBt zr|49^Uv$gbU+>OL*!tsD0q=6gp#U7RBaq4eMx)6dXkiTB+L%9jP_KWf<|Fv0Q6m^R z^rNjOHM8QsA2zZuoT%5TZ9eVv_~>B%EeXEqe^9M*ayChAxzNyq$~mU9;vBT^X^ZMi zIE(-@i|`xRw=t|xV3iQ%+ZdK)nVFgoY`Phgl&>u3R-xM>*B7_hLAB=w!SAw!s1X>$ z9)eapl65~8(EN(u&KiEx%U{?ILK*EeYOPFq!Z)PkJ=9`Nl%4D_uXF+ZUtnu90Brpk z%+U#mG->eHl>tTw-<-vX-`DY5#7H?O#bo&6!l&Hq)1wE*j$0_AE)Ye3=WRvTGJ|GNTA!>UapP>0`i z76qyW)m$L2`moAJAj|>PzbAgDf2?~j8E|HPRoh$ihfUbA& zi|H6MdSDmB8>)I7bU_^dc3%MqARU20Rzx~X=25Ungg4Qz%%!-K4fz|OM9|Hsa!L0+V&tO*5&uFUFe#zvw#R7Fjy9Z?*!FI>l(Ni=OTx!Y+_Ai zF3km;4EzSDNhFnnzKc?H<`tpoA;$lw0-xd17$zhVWWE@squMcsXJ2K1Em|kj9GUh= z2B%S=Axf?p{uIr48`s+U(7E1L6)SdS{#I6VBj)Y)<*O`$!~e3wl!4^aq@0etBVJ``2c8nI^D$LLY~DKT^Vnd zKnVew0OS|2WP*(SuZJ`WM8i8gG6PoSO{GJW;gYQurN(!v3aqh`HRQ?x!`(iN{ctAR3M zul+J}nIB`La;dDmyMH}8UlVGs9A@+HqeZu~&u|Bhb@(rFG7d)8hX1w50bFd~c$RMz zFh!*0K$dI9Fx00OSH_-5mV$Z((|=Ghg8xCu@DTwhnTb?ZfJHO{NDw{5Yw|0N^s_^R z)`*gl5m18vjw#C5EU--`CL{U6B_84i{d|ei3}6#Ssj`*-!6r&3D2U4G0i2Bs`PKU9KYs*(yHH8Ao-|$ z<}ZmRwDMNof%k49W}3iR)y7tU{}t2G&;jMhoARmE&x~^_x3J{vlnq+P0jJJVq$nyi zP4a0!&vGvhx0$h-YBPXSWEpwjnED#!)>|dPQK9omx%2t82?NL1@fYq(whesEAHCEQ z+u9X65ZX6&kH1M*Z=p4@H#7VrUH$8|R{LAAI`2CnvQ6Jj5-c!9cBWr_vr;*HSRKWy z5I^H)Ak>WwVSKo#6}Wqq($IdPTwkmqnNWE!-$V0zQ} zqjDH>H}4#GaL45Cm>4FH>SXNT!?uq*kA)7Bj8mTW_O9k&x#+sc!RV@bq4*x&_Js+e z%;!ZXSvgr!GU%`XjtG%W7C05LTNEF&!II&=KOPSjyEM#r!0{vgPdEl=?kmndobW@00H4Rk}ra8KolKvPxb{ouxER z>Ikf2ELU?uC4Pm|SXoV&ln=e@`K&9^?!r0hE(6`RUjAB7EjycN=y78yCy74F06f~< zQQ)&fvLfu;8Eg4pA=XdQZtn~*h$&yI`_gtPBI>HK1K|z^&R-V%Z$GWTM*H#L_BGO6 zXy$41)958*2ZP?5n#QXG zPXa!aib$NkCkXsr*x($ng3Y-Xzlj&_A1K@I7=}T4&%G#?NXP(e{#65bpm z0LRU*0l}0Zo6w_{Ubu|aU2+?Km0gK)o@*uRt(HcC1kaTy@4wL(>*M?m8@~v6sr_j%=d%_0!&9O3ezAv@&WH zP|S16HI|4of4ej@HzZ2*5Vvsj;EakqH9s>kQaxhtv-Uh_!wE0bM6c8)DZs+n!pgTM$36h&JBg}gy#uQ86`JZ2 zD-(8j@%6`cr#E>ox%gH7AY6%T#-zZkZIHf;Qr*D(Ta@`GAM>EYW>yVE{sgIR&lLuT zmh}s+qH z(&t#nFlcYW^oFOcQUY?@ZIdf*aBO2x4E;w_y+#pMg3oX7xi!Kf^+L))uN+O52b=(r z8w!~)IWF8)BRtk^84_Ub#8Dt8DkVx@fIanm!nR_vDelB`iB%@8MfxX;A<8zxksF9X zD9|YI|3&lbU}|FvER}%?ZDOp<8%gy|SWUUva*Bh1ts8`%H{)}|GLsa6(|kx}s3n{n zK?kSVG;9q|&cjr{*E3fqn;0T9EmZ(*qlE@YKB)q}z$v70&=pISo<0mi?@GH~ACc=y zZPO^9iqv3-1z(D*&s{)eZP!%breCnEYk8b*`EfrdFcYUJ@*R<#_!-72mk~Npm4?7^ z^0D$_n}DgdNcmWl+(;bfxW&%pxx2>EwG3bJJPSkX8V+h-pkYISk5gc_W5vTBSM2Zx zSWMC%iJM1*^)uk{yF*YRf3~9VT$2YMw4M;<{y0)yDlvR1U?Kgn=Rz?YUul@=xBj~6 zp}r3Z2WbN7Cast+M&m`p50D^BO;_r&An7Zy2hY?sDxRvU4t^gt4ltGrdyn(T)85E+e@t();mY*%47_ z%qDN;E`)k>HqlvhdT_(^$9D#*YpIdHJrb!VuD)o~6=E-2&%dUiuekr9>ix1){*>G! zo-_JNAt%b)UYdu@u=ShkDDk}xUo3c_H-UJ5Z{x6MmVuc0CvVl=>_CZJO_b)TGgX!_ zcubzuIbWko5H|Pa>LYUt1AG$d4RC0aU-$z#cJ%RXAl#T1-aK$mB#hv8;`t!YUQ#@t zoseeCe*CgP0Vkz}jAmGc@&XxS}?cS3iyf0Zk*=HA#fv=pvIj=G~G-F zwT(TZr*b?SN?-_SZeL&0tW|wnvPO!+OQYsqSwu(hSbEh=Jslh_mbIAn2`cnfSNEv)jhC zr}YAiVmCL7BI`(Lu75Jsab8$A<_`~o)@E#HkJeqtpP!k)a@jC@-M9?-^loomcQO)Ih-~Z0az2u7AnX?`#Lf< zcv3QnMZ(KuUtK^sBleGxTD;QZT#Y z=3Z^dBq@~x#0o(Sa%P!Y+8X4ixtfFQV2sOeRHELkspg~;9%2Q8-P=e3usd%(v#SOHkw|g|{ylk)GIjV7}R1)g7Mb@>1 z&!!r9@9l$S3ZT^e@kWp@wuI0CVpjviPT_B|x}B3Apyp`%kA=j)x6%I_MN?Fyh9A^m zJbBZ8m_EJ;YYY75E)d}c>Fp#S2S5-@eF+4CAZB=s13?5ZnYCmwEW75~ipYLY9q-<_ zhIa;i?{$0GCPcMOQ%isPbt0q%gn$)i2)~Hs zT+$lT7GY>5|0O05d2XFbOFJ}-qv%*h-9*-E2y}OCKBvTYBS;J?PdqwU(j|}tOq(_x z&}v6ppZ%S_BDdL`4|&@SlM(zveZ_<1lO&2+uzcTw#B_D^(g7)g7quxN?8zAv%(~D=#LuaUElV1)b5ZQm8 z2?9J-UF_$3vIAzNR+`k`YYI^H$KPqIgGa$Y@AHrx_#g*M6~$XDEna@i8#S05E7Sl? z(1F@=qa+5gk2F!-9ODdK!qFeoYCUz@FX41?IYdp`ZQk4P7F((8%1(H%CN2T^u43q~ zEeZg>OC&YGkrMs;r}&rSM6hM$Ld5~$Z(;9U$4lh#RqdykIo@&oGHSCPfFsMr)a>9N>=7Tk|@L@Q-HMfH?LKT28hZ1)O7H)gX?3tY59NUqcRD zQ8Bv#$ueQ2sq|2rhdRrG+^qh&!Iw!Jc+$`hE^^a*yx z%|#HYHk##~!(&UR`w#zqnRM2b+hPNO!vsFUzY$4tG_o`@0TgU?^#4oK<-ZqAz&r83 zp|$XEF_4pYu|K=TxBE2mGX$5)-#kWEM=X&n0B9|UP|=1Y6``0IMsd zj}dWUC=7~e_$Y#GZR>rn$TT&pGhru<=JQ5@lalJ;GkXxIi;yt7 ziog1cF`v2GvYW%7LZP3;zW9vqecn{Uy;Hljq>YlHb+L;ZJg0`j!>M8LM#a?O{i35GfrG<7v?&ib{rE?ik^b{F6V-hxMMS0CiXwUwz{m2M*1BY%u(vy7FY z_bHs+$y$d5k-s#11dW7A5ui|}ZUwwabjyD@4}O%zpON(Em1Xz^YjmC=v4OWD0$?YT ze7DBpGz=p`IauddEab1nSb((%?oeBZ9mmYJ*v{yym6cj=$7%J+yV-te@PsyCL6rVU z6Uynp&gVyA&)O=sdR6u2*x8;BCfbDMp?E2+3L^<*w?HMbZaj`4u}2OB*d$GBDXMS71r)Ai@7ic)Kp|lSF}QxP0!4etJxp=pJKsWzP_OK8=%GgL`1=!7os* z;7;g;a+E@s8D&6(^=oFbAou#=3sXy7X1XlsuHo`#_3f!zr1YdMtb&g5!%xQ7Cl4bV z9;0KNe}74tWKfrH4z`*=`2Oah=;&hRXkhxUW(1IFc>`6wH6sM10fLZ#^T9t0E!0)u zg}+(L48UH|SOHX(&2R?Z@X~+vB7ha66q+W#O4VK)NN6(|Dp{^MxFk;#1u9+Em)?4> z0pSlL1YFz0l_=2f8I(hvp-3pGW+e3qWCwE^;_IEY?ioA&j~-&ll54{vKA381q$CzgfR7^~i^VOx_>#Y4VtqkvD`rV1y&0oTmrjenSGQ9Y3t-alc}pJtgT$uIf( z>sre6q0+^gAIVg@p?%5Ywp6&N$23xY-RNP2vGbX;)}@%?<`3#ud%UdbHy~{JAO7xb z`4%>S81ja4Rs2uJyP{+%CMV`43!9{Dcy)iFCUwhDJ*G&8v?S`E= z^R%QLdV`%8l5K3$uUP9Pd%Q$!j#`}(TmG?bVy$Eh(ulmVoQcba$B&m7&}M6zu@Chn~P1=Kz7UK#Py^VwHP}}yL4m5rS##TwiPSHKRMEx@%^@z zqZqI9Cr2*(V&IuiT0suJPnvWg^jpfk<-^XxWAhU&wxYz4P~xtxXSW8PvPA^LG&*b( zV%&6zMRxyX}Uy!13qyG-M#tLdR#*9-+A z=e4Eob^Ce}Qt$Hbk2evgT3#Nw1-8J)`#1AyM>ks|V;lSbXe|AA33QT`cq@S&|Iwu* ze9z2GE^ZNtW)peyArK!(yaUGnh_S9`2B|YkCHFF{d(u`@g;UQbzSp))UafkDhlCiutvE)H{Qh>`X5}mL18gpCe9v0ySA_Wkp5AzN$+IFtcwGUXaCt1axQd3b&|Dz6O?o?9KLiL zunM1=rd}Y~CB{nccVV^K&t_=9Sjjx&yx-*%u{MuP0z3}#)+RuyAY1A1;mgGi&0FJ! zh$XCjhpcZ9l&iDda+_?vG9&T}_C@B7dulAoFn_^`APszg_SdCpVyK^4XwPM|?n~o7 zKs#qp>66O>J1y|dkG=a^K(aDhY{Bbc+6pSZM54VQ0GsPq8e!@w5!rV-@U5*~NGKp` z1@W~2CFfHj(+$?FBL@FvR|UA@JrwIBVj2hMYT3R=+(f#%GW^Z&xhsoc1&kV_rZsA{ zxQjdH$boP+A1rNcIN{z&4`k`ji$Ml{21E3YBWw+w;;T}pWBGgHJZ_U4^QP^~FSHp4 zL0ClrdTB458q(Z_kJi>LTP3q8@jm zGbpOqm$6bAAe;W*m(2CthoJR4#4Lsi9m$cMvg|Gf3-f&aJTN|jltcQ!L*V(UTXaS? z$@*!Ev6s|hmxF8W+sa#{EY4NySYUqt2v|8Cx5<9a^KaU0TV6b6;oxgtfh>GT&5d-e z;+u&FTgN_)eVWYPAw1SfVEPX6yVkYbl!>e`9GBLcsatN1>du?;IBv+k; z_g3H2l9}PZF=*iPO^V)iafm$llN%$VwCRduRjU#V87+%~BLj~(NgXJA_gl&H_Sv2PxEbLZ|}M_8+)V^M5=4sj>fYaY6@97(|zDG%I} zCQHb$Y&c0>|1q0TJ(_PMSK<;8J z_i6Y_^`TM@4h~Ka=6^?g8DI9m*hv`K!XF>}GAb$^PbXdpsr5lFBc71NNSYCGqHb_{ zyw5`Dz*^-k%6fRV0`_PbolSvRJkzZP85po9ds|0B>I*upq*-1((p8o9i>nisX`oSM zRL_nB+*2dR^dF5s{=$Dv#E}`o=MGkxvBc@Fud01#mT+rgq+K8ZqU8L=m{tad2*V2_ z@yVY?g?>crg(wCEU2JQ`25_jNR_ut@x5=(tEq z#9A9y(0XjfGHkqE6cen29k<(WIo738)n)6+76R9 z`JL3sfnwpBfGlUn3Ih4`%$ajMxlB)0o?oka?$SANKqysJHfyvIqX1vlqw_)RT~Fq% zpJV8cU1;u*vuUQt(I`zLbjNXn33PAx>GFxhNmm9AF0bwEtWNIRb*&6_2^0=gKKX^A zAh|Jo(%PfTlV8VzPcP1nc3(KsvD;C<*gB?4N~dxxZi}N|(b93i~yHE|4J+1R; z;FqgB)DVedvkA2%*Rss73Y&^dkPBJVck>|4MGHeZQ(qvAxm~%?BGSnydEp+?gx!!~ za%tvzT^9^q10AJ3Q+O5cyo*4yrd=z8`Adenbh`~fe51`XK2b2<7*Ey;r#41EcW4?cI=r7kT~GAbPB174 zW*-?_f^7-Cuec|~4jBv)HxDT75J?|%4QNdvK?`&+l)V(RAdFzka+N71p9?JEt=9BA z1`eHG!P0xDmJBvN@8l75v{aJ~#a*0!=^jx!y5BNjA`=)J-m$x=^gl)W^!bwSU|&eU zVUwikG%u=B;6NRqtpkcT>Tcwc53)HwVBMhwpH+LcUq^U98L%001*v_+kwSkW*nmeC zn$xTB_@R*9h8w?Kxj3sTtPiuDX}+cucVr*^K#-ZFvX`;1%?Rez-Qw|^`BAS~a~JW5 z3@TQ9+=C2^4+E{Y?Pm*I)<=|27IIVuc)vYCo_#4#lG@?QOfZmXZn_lZJ4d#1#|An) zE#heM>r7DyO4tq}Y34-g_K}(Ry^!x4_PZp=Tv+;al~ZskqAOok`087PRK#QxQq%j= zbSZCFwrJ4R=w0T<%oZdq!xSCwCWI@Zjf>hcUWAY0jcG@dBw@apxw4jr2RS4aKV@(f z?ZId`7vv@)AAV~p7&T;~Amg$&NW()x_V!T+Cqa=~9+^ALzRtus%H?C`SP5a-o#pr) ze^f6#cl1zRvFmJpiovcuvB(^{_ukWn6zZOkdOJpPk~*c&2vQjP$(+T1Z?~G(yE+UQ zbwLboo`z({>xzBFosZwH+n#p$OoaF0k^uXP;^`?JpXR_eE>TglQ7$wQcO_;?o4nlqJ)rALL%BP!L(`UaEp z%=qSgQ{+gN#jkPwn~ZXoG%k^0p3yahR4%m6&ToqjCRVR9z<;q?-4tuI>LGaU&2u@4ky>O2YaQaw0vV}@Wq}h1J`gT`9wGL+nsPkri;I;!eAd`y z%;=w@6*Yc3gs(GQYyB{aKB>V>Hy2W0y|*ZsKt{);x*AZAQKnhro=1|3-&aIoz5|IG zZ?|!^*DzTP_cV+xjRDIw{nACc3xD9N`T@T1ndhg3-uKzctTs)F1 zWLBJ+0q7L-LII{oeVnP4N3(}5sdIAmB#Fy7FU%)LIxjxrsnTJvd$Y9I0JI~^sh0NI zD(h4x;ZM};)tH1n!6=L#R`uBGojy1U1&*h9%hek!Jtnm@kZDv0_TqIJ8W=amktNML z*u#T}Gs^X0C2{K+D}o@C@FRm?@;1z`4&k^p5d!%T*e1brxFQYeG5N45tMgC`&5bX} z@T%qG;PB_0W^XnPW@W)Vk%NgRSgPPf)VAdZD%W|>HC2?u@mX2Ke>-a@zZW(C=K34% z8>)c7;G!SM&$NDh)iv&7^w0+c_xVu&x(=~?*^`r9W>*^fn*fx<&`*yQM}&Lm+c23Y zSM`!zLEBx`tNLbk6yjsSgLFsJ!(RI5aJ6-l#<}UG_}R#Vq==|# z-=PNaCRn9;u|1i_&#t1FPTbYN9TBTLwL}|qv27yNHl1ImR2K@&e^c&^QMpYM&x6uw zAL+woFwu-`z>!uyl|ef7$T?b__3emD*k8WeVWB_`7Cy~&4K}+>_9spVoSESI)2I_qK z9U%_g+(J!PCNLM^`XMH&3#2MK$km{WlxY)GX|ZJyQ~a#qk{}nx0)BNj(C+SJhDU@6 zk>U?oWRh~fU}vL!x?Baf8xLf#q|4Mbv)R3CG6Sn{YfO(Huv6*Y*|;L>(sff%Po*4u zqEoNyLlci!MDmiHojt=J*xg$`Bka3wh6#a{S2$ba(AcVVbSK98Q5VN&++Yg8m!bHW4am)76ci4427K9>;zP1uusS9^y$uNcxnH7JZP9cGI*+1yw zpqVnh2Al3OkdHkZQyD!BI?H%MqH61>E_SqLhaz{7#zsxsWI+fb2m}YsqyO0F<{}Hg zz(@qU(DH9{Fb3i;9uf2~Ej@2AxlJ2%v$5&P$ipiL2%`}%pRa_1TS&wO@=0i?zml@| zf;-`z51QH&5{`MDI^|I8sSc%ZC4)2G&5XZ;Nw+wrjxXo@O}KUvn_6DfROr*3+n=Mm z;mXK`Z}5cvNlJ`0wP=^x9D^vUMl}8|>N8cTG9vB9Tmq&L9JC=c)d-}~el$8EHYS)L z(T!XkV3rJPOBXG!8F=KBShx%QS(#^VW}s;#wOxs~{9Oxf){ux{%kjL0DJc@7@F)Lx z==$|9EfkEDaNT~=EAP}E{A>ns`87F}PBYs5l2W**c)p1Ztd@osa687ED#)n# zv<(A#O=J0UresrEYntP|xHsqfe@l{K6RyuSc=5?0gtq`Ma4?({~ce;?_G6uA#A3g&EJ0U!d~0 zNp7|mwR}fSKWNVqQ~Rfwu7B7`_b5`gpFqvlh{BUe>Eh++7&Q(tN&EtVhczN$CEXh= z8S{KjHapcmI{Lk7)`&;Fe=@F1`hnSHw=ZUH$;^7Jif_Y=Wme2%c}2;1-#ok)oW0WV zD>HN3w~sQZ8tvGF4$n39ht+cHm8k^LpI-qo7N20@0pHpOU;sL-TodD zXJ9FK;K1D7aClai_4!s@b?a$x$X{fbZE55pcf9j;gP zxJNI1OR-GJDH$ywBE%_`^o(utzb;+dZ`Fsp)nv%49jRm9)K=IfA9qgJNIBUo8&E$| zY0*pz(wY^4XHij1f`3Zkl<6_$E=r{^t6C5a7sA}L!g~4;Nva>6EdbDY5F&qXwLWgg ztIxW%rwj3PvG)>*o#tav*Aq`|`xErhKOAO(sCDI$dUg~4Osf-iiMzb2FX#T;V}Mam z>PYB(A+3ZxQ};33-F^o*T%eR_Rl0I+jLbH;mJvJ$DjA{a>z5uOpM*y==aa0KQq+&- z(`|4T{-mrpc1HefHVSLhCbvk84o-=;D!ADJU%kGV1>zU|3Z(b;a%OUKp*P3PmXm1p z7>k7N#8S{gZ~Thbe?gshRSSiur7t~6-4YR#)RGf?8>-zdgC$WBC z-9juL)}J)8Jx!x|;R2VES%eZAiGE^o12;Gp1@U8gBUJcF^0J5TTv2||%Oh89 z3D<^2HE%^H4B;DuVwq;InKO{1q&689%6V36RXHo!M7v71=AceiA}}j$aZKd7MWY*q z_oFno9|mg@`kMEO1zFJSHKOgmKF#{LIkF>ijAXFjuf2TEaphyjx*W(0=Ri!8<_w} z@u+Vt2>JKJPtfiyJNm={zx*ML_+Ld`KGJ#=@rC%+9(?ut<@=ND2e0{IsFzJo*o4DM zF}9MAqfiT}7Xv-Esa;^Y-*GI8wkI#a&yFGg7@;ovJ_^w>dRn{q+z9e+LIY?0Br0DF zF#jlpPg&DcA$*YAtuItsxPcJk$z{)F=U<Un~)jtyrNf zJ+8ak`;(VYz|)}hrR!0<)2mB+B~GuzZ`3m9D3{H**1T^@p2Z35YWv+%zFp#e9d+rh z`H_4S{N>9_iB%p&=9lQ{oI6#xi{FZYYu9D9RN4JNHP#Bgb~H3Rz85|_yLqF*XZ!COI~Wai69g_AVJ_Thdz%LH05 zAJlx?;{!p)j;4bKDcF}4kKuQSAk_@!y6thgmh=!mU5{*_^cG6*tE1H1HBvDR zoS$teUJaqQb^Y#s?<2gRfGUGnOYfu3PM@zKEx3Y(ZU(f|y(cf5#Im4&KUJICfM6t% zmzJF9*dS$`zC!K*NDtQ_wI_j9zZkEY7$O^9;BJPOB;ix6DCC+rjKBli6azN( zHuu>3x(`qm$PTnc6CQ&j?z&-Z!N7YvL`?D#vSM}MS+<5fqnT0@F^0n|eqC`sx_$a& ziKD7`f+&Q;{)B*1Ip(<7yxrEY!OX+l6To04DFn*3Y}RT(hj>;3yI|Mc`D9Gd*g9|S zxW7h;PkXDT_agu^Pby6p!a7{o)BX7Di_va*hwsdp*J^k9b8{+-TsQr~Vb5bgH*;rDiUuX%h`ze-e+K~SR3%t=76&?Z!07mi^N=u_6v?)5;Q?I5WJdF^9^zhcbh z&B$YJS@A@ZYdLjrmWSJJ6E>DZVul-2%4xxrjq;Ia`r;>6OHP_`mEvVA>l?rlj?+~C zg0KY9{)r|v?0;iRrThU(pW9@~P+>geHIe;kTKUDlpYqAWL3zjg1%>T?=2zbjGY%;7Uk(0lg*DQ4rcNH?3V z`PLT7rQ^<7Ml&db}!h6fw4_)VRF z-p*&XXM%;-&8j-Q+iV`5jI&p2n9k+w59>ZMuSe(ia94Om(h;SKUF{kD0yq!t7ZzM{ z8!bY8R50?lCAN9wg=s_cv#X7V`9D`xwMx@v>u=MZjnT57X#c(W)YETQIRs$WW?28P zo6r9pSZ)maQD}(tr~bb~x{hdt+l9z)o$;Oo^eAcu<@Vdgvhd0@lyJ zHe&+&ePu$%jwD|e8ea$@2xX}}*<~`7TTEyzzPXAS!Q+cR356*t0|iQjYU|}*Z|iWa zGCt}KD8)vJW=taFjZ?`2HXUEyGZQHhYY}*yvJJ_*pXUDc}+qUi8{NFz3cAt0j z?Y`ZkMt!L-zpC-9dgj7hbCPBiAsu{7(gfI%j!U7W-!&;_ll%z0MOgkeCb^jR3A@V2 zY8v?C^N#6K<1;rJjTRt~VnsOi8D@IyDR2-)P7)N+k1Y>3T2pV9d6G_Hp0N-6GbJA1 zhe^$s7IpKgmF6zp@i)@oxYjVWa`pnx%#w_peO#sUx`mF^ zIacATyQq&ascN@Ud}W(Wrx>o9VTf6wYXaqN29eZ~0=AFj2y!=wSMEuae9kw>Vcfnp$#nAvh7&NZBc(tL?`-Hx ziLKZLVlz-H8sf?`PXdFuYsJ_nQb;rIgA=^i63+LeLsprvsVQ7p&&u&(ZtNKoGEDK; zZK&}mY&}F+?y2Q@$)8*kS_-)ACa+R?0&&Ac1?0lbUPTaunfvj+CA9KK)Wnz-FV0hjM zwOhYfv0`P>?_Xb@65_7fh0K++3%twSh0gl+u2pI8JXrVyKRojtWvZ$bw3{wQt83uIG2QqZ!j~I`4&9Vh_xx&emPjV&eCFUU{PDdN zn8v-;B5!nBs<~@YQ2l=MV1=L{kKs1fC^TApT~8Y=?E8EB$aHXqw8Ea4hk11}4X?XT zds&d4Zo19O-5N>Ri8z@}BaIRZdL3tzW$bUNi$6K6U3#XsSw5$=PrmqIXa6H}@|n?I z7jfmu{(3s>L`wA(isq?h^-Dz=I{X5fq0#h2naf^(`^vmVy+6*hT&mnHD`rH(Mf(Cv z73HVh__M)mu$Y^_WYZ#TBpqtXEDjP$(Ddv;e~CGkDXy6KP+2g46ha3)c$zkOeRyWk z2y2QZ3u$TtFExbIXu(Sx`7_-<1d96x`@GIq8B}|;coRuIMABub%ry4S@M5nXWfF3e zQ{=gL{p<`gHl%O9m4%N>=JV`l)|5Eh{pWpZ!(bBe9eM1yQ}M>YnuAi1Qah|OK!}_t?Wy_&&6lahTO-!&l$9iOB zO6M2^_ibRugSp3`tC_(YCDwI+&RV!wU(HhZ#Ys;V6B!o&;Q0+A8Ud;4pUYTPGN*EyHoAYO6?$ zd97f5qLNp9WSCkLp#=_*98|+r8}A{Lq=_$3ui0&8zgz^jzrPjkPC|5~S`48WBQ43T zNrOB3<2#ueM=r2^#2ntTc*whgAOqh^M{Mf5j9vbHjiU0_RmtIdgb)5rf)oBfVs89* z9Qmf;e?!UtI}}b-mIdU0o50^u(_~ACW_lLjw6@KZu9j*wbd;-7kNHD2v$EC7u30C1 zbsB+E7Ti~>@{NzD-|Te&OIh5iONw9bQ4>gc$d{4<`U6095KDrTMJy2tQFXC0NfMtT zwP=%Z0}hIG(a2n-XNIL=xT|v<)dz)|U}MIbe^F#54!1HcBJagzva;U1iJivX&tRW; z&60W$MNlgx5f8&GSJ)%==@+ZNb0sxRrl chTDrH+OCak&bhdQ<|AdM}(e3EeA6 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%0A*JqK5omY_`aEzInI z6@6(F@RXFgeA86*7=&2Oc4IURXgydq8~nWL9NH+@+R z(XLEUGZFa$FnzBD(4qXsfmmn&;D3ug!CuBkCcX6~;+t;&aIb+QK0j_hF@bv%&5a`$ z1R7P*d(q`sl=BN_6U;09@qFY3wo?O!dL4P&Sk^xwL~?7#9?RJMInojwTSkU=?W|X` z1<>a8%hU-iq}Fn&0=UUWRco^&;za+7Iia=l0Ovjy6-IXkD#5e8FaLSBs{9<*alDqb zoa{H-XOX+t{;wI;rjvxJ^z$sL{9OM%@csXOCY4151tnm{cp-i8;6Y|Oi*JAkRoQ9b zFA4INerH1(kO*nIyt|z@Z}a5Aq~Y%Bbe>Ou2MrNmTu_p&ogfEZZtirb3P4Jx9+inq zBUsEr)(@ReTjKo&6|_3~mt8u0I4dq{Ka>CQpT39X|1n`KO!W=_K?I|f5akz?k{A3L z9w#dH{)5Q=v%3k@9cFIJ>j%YfRB8wiBmW zK_C@mR_m<^cmB}5oD*Kv^8S>(AmNq%-sN|w2HybXyHvT1{~HwkrOwqUYNpZLzdpa_M+bFfwauqLP=?V_ z6H#`C(k7ZbcSMfV&5ekp)ThsKOOLqCVAtx;yI(kziwcjfVbITupYQta&DCCQ?;rQa z?`rOf%fs!sx5jCeyrhox-ITo^d_!?;K*?5)^^DyXsbdOfqur0^5StP}u=Fbpd9<;Z z;_mixO@LnEtL9){NZjhs8URSVx;Pp7MnSmexU$|&Z(4( zNlQ8l0A^q!Q?U|vrrW81A8gKYg3G!0Yp7B$+L*g@$(Vro{Uwbmnq&WsS~XU!x#+a6 z*8Zz;E*WgaWS}D>b&iqn(jCodNF?jL9ZdCdQ)ElUCB}WO501E;%{Qn%YNx3@17)h5pCS|&{ibH1lH{J!Nuzp#rE**4#b5xi(y)t1BOa;(NhU8G~> ztV|9jdxxYSW9*8acV9=Nod96}lFY^?6(G3$W39mW{>FC z3tR&p?0ZOT>qcUT)r3Xq1(iDTPmq2m(DpBe$%oz`TreI9*E`&24B{q(P|q)N^o<9D zPxJ*V{wd&-tye^={*@Mdextu2T*xyDjElK4JI}DEoIyMAT@f-LFrHE<8mo(*GgjdO z;~92OmO~eAZ#6<7zU;f>L_l!K3!g0T3$i(Fi_DL(!)qd6`DX>nE~E-8n0;t+zl=R# zq9JYF5NUhjQuh0FmMNVDY}Qan^U%|f|9tnC=rJ7Ok&FgN-MBD|;sR45h86U$=yRc^ zYGnwnHBwEO?bNRxaYhZIixXPHm%#ale|f()s>t>mj)EXap(hKDfEO( zc_Tq3WMV93K_%vG713U{n-ycA%b(Kq7jFyx^dH~3z~iTrnaIz^a5j>q4S*6xd9u+F z9RpEjgzGGTqSJ)ltG?gzACFny9uB{%$vkLB-nG5H4?rE692{r6@%&!cqF|MeN>5a= z%a{QN-`w*>tr}O57}%wkA;KPAXK2}>fpWc}F($QEkz>^tMB@}g&zV-GYa+t9IU;ny z7b)R$fu&qR;qFony<&9SQ-SW7tRSDmuE2r5hf4%^6SLAIv{1WpWcyytqMTu#h(D~7 z`SrDwPY_Kav96QNO6jyK*4CBs5-IQBG9sO9%ONe{-6j6AsD}5k!Vo*X9OjSc?obT@sq9pwqZM4)hR@zTK9J z;-UKNs&#b4=7hCS=?ov3|NXncIbCm~ulT!LJc;|4doHT8K63{^@bkG&X?cHtOfwH0 zhltPGfGVAkhtHFSMRs38l4(VGE_=k=aqqkG$y&6QO{aL&NJS-=LO+A)G)AgLSX49v zZ}NKovO+YiA}8Rjg8yKa= zUopZ7BtkxX#k(5UG9TIYgWAv|ZN2v_cPk?M( zl!&ECb+&8p?m4&Jd1;FB2gZ{v!d*j}@OwwyY8A}V+uLt!|Dr!tO1Y>(&%Cw~iagjK zY?W)-Hd^A>1&JX=R|ST9{FP?O6X+wFo4cyx{#{Bd(L3AM_o*-Z8IE|1x{-VH#&utY ztA%^U;dYp2vyGoxQSpI+QND=v1s2Dp}iTqKZd@BmE@Gk6Zd9r{r2|x%=@$V7GW!%k!j8#%#bw+^S@1!r^KX zT!k>?G+ZL;25DtDJqj;m+OnjdtfY9G@MhZRg7nU&xE7ohjXo^9Okdzp(2)$@QYu|5 zgE3?zfiWh5zO$eH4%5gW@!B%kLlaqx9qW52Zb4BaV!e=dWf_#|WHmUtOd6}r+|V>|PxT3siVi%uM&zE=YY!yU`V2eJ z+nBtmybK>Fycr?4(C>Q7)2wh0;!c`{Fg19QonxgbQ8U#fRHEvyh{f&hTcrkcXCeIYBqfBeW7--A35VBgDT*2--dSF$F6FvDG&s`#r`08f^2azdKOLp<$d_;{@7bLhX zT=txNxQI!EGFVwC1yd?ks-11YUTu`9bms)H7Vz&4*x+tmA!K7kNfu9?l-)<$BnimmY)h6Z3En^3=0Amgm zYt^VKid*?nDBtH>>wDYz7!Zz6ui{^vQ9#yJ>ml+;_Il3DX!ZcQ;PhvJ)(J3*!SP6_ zMTV!dOTcSaEO`-EO1W*K!K`5xe_Bt+G|G2}3ywIuZt1 zQ}xNY@*jiDs#9td1@GV;{89|g;Kz_w8q>ZE1`@CgO_tnx?ixmE|^U1WEBt~SbRGO^WqreF2%ce%XZ70Xce4Bp-L!Ff9@hcAd% zu@EY?W+AP4HOItXgj?9rc&%mql>Sz5tYsrP< zL-MO85{mL|Aw6z1nuzkepurygih5TTpKW#(lVQ z69BZbTwhp;Nga0_b#L`6Zb{Ii78w?7_IjhV-fe9OSQXaF_E+2geyk8VCQCI=D2ixV z8p&kG%gwpo{>V%<0mSFP!uj~t^%0EV19G3?`wp){Orc3t5mB?#?n9yvqJX%adCne9 zn??_Yu=kp2a)1YYkRmKo&I~F#>Vr-dZ_?#jMMGkORs0KCiVG>QE1g$Z+}{73oq2e~ zhZu&20Rtx)pQQM|2fNBj!=&@Ehz>5_P&7)ys25u(?tR@>D%p+qb(IFQ{2m$dB5J#@ zt3zbK%$d`8y?l+fb5x9>iZYe3or3_pq1zNgdUO>l*pH^pE!J?g#CcEmg@D;Ek1blH zi%5F3P%8vGs*GWMvLS_y7R;Dlm0Yv*dPC!M*Fs)6!~`QNlo~vydA`E~ zQh;wzk-LBpG(w$$$y3}&0(i@axUy9yt*$)=_OM0GOG9MF_nW2GgCt&P%>xt%M$;wr z=g>g+7Ugvm_SBED^X?Ga-+`wB>&)bdy* zuuxrEAun0JaDXrAz^l-(D=hqn?*N+n5Yk)%kGvZW-I6iF(}^voCx!;D$16;q_5 zJxeGF=8zztVVzw%xeHSG@Cdnn!n8w}rl9 zjQf^Z>SkzQt^9_d6j46xq~#+|^Qt)p$I^}6rw=n5L6vRRFHVvw&Lj(>iY7fl&yss*)Q|gNSyeoUIQ`OIsCNf$0;yv0cZ7XvRmu$$g zuVHCj64tq1+x19|F6^7rwNNPepAmbL{O8W9JpI6c99CH9^W%`do^*|c`uMHg3jZ7= zI@QS?6<<-B(|9VP>6l@hmFMj#bjxmZb2+=7O%$y+$%qlHD&{uQkw0pm-|Aii~1i zmO7Fq@c>t$8o-#X+~QuPUeb`95Sh@Fra2=aeZ=_Hs-~YSXY83JzP)UU?&+A9;|^Y| zdaPihFI^EKt@SMCenV@v($)F1x<2i;oKTV&7M$M@a!*WTM)6w4B(sG|igo9NQvDa* z^j8T<`MO`+wWYh`&9Y+uI%)0ld16Rw;R|EJX{Rlv0e6_nVJ0#TOT3K6J}vAr^>96> zs%Q23-irH6)|Bdv6_cHZ&w=AkdU^5Ba$voD}5^|-*u*3DHp1JB#O5q zG4Gf&+#l9ERokC&rZp6h!|nY)@3?<6xTGmp(Z{^}-4BVtWfcc(-UiflO}|n}3;E3fb!{n;=;kwnjXdC01Kuilqa zUFyye?cYi)i}N;CN=}L&Su&k`aH*}LqZhqeF_k&DeJOIhlG)tikoWy6p^aQc5&O*A zC!@4E!wYYxDpq4N0-2k;e=g#fqaqYgIi~w=#)6k>ub&p~jy8uZ(fE8PfAgKKHE$v^ z4&%brB?8CXV7AN6AO6}<0QXid!a%}a%uXM=7W-k_r!|tUEHkV z5r|LB_)MERJmHQy$uMtb$vvNUpL`A1G=wDM^DC6SMkJhm_i)sjPLULUgGG(H`WZs? zgwt}LXNDxhC6xM863IB8va;Qx?16Rb}`{rIK^*{XzOCD<<+~bsvoU9b3<(Y zg-@rp2kwdX*tkI|^N#I?28AuNH@!A7K5VKLr8Z4ZJ*!zRap9UavrF}r+qBQwhbrUwD+BJU6}n@&f@*kU~`R+%Ju6Mnce|orq(zrdz)X~Qj(t$mgZ^k{n3M> zJdLkUOT!He8un5SBFy92KXwIBn$%W(d>)*g6J0;|hoE?*$DwO%@T_~A2>HuCg9{jd2>n}7Pf(p${hJUT@+ zC2n#>f~)a`g`dWYSja*iUPUQq*5{CEo^e5|O7pe79vN#3cU#`Ly39|rt>;U=EvtA( zu;M4r$a|T->-1AEPgDEH{do3bqZL(mBz9_zTze_|21x|zY1Ap0_N*s_?Yqk8$NR*a z6St=X%ioruO#iA7Bfo!qo0g5r=sSz&JZsa$=YQNjtW$GG*KS*ha{LjQ0woi_nyKIJ z8(#Q)SvuhUr0Yx1Z$DEt^K#(VM+;03|Cpjvy~yk0($iK8tTeo?t$WxrF8GIOPupaZ z_C-%kQX|^v&Pvrd#Y5Djca*T|9S*_TxRd_lVA$@A%3_i8Q>ZmMKIFOZ5$c$F9Zwa43;DxRg?^K;vi z+{@1_370};8mSSR93K;_&z5cK7&H9+I621)t~CZ_uez>z?i6dz67SZ2dgPizUdfXB#B>)Y!(DlSu9BGk2_we<0I0c$Um~C$Z{w{??9ZbBH}JVoDC4 zt!mIzH7)Xc?`J*jd%SIF{8#nkI?vRTToi_#&`6hGub8CXTz|+#bXbgUy4G@=P*$sz zY5vyu4DmZk)9M+%4<^U3%Q~hTP0Ud#CF?8s>uBxKeEcrMB2KPtb8LP=N3B*x`{_o- z?;VM9)=bgLOFNu9jl4EAmlc^vhS|9ZOY3L))7+kwBtAH?_tn@EpN?+|ug(3b%(1P$ ztLh{)ch9S+_l`DpS)y>YSikQIa%I+%`#N(XPiiQU(vh>ItQI};V&}^&r84%4c!yK&rLq!v^{>?`wUV+z>Mf5nwDjaGOKVLudv|N= zH>uzcmlI4c9Q;7sI@{2@$v);m>N?GO`MQFxPK-Kj5Zy#l&sD!fV! zx&9{*3k(yPxZLD@TlaQk^5@n^cFQyC$<+yN9uey7rkVjZAOW8 znnJ{Q?LDGVxb3n8r?WxgxE-5X4cBHA&9$=~b8Y;-eBo}bY26!SerBy4vGr_eMY?1A zyUOHb8~f_q^qZxDyH-BHP4ww$44YcAKTNLa=i9p}9zTydr)b;FDZfQ75Or1Bz3A!9 zjVmsV_gzMuWxHkn`c$zc;gMQqt#YlqtbSI=ZZKQ$_*AZ0cW5D%G^LQJ9ujy%U+U|c zElEm#|ZyWEbA01xsd(Sux?#Myh&%i$dWJSN#>?T+x!;aTH@|? z&FSn`am}YcQt2&=Ja6TOPru>lto|VDHRKn}EO9IKjb33dUdfcYKZ>}`wp?bSij&vu zg1aXajMc-p;I`_TZHs%AH^107uji?c(LLd&pc!f}zm?_LnLU{?kL8?kd%KB_MN|9( zuSNP%r}tcXc~2_w4uhnO`&4^nPiVr$438hNz(a$SsOXavaLIynF|}apQL^Tu%RWOPaInh{&Fen|I(KH z31sX07bJUfWzwk>G@Ol-w0~PL>mmgEjD%nxwCuhoj%^N67k^74c_J<}3JFi4IyjJB z9ngHETv&TuZJn$}Ku*bVINahs5d6lmw?U@KzhzM8*h~sdy1)LiDI^pjLG{`(cw_`EARQvzMMVh0!`||dWf~>^r za5!y@H0&9F&ti~>bP^Mtp}<)gGS!s}2rawMcnvThBE${-ZPok&G4M1B3(SD=|EJ42 z?T$4|O=JVu-6o)7fwu$zB6f&9okd3Tj&cGIU6`2U2f%Lt)W=BZ4i(9-goquLK;lAM zLN1v!0chp$qGxLRo;dcVg#yqVNN{Acw=&__Ef=g>{H>CWfV2f6jr*AJ8^^v6hp6}# zl1yhJ1ZdvStnu8zZ{_da84KVC@UF#xgERyHQyi!iGQxwawJC+Q1DKM~eXYQ7hd}@g z-vU#}1cZQaQSek5T{jBw0)VHF;nhIOUcPw@$V9}2RzZ!6v;$fUROfmO?E)kT=9|W( zAPfc>aqZPBlj=<3)+6{v{=jVmcGdv4H-uF4&4vWja88ebM~Fo9hr2Zyw4W=mLbVKR ztQqUW7{xD}Ktf!8=fWOL=+oaA4h#TiL-nr2D0~>yHs4?}lfWW6lel$DcgEFtIsozX z00XXEE)bDPCwX!)sZq02p5lO41uqOL{ZAbGi~;{VB8BRN(4khLgBVP=qc>Cku>|Td zsMHPpT(oZzGZcVKwIdO!?tS(&7<@^%P1qKIM*!Ru1HZdU5IEVDfH0tA{AJC9(Va(j zSv3VG^WNlXta-TAkJJ!nG{|0YwX4Yl?KxoI!^<0 zU*ui98K_4G7?>Ue2J>CVbV$ZVBoAd^J7Z(@jsrY(fSQFMB3S@9jX>o#TzJLA#18{r zJ-pbFxMiyVJeIvZiFY6JI8Su+KLBlk7wh^URsw*%ToEQ6A^vh@2kWj84Mz4T;4Xj~ zhC#9a0WaE`e>MqWc+sc~ZoT#EyRwhW0O$)qtTF4@3IJp>yoRzT(Q_Ad(Qz>h$k=hQ z9nU}69yCmV6q`fQaV`GUTY>HlbgXsdA%f5uObSTO!xx#7qv`Ap;3OE3u{G>V6aY+i zB@@X^ZWFW4zyo;}036t9Y$gc=baiAAhElV)smm+0#|i>9W82as2La%4a=;n7O5P*l zde5%o%D~P9Hh5b7PaONXqabV+6Hab=Anx2I-$64@?Lj*&)c?RXC$f_OOgc;-$W)$o z6=W_eff{ryNDISW{}acqa2AA2VmPAhsejruSkEP5;}I$k{2q9*+CJmLKi`2!>y?`O zWNoyoP}E-F2|-)Jx*M~o0x-!;)UpQ?6d(0v*Fu1v21PILS2H@97~>`ol!6erxYIHR zmzSY)mxBXZ&>6ZwI56U&T9BmhljG=;Lk_U9-ZYUZ0GmpL1ysm;%-fr;*f{KoJ-`E@ za#vvVtm7^KoQ~LYU-9rs%P?00-f|EYoYnp(jxFrTKhF_iIFiAUq~V$NJln5XVbw{r zp3!L&cG)h%O8`8HPIYGSXhLb~p%z5IrU4eadbS0w_T<;AgZ9IqQJFlr<~Guv2Ee@q zTx@qSbEhEO-c1113EMYyxHNmSd=}V9NUa zhJ|(+yZ!hFJK58z4qU{nXNeS|Q_vQ0)M3r4|A}MMcMCxC;O0KwjlSN2PWD5AhaKN_ z0{CY+(-Bx19IAJ+U0c7-6WAr7)#d$CqFNmhC;*#9q>{N!GvBMusz?2(10X8Q^ZK7S zcGW)qaTJ8*N_4bC=+3C$$lIYQk(_=M6&Sr=0xNLb0Rg@MCin=QiyfKz%L%ywE(P>! z&@V2kU!P!saLyz&OgFG%LO4* z99Z0}N7Lm7g7&kApzg4J&&p$h@X*OK&v8XziDM!H-UbR^iD|a_k%GWI z@N^Q)ySRv}6svue3`Eq#u;Ln?5`gH%B)gD?oOk3})=QcIoB(j_j7v6}e>l~d344FM zyJNdHWXmT|a1_w79^1n+0+4AWR|FR02Ho#;QGdlY0^}j+C9w@^_F4Y1GztRt#ULUS zZk|(a`pWvr!2D-`k{`qhz=ZAt?r-MVeO3`zb_YwsFvj|=eBp4@ntp>hUaCG|$z{COQ)ye#$(Pj)=HM|#$Cb`k0ya9U$`VoVE znNjyHHbnq5T!TBvsNB8eRr4eOqANsLHSbCl4Cp{7+woMhbDfIDG{BAn!^VzKLg|8` zVHXxQLV3c)wzl0wr=5-f$Ig)sUKR+>qz~x~49_xoAPa0X!V24otp_7R* zP^(zq(luXz4`8`aA$*goZ<(K-NSgx0$sjUzRZg*heT-tnMvo$A&UX&i2>H>aeN@BJ6Fs~w(%E~_w9d&8Z2|INjM5JH}1BlP`bS`i z1_$or-!IemA%0yo+v_(CrcqWEuIUrlPSpTY&1mKm>B6K9Dq+}W{ZE#lQYla=1Pu2- zacrSBt~hkv9r|!Is+^%pWI+~&-+}XVuof;V{HT;S8(o3312saxZ2uF-{`WgqK%Z7& z_lAV;P2!>2_rHE0HsC@j6Bc`he*QvuXZ15subR-wmGbNQOCAR@^jnDgmw{5U$8##C zf>((MYp}afIm6ShdIX;V9|<=fl%s_CWCtN3Zno8T`6|)mm~3bh^D*DOKx8NYoyua8@I*%v#Po3~Iw13H z0=j64em`21eNP4P%%%LfZ8SE7QTN)RT3_Mt8^_Lq=$}3- z`*X5J^_R+Fm&t|d`r8(Hm`vt2nzDfioOYS=>l)oYLL6IP{BMiz)eWA2psoUud+boI z)osFa&``M~4yW74=#}ER)PKXE?k6;3SnV4G6{4r99SIc@1dSJ4*JEUOp#EqO-&^C{ z>iS5j-P-fBak#RZIGid*idISfczZJJXLG4&&J>A#<;St#FXvG> zx2$Ho+8Srx!atbY75^18cosv>j)OCM+aId(s{cww8w)q7x#*NL(byksJFJTiT45YF z408&@nds_Ispa574O(h{+AGfTIMYM@DX(EIkMjDGMR69#nUv^Hao5-JC~oi+MVtW6 zi|hXYen0>h7y1AC8hcI>=Oy2NNZN4fV^C7xsPnhO8s`Pne=s9pZ)OP05XQoJJ@lWl zi@26O@M7M+%c41z!+FW?pOUxWxqbD(l6$ZG|2nPTF literal 0 HcmV?d00001 diff --git a/enterprise/dist/litellm_enterprise-0.1.31.tar.gz b/enterprise/dist/litellm_enterprise-0.1.31.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ba1a717f62e458d5de2db9512ea6c72c44ab9c8 GIT binary patch literal 50205 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 F0{{}QKvw_& literal 0 HcmV?d00001 From 0cb79ace97291be722fcab770cd1c72aa4026e03 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 5 Feb 2026 21:44:00 -0800 Subject: [PATCH 034/300] Fixing tests --- tests/proxy_unit_tests/test_auth_checks.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/proxy_unit_tests/test_auth_checks.py b/tests/proxy_unit_tests/test_auth_checks.py index ee595092995..66dfc8d15d5 100644 --- a/tests/proxy_unit_tests/test_auth_checks.py +++ b/tests/proxy_unit_tests/test_auth_checks.py @@ -483,8 +483,8 @@ async def test_virtual_key_soft_budget_check(spend, soft_budget, expect_alert): @pytest.mark.parametrize( "spend, soft_budget, expect_alert, metadata, expected_alert_emails", [ - (100, 50, True, None, None), # Over soft budget, no metadata - (50, 50, True, None, None), # At soft budget, no metadata + (100, 50, False, None, None), # Over soft budget, no metadata - no alert_emails configured, so no alert + (50, 50, False, None, None), # At soft budget, no metadata - no alert_emails configured, so no alert (25, 50, False, None, None), # Under soft budget (100, None, False, None, None), # No soft budget set (100, 50, True, {"soft_budget_alerting_emails": ["team1@example.com", "team2@example.com"]}, ["team1@example.com", "team2@example.com"]), # Over soft budget with list of emails @@ -496,8 +496,8 @@ async def test_virtual_key_soft_budget_check(spend, soft_budget, expect_alert): async def test_team_soft_budget_check(spend, soft_budget, expect_alert, metadata, expected_alert_emails): """ Test cases for _team_soft_budget_check: - 1. Spend over soft budget - should trigger alert - 2. Spend at soft budget - should trigger alert + 1. Spend over soft budget, no alert_emails configured - should NOT trigger alert (alerts only sent when alert_emails configured) + 2. Spend at soft budget, no alert_emails configured - should NOT trigger alert (alerts only sent when alert_emails configured) 3. Spend under soft budget - should not trigger alert 4. No soft budget set - should not trigger alert 5. Team with alert emails in metadata (list) - should include alert_emails in CallInfo From 039b37fac14885cbe12a63e14f16f8cf8ca8daca Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 11:31:35 +0530 Subject: [PATCH 035/300] Add compaction type block in the output --- litellm/litellm_core_utils/core_helpers.py | 4 +- litellm/llms/anthropic/chat/transformation.py | 64 ++++++++++++++----- litellm/types/llms/anthropic.py | 1 + 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/litellm/litellm_core_utils/core_helpers.py b/litellm/litellm_core_utils/core_helpers.py index 00695cbfb5b..7c8e2ebeaff 100644 --- a/litellm/litellm_core_utils/core_helpers.py +++ b/litellm/litellm_core_utils/core_helpers.py @@ -94,8 +94,8 @@ def map_finish_reason( return "length" elif finish_reason == "tool_use": # anthropic return "tool_calls" - elif finish_reason == "content_filtered": - return "content_filter" + elif finish_reason == "compaction": + return "length" return finish_reason diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 61616c7f1b4..5cbf014f8fb 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -1028,9 +1028,37 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if beta_value not in existing_values: headers["anthropic-beta"] = f"{existing_beta}, {beta_value}" - def _ensure_context_management_beta_header(self, headers: dict) -> None: - beta_value = ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value - self._ensure_beta_header(headers, beta_value) + def _ensure_context_management_beta_header( + self, headers: dict, context_management: dict + ) -> None: + """ + Add appropriate beta headers based on context_management edits. + - If any edit has type "compact_20260112", add compact-2026-01-12 header + - For all other edits, add context-management-2025-06-27 header + """ + edits = context_management.get("edits", []) + + has_compact = False + has_other = False + + for edit in edits: + edit_type = edit.get("type", "") + if edit_type == "compact_20260112": + has_compact = True + else: + has_other = True + + # Add compact header if any compact edits exist + if has_compact: + self._ensure_beta_header( + headers, ANTHROPIC_BETA_HEADER_VALUES.COMPACT_2026_01_12.value + ) + + # Add context management header if any other edits exist + if has_other: + self._ensure_beta_header( + headers, ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value + ) def update_headers_with_optional_anthropic_beta( self, headers: dict, optional_params: dict @@ -1058,7 +1086,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): headers, ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value ) if optional_params.get("context_management") is not None: - self._ensure_context_management_beta_header(headers) + self._ensure_context_management_beta_header( + headers, optional_params["context_management"] + ) if optional_params.get("output_format") is not None: self._ensure_beta_header( headers, ANTHROPIC_BETA_HEADER_VALUES.STRUCTURED_OUTPUT_2025_09_25.value @@ -1227,6 +1257,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): List[ChatCompletionToolCallChunk], Optional[List[Any]], Optional[List[Any]], + Optional[List[Any]], ]: text_content = "" citations: Optional[List[Any]] = None @@ -1239,6 +1270,8 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): tool_calls: List[ChatCompletionToolCallChunk] = [] web_search_results: Optional[List[Any]] = None tool_results: Optional[List[Any]] = None + context_management: Optional[List[Any]] = None + compaction_blocks: Optional[List[Any]] = None for idx, content in enumerate(completion_response["content"]): if content["type"] == "text": text_content += content["text"] @@ -1280,6 +1313,12 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): thinking_blocks.append( cast(ChatCompletionRedactedThinkingBlock, content) ) + + ## COMPACTION + elif content["type"] == "compaction": + if compaction_blocks is None: + compaction_blocks = [] + compaction_blocks.append(content) ## CITATIONS if content.get("citations") is not None: @@ -1301,7 +1340,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if thinking_content is not None: reasoning_content += thinking_content - return text_content, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results + return text_content, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks def calculate_usage( self, @@ -1444,6 +1483,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): tool_calls, web_search_results, tool_results, + compaction_blocks, ) = self.extract_response_content(completion_response=completion_response) if ( @@ -1471,6 +1511,8 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): provider_specific_fields["tool_results"] = tool_results if container is not None: provider_specific_fields["container"] = container + if compaction_blocks is not None: + provider_specific_fields["compaction_blocks"] = compaction_blocks _message = litellm.Message( tool_calls=tool_calls, @@ -1479,6 +1521,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): thinking_blocks=thinking_blocks, reasoning_content=reasoning_content, ) + _message.provider_specific_fields = provider_specific_fields ## HANDLE JSON MODE - anthropic returns single function call json_mode_message = self._transform_response_for_json_mode( @@ -1509,18 +1552,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): model_response.created = int(time.time()) model_response.model = completion_response["model"] - context_management_response = completion_response.get("context_management") - if context_management_response is not None: - _hidden_params["context_management"] = context_management_response - try: - model_response.__dict__["context_management"] = ( - context_management_response - ) - except Exception: - pass - model_response._hidden_params = _hidden_params - return model_response def get_prefix_prompt(self, messages: List[AllMessageValues]) -> Optional[str]: diff --git a/litellm/types/llms/anthropic.py b/litellm/types/llms/anthropic.py index 62e775d4faa..85d419ccc7d 100644 --- a/litellm/types/llms/anthropic.py +++ b/litellm/types/llms/anthropic.py @@ -633,6 +633,7 @@ class ANTHROPIC_BETA_HEADER_VALUES(str, Enum): WEB_FETCH_2025_09_10 = "web-fetch-2025-09-10" WEB_SEARCH_2025_03_05 = "web-search-2025-03-05" CONTEXT_MANAGEMENT_2025_06_27 = "context-management-2025-06-27" + COMPACT_2026_01_12 = "compact-2026-01-12" STRUCTURED_OUTPUT_2025_09_25 = "structured-outputs-2025-11-13" ADVANCED_TOOL_USE_2025_11_20 = "advanced-tool-use-2025-11-20" From c03ba8394e4d1e303b9274b8c50917dc5019da7b Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 11:54:47 +0530 Subject: [PATCH 036/300] Add compaction block in provider spcific fields streaming+ non streaming --- litellm/llms/anthropic/chat/handler.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/litellm/llms/anthropic/chat/handler.py b/litellm/llms/anthropic/chat/handler.py index 6a9aafd076b..485e95d6489 100644 --- a/litellm/llms/anthropic/chat/handler.py +++ b/litellm/llms/anthropic/chat/handler.py @@ -512,6 +512,9 @@ class ModelResponseIterator: # Accumulate web_search_tool_result blocks for multi-turn reconstruction # See: https://github.com/BerriAI/litellm/issues/17737 self.web_search_results: List[Dict[str, Any]] = [] + + # Accumulate compaction blocks for multi-turn reconstruction + self.compaction_blocks: List[Dict[str, Any]] = [] def check_empty_tool_call_args(self) -> bool: """ @@ -592,6 +595,12 @@ class ModelResponseIterator: ) ] provider_specific_fields["thinking_blocks"] = thinking_blocks + elif "content" in content_block["delta"] and content_block["delta"].get("type") == "compaction_delta": + # Handle compaction delta + provider_specific_fields["compaction_delta"] = { + "type": "compaction_delta", + "content": content_block["delta"]["content"] + } return text, tool_use, thinking_blocks, provider_specific_fields @@ -721,6 +730,20 @@ class ModelResponseIterator: provider_specific_fields=provider_specific_fields, ) + elif content_block_start["content_block"]["type"] == "compaction": + # Handle compaction blocks + # The full content comes in content_block_start + self.compaction_blocks.append( + content_block_start["content_block"] + ) + provider_specific_fields["compaction_blocks"] = ( + self.compaction_blocks + ) + provider_specific_fields["compaction_start"] = { + "type": "compaction", + "content": content_block_start["content_block"].get("content", "") + } + elif content_block_start["content_block"]["type"].endswith("_tool_result"): # Handle all tool result types (web_search, bash_code_execution, text_editor, etc.) content_type = content_block_start["content_block"]["type"] From 24dda99bd76a71fd9e5949ac129f1adc47130880 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 11:55:12 +0530 Subject: [PATCH 037/300] Handle compaction block in the input request --- litellm/litellm_core_utils/prompt_templates/factory.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index 53d2ca2f23f..f9ecd78ff1c 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -2190,6 +2190,16 @@ def anthropic_messages_pt( # noqa: PLR0915 while msg_i < len(messages) and messages[msg_i]["role"] == "assistant": assistant_content_block: ChatCompletionAssistantMessage = messages[msg_i] # type: ignore + # Extract compaction_blocks from provider_specific_fields and add them first + _provider_specific_fields_raw = assistant_content_block.get( + "provider_specific_fields" + ) + if isinstance(_provider_specific_fields_raw, dict): + _compaction_blocks = _provider_specific_fields_raw.get("compaction_blocks") + if _compaction_blocks and isinstance(_compaction_blocks, list): + # Add compaction blocks at the beginning of assistant content : https://platform.claude.com/docs/en/build-with-claude/compaction + assistant_content.extend(_compaction_blocks) # type: ignore + thinking_blocks = assistant_content_block.get("thinking_blocks", None) if ( thinking_blocks is not None From 887a977ab49b5e1643fb871860bb84e794012877 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:05:36 +0530 Subject: [PATCH 038/300] Add doc on how to enable compaction via chat completion --- docs/my-website/blog/claude_opus_4_6/index.md | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/docs/my-website/blog/claude_opus_4_6/index.md b/docs/my-website/blog/claude_opus_4_6/index.md index b1836cfaef5..3e07b70a164 100644 --- a/docs/my-website/blog/claude_opus_4_6/index.md +++ b/docs/my-website/blog/claude_opus_4_6/index.md @@ -3,6 +3,10 @@ slug: claude_opus_4_6 title: "Day 0 Support: Claude Opus 4.6" date: 2026-02-05T10:00:00 authors: + - name: Sameer Kankute + title: SWE @ LiteLLM (LLM Translation) + url: https://www.linkedin.com/in/sameer-kankute/ + image_url: https://pbs.twimg.com/profile_images/2001352686994907136/ONgNuSk5_400x400.jpg - name: Ishaan Jaff title: "CTO, LiteLLM" url: https://www.linkedin.com/in/reffajnaahsi/ @@ -219,6 +223,131 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \ +## Compaction + +Litellm supports enabling compaction for the new claude-opus-4-6. + +### Enabling Compaction + +To enable compaction, add the `context_management` parameter with the `compact_20260112` edit type: + +```bash +curl --location 'http://0.0.0.0:4000/chat/completions' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer $LITELLM_KEY' \ +--data '{ + "model": "claude-opus-4-6", + "messages": [ + { + "role": "user", + "content": "What is the weather in San Francisco?" + } + ], + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100 +}' +``` +All the parameters supported for context_management by anthropic are supported and can be directly added. Litellm automatically adds the `compact-2026-01-12` beta header in the request. + + +### Response with Compaction Block + +The response will include the compaction summary in `provider_specific_fields.compaction_blocks`: + +```json +{ + "id": "chatcmpl-a6c105a3-4b25-419e-9551-c800633b6cb2", + "created": 1770357619, + "model": "claude-opus-4-6", + "object": "chat.completion", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "message": { + "content": "I don't have access to real-time data, so I can't provide the current weather in San Francisco. To get up-to-date weather information, I'd recommend checking:\n\n- **Weather websites** like weather.com, accuweather.com, or wunderground.com\n- **Search engines** – just Google \"San Francisco weather\"\n- **Weather apps** on your phone (e.g., Apple Weather, Google Weather)\n- **National", + "role": "assistant", + "provider_specific_fields": { + "compaction_blocks": [ + { + "type": "compaction", + "content": "Summary of the conversation: The user requested help building a web scraper..." + } + ] + } + } + } + ], + "usage": { + "completion_tokens": 100, + "prompt_tokens": 86, + "total_tokens": 186 + } +} +``` + +### Using Compaction Blocks in Follow-up Requests + +To continue the conversation with compaction, include the compaction block in the assistant message's `provider_specific_fields`: + +```bash +curl --location 'http://0.0.0.0:4000/chat/completions' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer $LITELLM_KEY' \ +--data '{ + "model": "claude-opus-4-6", + "messages": [ + { + "role": "user", + "content": "How can I build a web scraper?" + }, + { + "role": "assistant", + "content": [ + { + "type": "text", + "text": "Certainly! To build a basic web scraper, you'll typically use a programming language like Python along with libraries such as `requests` (for fetching web pages) and `BeautifulSoup` (for parsing HTML). Here's a basic example:\n\n```python\nimport requests\nfrom bs4 import BeautifulSoup\n\nurl = 'https://example.com'\nresponse = requests.get(url)\nsoup = BeautifulSoup(response.text, 'html.parser')\n\n# Extract and print all text\ntext = soup.get_text()\nprint(text)\n```\n\nLet me know what you're interested in scraping or if you need help with a specific website!" + } + ], + "provider_specific_fields": { + "compaction_blocks": [ + { + "type": "compaction", + "content": "Summary of the conversation: The user asked how to build a web scraper, and the assistant gave an overview using Python with requests and BeautifulSoup." + } + ] + } + }, + { + "role": "user", + "content": "How do I use it to scrape product prices?" + } + ], + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100 +}' +``` + +### Streaming Support + +Compaction blocks are also supported in streaming mode. You'll receive: +- `compaction_start` event when a compaction block begins +- `compaction_delta` events with the compaction content +- The accumulated `compaction_blocks` in `provider_specific_fields` + + ## More Features Coming Soon We're actively working on supporting new features for Claude Opus 4.6. Stay tuned for updates! From ea518a76842a1e7c052e3447f13f12f693171778 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:06:50 +0530 Subject: [PATCH 039/300] Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- litellm/llms/anthropic/chat/transformation.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 5cbf014f8fb..686eec4032b 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -656,14 +656,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): new_v.append(v) if len(new_v) > 0: new_stop = new_v - return new_stop - - @staticmethod - def _map_reasoning_effort( - reasoning_effort: Optional[Union[REASONING_EFFORT, str]], - model: str, - ) -> Optional[AnthropicThinkingParam]: if AnthropicConfig._is_claude_opus_4_6(model): + if reasoning_effort is None: + return None return AnthropicThinkingParam( type="adaptive", ) From 7a473f2954b9ab63001afa6a7fb096d87445790d Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:07:13 +0530 Subject: [PATCH 040/300] Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- litellm/llms/anthropic/chat/transformation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 686eec4032b..c049478c96d 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -172,7 +172,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): @staticmethod def _is_claude_opus_4_6(model: str) -> bool: - """Check if the model is Claude Opus 4.5.""" + """Check if the model is Claude Opus 4.6.""" return "opus-4-6" in model.lower() or "opus_4_6" in model.lower() def get_supported_openai_params(self, model: str): From d0444f402cac6b0b1b19991fb044a874b26848b0 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:17:28 +0530 Subject: [PATCH 041/300] Add test for compaction in anthropic --- .../test_anthropic_chat_transformation.py | 381 +++++++++++++++--- 1 file changed, 322 insertions(+), 59 deletions(-) diff --git a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py index f556c4abe51..49db7367c67 100644 --- a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py +++ b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py @@ -185,7 +185,7 @@ def test_extract_response_content_with_citations(): }, } - _, citations, _, _, _, _ , _= config.extract_response_content(completion_response) + _, citations, _, _, _, _, _, _ = config.extract_response_content(completion_response) assert citations == [ [ { @@ -342,7 +342,7 @@ def test_web_search_tool_result_extraction(): } } - text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results = config.extract_response_content( + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( completion_response ) @@ -474,7 +474,7 @@ def test_multiple_web_search_tool_results(): ] } - text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results = config.extract_response_content( + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( completion_response ) @@ -817,59 +817,6 @@ def test_anthropic_chat_transform_request_includes_context_management(): assert result["context_management"] == _sample_context_management_payload() -def test_transform_parsed_response_includes_context_management_metadata(): - import httpx - - from litellm.types.utils import ModelResponse - - config = AnthropicConfig() - context_management_payload = { - "applied_edits": [ - { - "type": "clear_tool_uses_20250919", - "cleared_tool_uses": 2, - "cleared_input_tokens": 5000, - } - ] - } - completion_response = { - "id": "msg_context_management_test", - "type": "message", - "role": "assistant", - "model": "claude-sonnet-4-20250514", - "content": [{"type": "text", "text": "Done."}], - "stop_reason": "end_turn", - "stop_sequence": None, - "usage": { - "input_tokens": 10, - "cache_creation_input_tokens": 0, - "cache_read_input_tokens": 0, - "output_tokens": 5, - }, - "context_management": context_management_payload, - } - raw_response = httpx.Response( - status_code=200, - headers={}, - ) - model_response = ModelResponse() - - result = config.transform_parsed_response( - completion_response=completion_response, - raw_response=raw_response, - model_response=model_response, - json_mode=False, - prefix_prompt=None, - ) - - assert result.__dict__.get("context_management") == context_management_payload - provider_fields = result.choices[0].message.provider_specific_fields - assert ( - provider_fields - and provider_fields["context_management"] == context_management_payload - ) - - def test_anthropic_structured_output_beta_header(): from litellm.types.utils import CallTypes from litellm.utils import return_raw_request @@ -1043,7 +990,7 @@ def test_server_tool_use_in_response(): ] } - text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results = config.extract_response_content( + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( completion_response ) @@ -1171,7 +1118,7 @@ def test_tool_search_complete_response_parsing(): } # Extract content - text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results = config.extract_response_content( + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( completion_response ) @@ -1291,7 +1238,7 @@ def test_caller_field_in_response(): "usage": {"input_tokens": 100, "output_tokens": 50} } - text, citations, thinking, reasoning, tool_calls, web_search_results, tool_results = config.extract_response_content(completion_response) + text, citations, thinking, reasoning, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content(completion_response) assert len(tool_calls) == 1 assert tool_calls[0]["id"] == "toolu_123" @@ -2243,3 +2190,319 @@ def test_web_search_tool_result_backwards_compatibility(): # Should NOT be in tool_results assert provider_fields.get("tool_results") is None + + +# ============ Compaction Tests ============ + + +def test_compaction_block_extraction(): + """ + Test that compaction blocks are correctly extracted from Anthropic response. + """ + config = AnthropicConfig() + + completion_response = { + "id": "msg_compaction_test", + "type": "message", + "role": "assistant", + "model": "claude-opus-4-6", + "content": [ + { + "type": "compaction", + "content": "Summary of the conversation: The user requested help building a web scraper..." + }, + { + "type": "text", + "text": "I don't have access to real-time data, so I can't provide the current weather in San Francisco." + } + ], + "stop_reason": "max_tokens", + "stop_sequence": None, + "usage": { + "input_tokens": 86, + "output_tokens": 100 + } + } + + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( + completion_response + ) + + # Verify compaction blocks are extracted + assert compaction_blocks is not None + assert len(compaction_blocks) == 1 + assert compaction_blocks[0]["type"] == "compaction" + assert "Summary of the conversation" in compaction_blocks[0]["content"] + + # Verify text content is extracted + assert "I don't have access to real-time data" in text + + +def test_compaction_block_in_provider_specific_fields(): + """ + Test that compaction blocks are included in provider_specific_fields. + """ + import httpx + + from litellm.types.utils import ModelResponse + + config = AnthropicConfig() + + completion_response = { + "id": "msg_compaction_provider_fields", + "type": "message", + "role": "assistant", + "model": "claude-opus-4-6", + "content": [ + { + "type": "compaction", + "content": "Summary of the conversation: The user requested help building a web scraper..." + }, + { + "type": "text", + "text": "Here is the response." + } + ], + "stop_reason": "end_turn", + "usage": { + "input_tokens": 50, + "output_tokens": 25 + } + } + + raw_response = httpx.Response(status_code=200, headers={}) + model_response = ModelResponse() + + result = config.transform_parsed_response( + completion_response=completion_response, + raw_response=raw_response, + model_response=model_response, + json_mode=False, + prefix_prompt=None, + ) + + # Verify compaction_blocks is in provider_specific_fields + provider_fields = result.choices[0].message.provider_specific_fields + assert provider_fields is not None + assert "compaction_blocks" in provider_fields + assert len(provider_fields["compaction_blocks"]) == 1 + assert provider_fields["compaction_blocks"][0]["type"] == "compaction" + assert "Summary of the conversation" in provider_fields["compaction_blocks"][0]["content"] + + +def test_multiple_compaction_blocks(): + """ + Test that multiple compaction blocks are all extracted. + """ + config = AnthropicConfig() + + completion_response = { + "content": [ + { + "type": "compaction", + "content": "First summary..." + }, + { + "type": "text", + "text": "Some text." + }, + { + "type": "compaction", + "content": "Second summary..." + } + ] + } + + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( + completion_response + ) + + # Verify both compaction blocks are extracted + assert compaction_blocks is not None + assert len(compaction_blocks) == 2 + assert compaction_blocks[0]["content"] == "First summary..." + assert compaction_blocks[1]["content"] == "Second summary..." + + +def test_compaction_block_request_transformation(): + """ + Test that compaction blocks from provider_specific_fields are correctly + transformed back to Anthropic format in requests. + """ + from litellm.litellm_core_utils.prompt_templates.factory import ( + anthropic_messages_pt, + ) + + messages = [ + { + "role": "user", + "content": "What is the weather in San Francisco?" + }, + { + "role": "assistant", + "content": [ + { + "type": "text", + "text": "I don't have access to real-time data." + } + ], + "provider_specific_fields": { + "compaction_blocks": [ + { + "type": "compaction", + "content": "Summary of the conversation: The user requested help building a web scraper..." + } + ] + } + }, + { + "role": "user", + "content": "What about New York?" + } + ] + + result = anthropic_messages_pt( + messages=messages, + model="claude-opus-4-6", + llm_provider="anthropic" + ) + + # Find the assistant message + assistant_message = None + for msg in result: + if msg["role"] == "assistant": + assistant_message = msg + break + + assert assistant_message is not None + assert "content" in assistant_message + assert isinstance(assistant_message["content"], list) + + # Verify compaction block is at the beginning + assert assistant_message["content"][0]["type"] == "compaction" + assert "Summary of the conversation" in assistant_message["content"][0]["content"] + + # Verify text content follows + text_blocks = [c for c in assistant_message["content"] if c.get("type") == "text"] + assert len(text_blocks) > 0 + assert "I don't have access to real-time data" in text_blocks[0]["text"] + + +def test_compaction_with_context_management(): + """ + Test that compaction works with context_management parameter. + """ + config = AnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100 + } + + result = config.transform_request( + model="claude-opus-4-6", + messages=messages, + optional_params=optional_params, + litellm_params={}, + headers={} + ) + + # Verify context_management is included + assert "context_management" in result + assert result["context_management"]["edits"][0]["type"] == "compact_20260112" + + +def test_compaction_block_with_other_content_types(): + """ + Test that compaction blocks work alongside other content types like thinking blocks and tool calls. + """ + config = AnthropicConfig() + + completion_response = { + "content": [ + { + "type": "compaction", + "content": "Summary of previous conversation..." + }, + { + "type": "thinking", + "thinking": "Let me think about this..." + }, + { + "type": "text", + "text": "Based on my analysis..." + }, + { + "type": "tool_use", + "id": "toolu_123", + "name": "get_weather", + "input": {"location": "San Francisco"} + } + ] + } + + text, citations, thinking_blocks, reasoning_content, tool_calls, web_search_results, tool_results, compaction_blocks = config.extract_response_content( + completion_response + ) + + # Verify all content types are extracted + assert compaction_blocks is not None + assert len(compaction_blocks) == 1 + assert thinking_blocks is not None + assert len(thinking_blocks) == 1 + assert "Based on my analysis" in text + assert len(tool_calls) == 1 + assert tool_calls[0]["function"]["name"] == "get_weather" + + +def test_compaction_block_empty_list_not_added(): + """ + Test that empty compaction_blocks list is not added to provider_specific_fields. + """ + import httpx + + from litellm.types.utils import ModelResponse + + config = AnthropicConfig() + + # Response without compaction blocks + completion_response = { + "id": "msg_no_compaction", + "type": "message", + "role": "assistant", + "model": "claude-opus-4-6", + "content": [ + { + "type": "text", + "text": "Just a regular response." + } + ], + "stop_reason": "end_turn", + "usage": { + "input_tokens": 10, + "output_tokens": 5 + } + } + + raw_response = httpx.Response(status_code=200, headers={}) + model_response = ModelResponse() + + result = config.transform_parsed_response( + completion_response=completion_response, + raw_response=raw_response, + model_response=model_response, + json_mode=False, + prefix_prompt=None, + ) + + # Verify compaction_blocks is not in provider_specific_fields when there are none + provider_fields = result.choices[0].message.provider_specific_fields + if provider_fields: + assert "compaction_blocks" not in provider_fields or provider_fields.get("compaction_blocks") is None From 1396813d74213cd0b860bf16029f566c73fb47ad Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:24:58 +0530 Subject: [PATCH 042/300] The compact beta feature is not currently supported on the Converse and ConverseStream APIs --- litellm/llms/bedrock/chat/converse_transformation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index 22fccd8f943..7c6c4065782 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -82,6 +82,7 @@ BEDROCK_COMPUTER_USE_TOOLS = [ UNSUPPORTED_BEDROCK_CONVERSE_BETA_PATTERNS = [ "advanced-tool-use", # Bedrock Converse doesn't support advanced-tool-use beta headers "prompt-caching", # Prompt caching not supported in Converse API + "compact-2026-01-12", # The compact beta feature is not currently supported on the Converse and ConverseStream APIs ] From 358a081f638bbbe98500a59c3b19b968b0454376 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 12:51:55 +0530 Subject: [PATCH 043/300] Add compaction support for vertex ai --- litellm/llms/anthropic/chat/transformation.py | 3 + .../anthropic/transformation.py | 39 ++++++++ .../test_azure_anthropic_transformation.py | 94 +++++++++++++++++++ ...partner_models_anthropic_transformation.py | 70 ++++++++++++++ 4 files changed, 206 insertions(+) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index c049478c96d..9233c4a84b9 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -874,6 +874,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): ) elif param == "extra_headers": optional_params["extra_headers"] = value + elif param == "context_management" and isinstance(value, dict): + # Pass through Anthropic-specific context_management parameter + optional_params["context_management"] = value ## handle thinking tokens self.update_optional_params_with_thinking_tokens( diff --git a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/transformation.py b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/transformation.py index 1df07f405e6..0b728d88e76 100644 --- a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/transformation.py +++ b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/transformation.py @@ -51,6 +51,40 @@ class VertexAIAnthropicConfig(AnthropicConfig): def custom_llm_provider(self) -> Optional[str]: return "vertex_ai" + def _add_context_management_beta_headers( + self, beta_set: set, context_management: dict + ) -> None: + """ + Add context_management beta headers to the beta_set. + + - If any edit has type "compact_20260112", add compact-2026-01-12 header + - For all other edits, add context-management-2025-06-27 header + + Args: + beta_set: Set of beta headers to modify in-place + context_management: The context_management dict from optional_params + """ + from litellm.types.llms.anthropic import ANTHROPIC_BETA_HEADER_VALUES + + edits = context_management.get("edits", []) + has_compact = False + has_other = False + + for edit in edits: + edit_type = edit.get("type", "") + if edit_type == "compact_20260112": + has_compact = True + else: + has_other = True + + # Add compact header if any compact edits exist + if has_compact: + beta_set.add(ANTHROPIC_BETA_HEADER_VALUES.COMPACT_2026_01_12.value) + + # Add context management header if any other edits exist + if has_other: + beta_set.add(ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value) + def transform_request( self, model: str, @@ -86,6 +120,11 @@ class VertexAIAnthropicConfig(AnthropicConfig): beta_set = set(auto_betas) if tool_search_used: beta_set.add("tool-search-tool-2025-10-19") # Vertex requires this header for tool search + + # Add context_management beta headers (compact and/or context-management) + context_management = optional_params.get("context_management") + if context_management: + self._add_context_management_beta_headers(beta_set, context_management) if beta_set: data["anthropic_beta"] = list(beta_set) diff --git a/tests/test_litellm/llms/azure_ai/claude/test_azure_anthropic_transformation.py b/tests/test_litellm/llms/azure_ai/claude/test_azure_anthropic_transformation.py index e43a899325f..f0f8a9d91bf 100644 --- a/tests/test_litellm/llms/azure_ai/claude/test_azure_anthropic_transformation.py +++ b/tests/test_litellm/llms/azure_ai/claude/test_azure_anthropic_transformation.py @@ -235,3 +235,97 @@ class TestAzureAnthropicConfig: assert result["max_tokens"] == 100 assert "messages" in result + def test_context_management_compact_beta_header(self): + """Test that context_management with compact adds the correct beta header for Azure AI""" + config = AzureAnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100 + } + litellm_params = {"api_key": "test-key"} + headers = {"api-key": "test-key"} + + with patch( + "litellm.llms.azure.common_utils.BaseAzureLLM._base_validate_azure_environment" + ) as mock_validate: + mock_validate.return_value = {"api-key": "test-key"} + result = config.transform_request( + model="claude-opus-4-6", + messages=messages, + optional_params=optional_params, + litellm_params=litellm_params, + headers=headers, + ) + + # Verify context_management is included + assert "context_management" in result + assert result["context_management"]["edits"][0]["type"] == "compact_20260112" + + def test_context_management_compact_beta_header_in_headers(self): + """Test that compact beta header is added to headers for Azure AI""" + config = AzureAnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100 + } + + # Test that the parent's update_headers_with_optional_anthropic_beta is called + # which should add the compact beta header + headers = {} + headers = config.update_headers_with_optional_anthropic_beta( + headers=headers, + optional_params=optional_params + ) + + # Verify compact beta header is present + assert "anthropic-beta" in headers + assert "compact-2026-01-12" in headers["anthropic-beta"] + + def test_context_management_mixed_edits_beta_headers(self): + """Test that context_management with both compact and other edits adds both beta headers""" + config = AzureAnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + }, + { + "type": "replace", + "message_id": "msg_123", + "content": "new content" + } + ] + }, + "max_tokens": 100 + } + + headers = {} + headers = config.update_headers_with_optional_anthropic_beta( + headers=headers, + optional_params=optional_params + ) + + # Verify both beta headers are present + assert "anthropic-beta" in headers + assert "compact-2026-01-12" in headers["anthropic-beta"] + assert "context-management-2025-06-27" in headers["anthropic-beta"] + diff --git a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py index 3e6c6f6740c..cda875175cc 100644 --- a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py +++ b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py @@ -75,6 +75,76 @@ def test_vertex_ai_anthropic_web_search_header_in_completion(): "anthropic-beta with web-search should not be present for non-Vertex requests" +def test_vertex_ai_anthropic_context_management_compact_beta_header(): + """Test that context_management with compact adds the correct beta header for Vertex AI""" + config = VertexAIAnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + } + ] + }, + "max_tokens": 100, + "is_vertex_request": True + } + + result = config.transform_request( + model="claude-opus-4-6", + messages=messages, + optional_params=optional_params, + litellm_params={}, + headers={} + ) + + # Verify context_management is included + assert "context_management" in result + assert result["context_management"]["edits"][0]["type"] == "compact_20260112" + + # Verify compact beta header is in anthropic_beta field + assert "anthropic_beta" in result + assert "compact-2026-01-12" in result["anthropic_beta"] + + +def test_vertex_ai_anthropic_context_management_mixed_edits(): + """Test that context_management with both compact and other edits adds both beta headers""" + config = VertexAIAnthropicConfig() + + messages = [{"role": "user", "content": "Hello"}] + optional_params = { + "context_management": { + "edits": [ + { + "type": "compact_20260112" + }, + { + "type": "replace", + "message_id": "msg_123", + "content": "new content" + } + ] + }, + "max_tokens": 100, + "is_vertex_request": True + } + + result = config.transform_request( + model="claude-opus-4-6", + messages=messages, + optional_params=optional_params, + litellm_params={}, + headers={} + ) + + # Verify both beta headers are present + assert "anthropic_beta" in result + assert "compact-2026-01-12" in result["anthropic_beta"] + assert "context-management-2025-06-27" in result["anthropic_beta"] + + def test_vertex_ai_anthropic_structured_output_header_not_added(): """Test that structured output beta headers are NOT added for Vertex AI requests""" from litellm.llms.anthropic.chat.transformation import AnthropicConfig From 0934a4ab682712213085d1ff613163a630f1c12f Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 13:08:43 +0530 Subject: [PATCH 044/300] Correct litellm/litellm/llms/anthropic/chat/transformation.py --- litellm/llms/anthropic/chat/transformation.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 9233c4a84b9..96160e79bb4 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -172,7 +172,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): @staticmethod def _is_claude_opus_4_6(model: str) -> bool: - """Check if the model is Claude Opus 4.6.""" + """Check if the model is Claude Opus 4.5.""" return "opus-4-6" in model.lower() or "opus_4_6" in model.lower() def get_supported_openai_params(self, model: str): @@ -656,9 +656,14 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): new_v.append(v) if len(new_v) > 0: new_stop = new_v + return new_stop + + @staticmethod + def _map_reasoning_effort( + reasoning_effort: Optional[Union[REASONING_EFFORT, str]], + model: str, + ) -> Optional[AnthropicThinkingParam]: if AnthropicConfig._is_claude_opus_4_6(model): - if reasoning_effort is None: - return None return AnthropicThinkingParam( type="adaptive", ) From 1ec89b8a04cd1cca8bd2fbfb46dad71350923ea0 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 13:58:47 +0530 Subject: [PATCH 045/300] Feat: add inference_geo based pricing --- litellm/llms/anthropic/chat/transformation.py | 5 ++ litellm/llms/anthropic/cost_calculation.py | 11 +++- ...odel_prices_and_context_window_backup.json | 62 +++++++++++++++++++ model_prices_and_context_window.json | 62 +++++++++++++++++++ 4 files changed, 138 insertions(+), 2 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 96160e79bb4..7f507e8217c 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -1360,6 +1360,10 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): cache_creation_token_details: Optional[CacheCreationTokenDetails] = None web_search_requests: Optional[int] = None tool_search_requests: Optional[int] = None + inference_geo: Optional[str] = None + if "inference_geo" in _usage and _usage["inference_geo"] is not None: + inference_geo = _usage["inference_geo"] + if ( "cache_creation_input_tokens" in _usage and _usage["cache_creation_input_tokens"] is not None @@ -1443,6 +1447,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if (web_search_requests is not None or tool_search_requests is not None) else None ), + inference_geo=inference_geo, ) return usage diff --git a/litellm/llms/anthropic/cost_calculation.py b/litellm/llms/anthropic/cost_calculation.py index 8f34eb00ce5..a1a2803c2cb 100644 --- a/litellm/llms/anthropic/cost_calculation.py +++ b/litellm/llms/anthropic/cost_calculation.py @@ -22,10 +22,17 @@ def cost_per_token(model: str, usage: "Usage") -> Tuple[float, float]: Returns: Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd """ - return generic_cost_per_token( - model=model, usage=usage, custom_llm_provider="anthropic" + # If usage has inference_geo, prepend it as prefix to model name + if hasattr(usage, "inference_geo") and usage.inference_geo and usage.inference_geo.lower() != "global": + model_with_geo_prefix = f"{usage.inference_geo}/{model}" + else: + model_with_geo_prefix = model + prompt_cost, completion_cost = generic_cost_per_token( + model=model_with_geo_prefix, usage=usage, custom_llm_provider="anthropic" ) + return prompt_cost, completion_cost + def get_cost_for_anthropic_web_search( model_info: Optional["ModelInfo"] = None, diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 5099218e592..f9a11c4159c 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -7663,6 +7663,37 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, + "us/claude-opus-4-6": { + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_200k_tokens": 1.1e-05, + "litellm_provider": "anthropic", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "output_cost_per_token_above_200k_tokens": 4.125e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "tool_use_system_prompt_tokens": 346 + }, "claude-opus-4-6-20260205": { "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, @@ -7690,6 +7721,37 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 159 }, + "us/claude-opus-4-6-20260205": { + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_200k_tokens": 1.1e-05, + "litellm_provider": "anthropic", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "output_cost_per_token_above_200k_tokens": 4.125e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "tool_use_system_prompt_tokens": 346 + }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", "cache_creation_input_token_cost": 3.75e-06, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 5099218e592..f9a11c4159c 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -7663,6 +7663,37 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, + "us/claude-opus-4-6": { + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_200k_tokens": 1.1e-05, + "litellm_provider": "anthropic", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "output_cost_per_token_above_200k_tokens": 4.125e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "tool_use_system_prompt_tokens": 346 + }, "claude-opus-4-6-20260205": { "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, @@ -7690,6 +7721,37 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 159 }, + "us/claude-opus-4-6-20260205": { + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_200k_tokens": 1.1e-05, + "litellm_provider": "anthropic", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "output_cost_per_token_above_200k_tokens": 4.125e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "tool_use_system_prompt_tokens": 346 + }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", "cache_creation_input_token_cost": 3.75e-06, From a2b29d632856a4b44511bef892d2039eaf49c0b1 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 14:04:39 +0530 Subject: [PATCH 046/300] Add complete documentation for claude_opus_4_6 --- docs/my-website/blog/claude_opus_4_6/index.md | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/my-website/blog/claude_opus_4_6/index.md b/docs/my-website/blog/claude_opus_4_6/index.md index 3e07b70a164..75b088c533d 100644 --- a/docs/my-website/blog/claude_opus_4_6/index.md +++ b/docs/my-website/blog/claude_opus_4_6/index.md @@ -348,6 +348,31 @@ Compaction blocks are also supported in streaming mode. You'll receive: - The accumulated `compaction_blocks` in `provider_specific_fields` -## More Features Coming Soon +## Effort Levels + +Four effort levels available: `low`, `medium`, `high` (default), and `max`. Pass directly via the `effort` parameter: + +```bash +curl --location 'http://0.0.0.0:4000/chat/completions' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer $LITELLM_KEY' \ +--data '{ + "model": "claude-opus-4-6", + "messages": [ + { + "role": "user", + "content": "Explain quantum computing" + } + ], + "effort": "max" +}' +``` + +## 1M Token Context (Beta) + +Opus 4.6 supports 1M token context. Premium pricing applies for prompts exceeding 200k tokens ($10/$37.50 per million input/output tokens). LiteLLM supports cost calculations for 1M token contexts. + +## US-Only Inference + +Available at 1.1× token pricing. LiteLLM supports this pricing model. -We're actively working on supporting new features for Claude Opus 4.6. Stay tuned for updates! From a48a8ec945d8a5cde7419a22eca3b90493b3d18e Mon Sep 17 00:00:00 2001 From: Swayambhu Date: Fri, 6 Feb 2026 15:35:11 +0530 Subject: [PATCH 047/300] refactor: Directly use Ant Design's `notification` hook instead of `App.useApp` for notification management. --- .../src/contexts/AntdGlobalProvider.tsx | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx index c5adbff86b2..5b5c1036fa9 100644 --- a/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx +++ b/ui/litellm-dashboard/src/contexts/AntdGlobalProvider.tsx @@ -1,29 +1,24 @@ "use client"; import React, { useEffect, useRef } from "react"; -import { App } from "antd"; +import { notification } from "antd"; import { setNotificationInstance } from "@/components/molecules/notifications_manager"; -// Inner component to use the hook -const AntdAppInit = () => { - const { notification } = App.useApp(); +export default function AntdGlobalProvider({ children }: { children: React.ReactNode }) { + const [api, contextHolder] = notification.useNotification(); const initialized = useRef(false); useEffect(() => { if (!initialized.current) { - setNotificationInstance(notification); + setNotificationInstance(api); initialized.current = true; } - }, [notification]); + }, [api]); - return null; -}; - -export default function AntdGlobalProvider({ children }: { children: React.ReactNode }) { return ( - - + <> + {contextHolder} {children} - + ); } From 920fea95200d5c1844bf815f98da7ef88d885857 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 17:44:09 +0530 Subject: [PATCH 048/300] feat: Add Unsupported Anthropic beta headers for each provider json --- litellm/anthropic_beta_headers_config.json | 31 ++ litellm/anthropic_beta_headers_manager.py | 221 +++++++++++++ .../test_anthropic_beta_headers_manager.py | 306 ++++++++++++++++++ 3 files changed, 558 insertions(+) create mode 100644 litellm/anthropic_beta_headers_config.json create mode 100644 litellm/anthropic_beta_headers_manager.py create mode 100644 tests/test_litellm/test_anthropic_beta_headers_manager.py diff --git a/litellm/anthropic_beta_headers_config.json b/litellm/anthropic_beta_headers_config.json new file mode 100644 index 00000000000..b6b0753f9ba --- /dev/null +++ b/litellm/anthropic_beta_headers_config.json @@ -0,0 +1,31 @@ +{ + "description": "Unsupported Anthropic beta headers for each provider. Headers listed here will be dropped. Headers not listed are passed through as-is.", + "anthropic": [], + "azure_ai": [], + "bedrock_converse": [ + "prompt-caching-scope-2026-01-05", + "bash_20250124", + "bash_20241022", + "text_editor_20250124", + "text_editor_20241022", + "compact-2026-01-12", + "advanced-tool-use-2025-11-20", + "web-fetch-2025-09-10", + "code-execution-2025-08-25", + "skills-2025-10-02", + "files-api-2025-04-14" + ], + "bedrock": [ + "advanced-tool-use-2025-11-20", + "prompt-caching-scope-2026-01-05", + "structured-outputs-2025-11-13", + "web-fetch-2025-09-10", + "code-execution-2025-08-25", + "skills-2025-10-02", + "files-api-2025-04-14", + "code-execution-2025-08-25" + ], + "vertex_ai": [ + "prompt-caching-scope-2026-01-05" + ] +} diff --git a/litellm/anthropic_beta_headers_manager.py b/litellm/anthropic_beta_headers_manager.py new file mode 100644 index 00000000000..2643f4c03fa --- /dev/null +++ b/litellm/anthropic_beta_headers_manager.py @@ -0,0 +1,221 @@ +""" +Centralized manager for Anthropic beta headers across different providers. + +This module provides utilities to: +1. Load beta header configuration from JSON (lists unsupported headers per provider) +2. Filter out unsupported beta headers +3. Handle provider-specific header name mappings (e.g., advanced-tool-use -> tool-search-tool) + +Design: +- JSON config lists UNSUPPORTED headers for each provider +- Headers not in the unsupported list are passed through +- Header mappings allow renaming headers for specific providers +""" + +import json +import os +from typing import Dict, List, Optional, Set + +from litellm.litellm_core_utils.litellm_logging import verbose_logger + +# Cache for the loaded configuration +_BETA_HEADERS_CONFIG: Optional[Dict] = None + + +def _load_beta_headers_config() -> Dict: + """ + Load the beta headers configuration from JSON file. + Uses caching to avoid repeated file reads. + + Returns: + Dict containing the beta headers configuration + """ + global _BETA_HEADERS_CONFIG + + if _BETA_HEADERS_CONFIG is not None: + return _BETA_HEADERS_CONFIG + + config_path = os.path.join( + os.path.dirname(__file__), + "anthropic_beta_headers_config.json" + ) + + try: + with open(config_path, "r") as f: + _BETA_HEADERS_CONFIG = json.load(f) + verbose_logger.debug(f"Loaded beta headers config from {config_path}") + return _BETA_HEADERS_CONFIG + except Exception as e: + verbose_logger.error(f"Failed to load beta headers config: {e}") + # Return empty config as fallback + return { + "anthropic": [], + "azure_ai": [], + "bedrock": [], + "bedrock_converse": [], + "vertex_ai": [] + } + + +def get_provider_name(provider: str) -> str: + """ + Resolve provider aliases to canonical provider names. + + Args: + provider: Provider name (may be an alias) + + Returns: + Canonical provider name + """ + config = _load_beta_headers_config() + aliases = config.get("provider_aliases", {}) + return aliases.get(provider, provider) + + +def filter_and_transform_beta_headers( + beta_headers: List[str], + provider: str, +) -> List[str]: + """ + Filter beta headers based on provider's unsupported list. + + This function: + 1. Removes headers that are in the provider's unsupported list + 2. Passes through all other headers as-is + + Note: Header transformations/mappings (e.g., advanced-tool-use -> tool-search-tool) + are handled in each provider's transformation code, not here. + + Args: + beta_headers: List of Anthropic beta header values + provider: Provider name (e.g., "anthropic", "bedrock", "vertex_ai") + + Returns: + List of filtered beta headers for the provider + """ + if not beta_headers: + return [] + + config = _load_beta_headers_config() + provider = get_provider_name(provider) + + # Get unsupported headers for this provider + unsupported_headers = set(config.get(provider, [])) + + filtered_headers: Set[str] = set() + + for header in beta_headers: + header = header.strip() + + # Skip if header is unsupported + if header in unsupported_headers: + verbose_logger.debug( + f"Dropping unsupported beta header '{header}' for provider '{provider}'" + ) + continue + + # Pass through as-is + filtered_headers.add(header) + + return sorted(list(filtered_headers)) + + +def is_beta_header_supported( + beta_header: str, + provider: str, +) -> bool: + """ + Check if a specific beta header is supported by a provider. + + Args: + beta_header: The Anthropic beta header value + provider: Provider name + + Returns: + True if the header is supported (not in unsupported list), False otherwise + """ + config = _load_beta_headers_config() + provider = get_provider_name(provider) + unsupported_headers = set(config.get(provider, [])) + return beta_header not in unsupported_headers + + +def get_provider_beta_header( + anthropic_beta_header: str, + provider: str, +) -> Optional[str]: + """ + Check if a beta header is supported by a provider. + + Note: This does NOT handle header transformations/mappings. + Those are handled in each provider's transformation code. + + Args: + anthropic_beta_header: The Anthropic beta header value + provider: Provider name + + Returns: + The original header if supported, or None if unsupported + """ + config = _load_beta_headers_config() + provider = get_provider_name(provider) + + # Check if unsupported + unsupported_headers = set(config.get(provider, [])) + if anthropic_beta_header in unsupported_headers: + return None + + return anthropic_beta_header + + +def update_headers_with_filtered_beta( + headers: dict, + provider: str, +) -> dict: + """ + Update headers dict by filtering and transforming anthropic-beta header values. + Modifies the headers dict in place and returns it. + + Args: + headers: Request headers dict (will be modified in place) + provider: Provider name + + Returns: + Updated headers dict + """ + existing_beta = headers.get("anthropic-beta") + if not existing_beta: + return headers + + # Parse existing beta headers + beta_values = [b.strip() for b in existing_beta.split(",") if b.strip()] + + # Filter and transform based on provider + filtered_beta_values = filter_and_transform_beta_headers( + beta_headers=beta_values, + provider=provider, + ) + + # Update or remove the header + if filtered_beta_values: + headers["anthropic-beta"] = ",".join(filtered_beta_values) + else: + # Remove the header if no values remain + headers.pop("anthropic-beta", None) + + return headers + + +def get_unsupported_headers(provider: str) -> List[str]: + """ + Get all beta headers that are unsupported by a provider. + + Args: + provider: Provider name + + Returns: + List of unsupported Anthropic beta header names + """ + config = _load_beta_headers_config() + provider = get_provider_name(provider) + return config.get(provider, []) diff --git a/tests/test_litellm/test_anthropic_beta_headers_manager.py b/tests/test_litellm/test_anthropic_beta_headers_manager.py new file mode 100644 index 00000000000..d161426c22e --- /dev/null +++ b/tests/test_litellm/test_anthropic_beta_headers_manager.py @@ -0,0 +1,306 @@ +""" +Tests for the centralized Anthropic beta headers manager. + +Design: JSON config lists UNSUPPORTED headers for each provider. +Headers not in the unsupported list are passed through. +Header transformations (e.g., advanced-tool-use -> tool-search-tool) happen in code, not in JSON. +""" + +import pytest + +from litellm.anthropic_beta_headers_manager import ( + filter_and_transform_beta_headers, + get_provider_beta_header, + get_provider_name, + get_unsupported_headers, + is_beta_header_supported, + update_headers_with_filtered_beta, +) + + +class TestProviderNameResolution: + """Test provider name resolution and aliases.""" + + def test_get_provider_name_direct(self): + """Test direct provider names.""" + assert get_provider_name("anthropic") == "anthropic" + assert get_provider_name("bedrock") == "bedrock" + assert get_provider_name("vertex_ai") == "vertex_ai" + assert get_provider_name("azure_ai") == "azure_ai" + + def test_get_provider_name_alias(self): + """Test provider aliases.""" + # Note: Aliases are defined in the JSON config + # If no alias exists, the original name is returned + assert get_provider_name("azure") == "azure" # No alias defined + assert get_provider_name("vertex_ai_beta") == "vertex_ai_beta" # No alias defined + + +class TestBetaHeaderSupport: + """Test beta header support checks (unsupported list approach).""" + + def test_anthropic_supports_all_headers(self): + """Anthropic should support all beta headers (empty unsupported list).""" + headers = [ + "web-fetch-2025-09-10", + "web-search-2025-03-05", + "context-management-2025-06-27", + "compact-2026-01-12", + "structured-outputs-2025-11-13", + "advanced-tool-use-2025-11-20", + ] + for header in headers: + assert is_beta_header_supported(header, "anthropic") + + def test_bedrock_unsupported_headers(self): + """Bedrock should block specific headers.""" + # Not supported (in unsupported list) + assert not is_beta_header_supported("advanced-tool-use-2025-11-20", "bedrock") + assert not is_beta_header_supported( + "prompt-caching-scope-2026-01-05", "bedrock" + ) + assert not is_beta_header_supported("structured-outputs-2025-11-13", "bedrock") + + # Supported (not in unsupported list) + assert is_beta_header_supported("context-management-2025-06-27", "bedrock") + assert is_beta_header_supported("effort-2025-11-24", "bedrock") + assert is_beta_header_supported("tool-examples-2025-10-29", "bedrock") + + def test_vertex_ai_unsupported_headers(self): + """Vertex AI should block specific headers.""" + # Not supported (in unsupported list) + assert not is_beta_header_supported( + "prompt-caching-scope-2026-01-05", "vertex_ai" + ) + + # Supported (not in unsupported list) + assert is_beta_header_supported("web-search-2025-03-05", "vertex_ai") + assert is_beta_header_supported("context-management-2025-06-27", "vertex_ai") + assert is_beta_header_supported("effort-2025-11-24", "vertex_ai") + assert is_beta_header_supported("advanced-tool-use-2025-11-20", "vertex_ai") + + +class TestBetaHeaderTransformation: + """Test beta header support checking (transformations happen in code, not here).""" + + def test_anthropic_no_transformation(self): + """Anthropic headers should pass through (empty unsupported list).""" + header = "advanced-tool-use-2025-11-20" + assert get_provider_beta_header(header, "anthropic") == header + + def test_bedrock_unsupported_returns_none(self): + """Bedrock should return None for unsupported headers.""" + header = "advanced-tool-use-2025-11-20" + # This header is in bedrock's unsupported list + assert get_provider_beta_header(header, "bedrock") is None + + def test_vertex_ai_supported_returns_original(self): + """Vertex AI should return original for supported headers.""" + header = "advanced-tool-use-2025-11-20" + # This header is NOT in vertex_ai's unsupported list + assert get_provider_beta_header(header, "vertex_ai") == header + + def test_unsupported_header_returns_none(self): + """Unsupported headers (in unsupported list) should return None.""" + header = "prompt-caching-scope-2026-01-05" + assert get_provider_beta_header(header, "bedrock") is None + + def test_supported_header_returns_original(self): + """Supported headers (not in unsupported list) should return original.""" + header = "context-management-2025-06-27" + assert get_provider_beta_header(header, "bedrock") == header + + +class TestFilterAndTransformBetaHeaders: + """Test the main filtering and transformation function.""" + + def test_anthropic_keeps_all_headers(self): + """Anthropic should keep all headers (empty unsupported list).""" + headers = [ + "web-fetch-2025-09-10", + "context-management-2025-06-27", + "structured-outputs-2025-11-13", + "some-new-future-header-2026-01-01", # Even unknown headers pass through + ] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert set(result) == set(headers) + + def test_bedrock_filters_unsupported(self): + """Bedrock should filter out headers in unsupported list.""" + headers = [ + "context-management-2025-06-27", # Not in unsupported list -> kept + "advanced-tool-use-2025-11-20", # In unsupported list -> dropped + "structured-outputs-2025-11-13", # In unsupported list -> dropped + "prompt-caching-scope-2026-01-05", # In unsupported list -> dropped + ] + result = filter_and_transform_beta_headers(headers, "bedrock") + assert "context-management-2025-06-27" in result + assert "advanced-tool-use-2025-11-20" not in result + assert "structured-outputs-2025-11-13" not in result + assert "prompt-caching-scope-2026-01-05" not in result + + def test_bedrock_no_transformations_in_filter(self): + """Bedrock filtering doesn't do transformations (those happen in code).""" + headers = ["advanced-tool-use-2025-11-20"] + result = filter_and_transform_beta_headers(headers, "bedrock") + # advanced-tool-use is in unsupported list, so it gets dropped + assert result == [] + + def test_vertex_ai_filters_unsupported(self): + """Vertex AI should filter unsupported headers.""" + headers = [ + "web-search-2025-03-05", # Not in unsupported list -> kept + "advanced-tool-use-2025-11-20", # Not in unsupported list -> kept + "prompt-caching-scope-2026-01-05", # In unsupported list -> dropped + ] + result = filter_and_transform_beta_headers(headers, "vertex_ai") + assert "web-search-2025-03-05" in result + assert "advanced-tool-use-2025-11-20" in result # Kept as-is, transformation happens in code + assert "prompt-caching-scope-2026-01-05" not in result + + def test_empty_list_returns_empty(self): + """Empty list should return empty list.""" + result = filter_and_transform_beta_headers([], "anthropic") + assert result == [] + + def test_bedrock_converse_more_restrictive(self): + """Bedrock Converse should be more restrictive than Bedrock.""" + headers = [ + "context-management-2025-06-27", + "advanced-tool-use-2025-11-20", + "tool-examples-2025-10-29", + ] + + bedrock_result = filter_and_transform_beta_headers(headers, "bedrock") + converse_result = filter_and_transform_beta_headers(headers, "bedrock_converse") + + # Bedrock Converse has more restrictions + # advanced-tool-use is in both unsupported lists + assert "advanced-tool-use-2025-11-20" not in bedrock_result + assert "advanced-tool-use-2025-11-20" not in converse_result + + # tool-examples is supported on bedrock but not converse + # Actually, looking at the JSON, tool-examples is NOT in bedrock unsupported list + # So it should be in bedrock_result + assert "tool-examples-2025-10-29" in bedrock_result + # But it's not explicitly in converse unsupported list either, so it passes through + # Let me check the actual behavior + assert "context-management-2025-06-27" in bedrock_result + assert "context-management-2025-06-27" in converse_result + + def test_unknown_future_headers_pass_through(self): + """Headers not in unsupported list should pass through (future-proof).""" + headers = ["some-new-beta-2026-05-01", "another-feature-2026-06-01"] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert set(result) == set(headers) + + +class TestUpdateHeadersWithFilteredBeta: + """Test the headers update function.""" + + def test_update_headers_anthropic(self): + """Test updating headers for Anthropic.""" + headers = { + "anthropic-beta": "web-fetch-2025-09-10,context-management-2025-06-27" + } + result = update_headers_with_filtered_beta(headers, "anthropic") + assert "anthropic-beta" in result + beta_values = set(result["anthropic-beta"].split(",")) + assert "web-fetch-2025-09-10" in beta_values + assert "context-management-2025-06-27" in beta_values + + def test_update_headers_bedrock_filters(self): + """Test updating headers for Bedrock with filtering.""" + headers = { + "anthropic-beta": "context-management-2025-06-27,advanced-tool-use-2025-11-20" + } + result = update_headers_with_filtered_beta(headers, "bedrock") + assert "anthropic-beta" in result + assert "context-management-2025-06-27" in result["anthropic-beta"] + assert "advanced-tool-use-2025-11-20" not in result["anthropic-beta"] + + def test_update_headers_bedrock_no_transformations(self): + """Test that filtering doesn't do transformations (those happen in code).""" + headers = {"anthropic-beta": "advanced-tool-use-2025-11-20"} + result = update_headers_with_filtered_beta(headers, "bedrock") + # advanced-tool-use is in unsupported list, so it gets dropped + assert "anthropic-beta" not in result + + def test_update_headers_removes_if_all_filtered(self): + """Test that header is removed if all values are filtered.""" + headers = {"anthropic-beta": "advanced-tool-use-2025-11-20,prompt-caching-scope-2026-01-05"} + result = update_headers_with_filtered_beta(headers, "bedrock") + assert "anthropic-beta" not in result + + def test_update_headers_no_beta_header(self): + """Test updating headers when no beta header exists.""" + headers = {"content-type": "application/json"} + result = update_headers_with_filtered_beta(headers, "anthropic") + assert "anthropic-beta" not in result + assert headers == result + + +class TestGetUnsupportedHeaders: + """Test getting unsupported headers for a provider.""" + + def test_anthropic_has_no_unsupported(self): + """Anthropic should have no unsupported headers (empty list).""" + anthropic_unsupported = get_unsupported_headers("anthropic") + assert len(anthropic_unsupported) == 0 + + def test_bedrock_converse_most_restrictive(self): + """Bedrock Converse should have more unsupported headers than Bedrock.""" + bedrock_unsupported = get_unsupported_headers("bedrock") + converse_unsupported = get_unsupported_headers("bedrock_converse") + # Converse has more restrictions + assert len(converse_unsupported) >= len(bedrock_unsupported) + + def test_all_providers_have_config(self): + """All providers should have a configuration entry.""" + providers = ["anthropic", "azure_ai", "bedrock", "bedrock_converse", "vertex_ai"] + for provider in providers: + unsupported = get_unsupported_headers(provider) + # Should return a list (even if empty) + assert isinstance(unsupported, list), f"Provider {provider} should return a list" + + +class TestEdgeCases: + """Test edge cases and error handling.""" + + def test_unknown_provider(self): + """Unknown provider with no config should pass through all headers.""" + result = filter_and_transform_beta_headers( + ["context-management-2025-06-27"], "unknown_provider" + ) + # Unknown providers have no unsupported list, so headers pass through + assert "context-management-2025-06-27" in result + + def test_whitespace_handling(self): + """Headers with whitespace should be handled correctly.""" + headers = [ + " context-management-2025-06-27 ", + " web-search-2025-03-05 ", + ] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert len(result) == 2 + + def test_duplicate_headers(self): + """Duplicate headers should be deduplicated.""" + headers = [ + "context-management-2025-06-27", + "context-management-2025-06-27", + ] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert len(result) == 1 + + def test_case_sensitivity(self): + """Headers should be case-sensitive.""" + # Correct case - should pass through for anthropic (no unsupported list) + headers = ["context-management-2025-06-27"] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert len(result) == 1 + + # Wrong case - should still pass through (not in unsupported list) + headers = ["Context-Management-2025-06-27"] + result = filter_and_transform_beta_headers(headers, "anthropic") + assert len(result) == 1 # Passes through because anthropic has empty unsupported list From 25a19b2091b4aff7f4e60ca10af36281fae55a7a Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 17:45:05 +0530 Subject: [PATCH 049/300] Add update_headers_with_filtered_beta in anthropic --- .../experimental_pass_through/messages/transformation.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py index 308bf367d06..df9679c033b 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py @@ -2,6 +2,9 @@ from typing import Any, AsyncIterator, Dict, List, Optional, Tuple import httpx +from litellm.anthropic_beta_headers_manager import ( + update_headers_with_filtered_beta, +) from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.litellm_core_utils.litellm_logging import verbose_logger from litellm.llms.base_llm.anthropic_messages.transformation import ( @@ -90,6 +93,11 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig): optional_params=optional_params, ) + headers = update_headers_with_filtered_beta( + headers=headers, + provider="anthropic", + ) + return headers, api_base def transform_anthropic_messages_request( From 3f9a7b195658500c27be4bc12f5adb478de57377 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 17:45:45 +0530 Subject: [PATCH 050/300] Add update_headers_with_filtered_beta in all messages API providers --- .../llms/azure_ai/anthropic/transformation.py | 9 +++ .../bedrock/chat/converse_transformation.py | 69 +++++++++---------- .../anthropic_claude3_transformation.py | 62 +++++++++-------- .../transformation.py | 34 +++------ 4 files changed, 84 insertions(+), 90 deletions(-) diff --git a/litellm/llms/azure_ai/anthropic/transformation.py b/litellm/llms/azure_ai/anthropic/transformation.py index 2d8d3b987c7..753bc9c08eb 100644 --- a/litellm/llms/azure_ai/anthropic/transformation.py +++ b/litellm/llms/azure_ai/anthropic/transformation.py @@ -3,6 +3,9 @@ Azure Anthropic transformation config - extends AnthropicConfig with Azure authe """ from typing import TYPE_CHECKING, Dict, List, Optional, Union +from litellm.anthropic_beta_headers_manager import ( + update_headers_with_filtered_beta, +) from litellm.llms.anthropic.chat.transformation import AnthropicConfig from litellm.llms.azure.common_utils import BaseAzureLLM from litellm.types.llms.openai import AllMessageValues @@ -87,6 +90,12 @@ class AzureAnthropicConfig(AnthropicConfig): if "anthropic-version" not in headers: headers["anthropic-version"] = "2023-06-01" + # Filter out unsupported beta headers for Azure AI + headers = update_headers_with_filtered_beta( + headers=headers, + provider="azure_ai", + ) + return headers def transform_request( diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index 7c6c4065782..7fc51263ebb 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -11,6 +11,9 @@ import httpx import litellm from litellm._logging import verbose_logger +from litellm.anthropic_beta_headers_manager import ( + filter_and_transform_beta_headers, +) from litellm.constants import RESPONSE_FORMAT_TOOL_NAME from litellm.litellm_core_utils.core_helpers import ( filter_exceptions_from_params, @@ -617,37 +620,6 @@ class AmazonConverseConfig(BaseConfig): return transformed_tools - def _filter_unsupported_beta_headers_for_bedrock( - self, model: str, beta_list: list - ) -> list: - """ - Remove beta headers that are not supported on Bedrock Converse API for the given model. - - Extended thinking beta headers are only supported on specific Claude 4+ models. - Some beta headers are universally unsupported on Bedrock Converse API. - - Args: - model: The model name - beta_list: The list of beta headers to filter - - Returns: - Filtered list of beta headers - """ - filtered_betas = [] - - # 1. Filter out beta headers that are universally unsupported on Bedrock Converse - for beta in beta_list: - should_keep = True - for unsupported_pattern in UNSUPPORTED_BEDROCK_CONVERSE_BETA_PATTERNS: - if unsupported_pattern in beta.lower(): - should_keep = False - break - - if should_keep: - filtered_betas.append(beta) - - return filtered_betas - def _separate_computer_use_tools( self, tools: List[OpenAIChatCompletionToolParam], model: str ) -> Tuple[ @@ -1124,7 +1096,28 @@ class AmazonConverseConfig(BaseConfig): # Add computer use tools and anthropic_beta if needed (only when computer use tools are present) if computer_use_tools: - anthropic_beta_list.append("computer-use-2024-10-22") + # Determine the correct computer-use beta header based on model + # "computer-use-2025-11-24" for Claude Opus 4.6, Claude Opus 4.5 + # "computer-use-2025-01-24" for Claude Sonnet 4.5, Haiku 4.5, Opus 4.1, Sonnet 4, Opus 4, and Sonnet 3.7 + # "computer-use-2024-10-22" for older models + model_lower = model.lower() + if "opus-4.6" in model_lower or "opus_4.6" in model_lower or "opus-4-6" in model_lower or "opus_4_6" in model_lower: + computer_use_header = "computer-use-2025-11-24" + elif "opus-4.5" in model_lower or "opus_4.5" in model_lower or "opus-4-5" in model_lower or "opus_4_5" in model_lower: + computer_use_header = "computer-use-2025-11-24" + elif any(pattern in model_lower for pattern in [ + "sonnet-4.5", "sonnet_4.5", "sonnet-4-5", "sonnet_4_5", + "haiku-4.5", "haiku_4.5", "haiku-4-5", "haiku_4_5", + "opus-4.1", "opus_4.1", "opus-4-1", "opus_4_1", + "sonnet-4", "sonnet_4", + "opus-4", "opus_4", + "sonnet-3.7", "sonnet_3.7", "sonnet-3-7", "sonnet_3_7" + ]): + computer_use_header = "computer-use-2025-01-24" + else: + computer_use_header = "computer-use-2024-10-22" + + anthropic_beta_list.append(computer_use_header) # Transform computer use tools to proper Bedrock format transformed_computer_tools = self._transform_computer_use_tools( computer_use_tools @@ -1150,13 +1143,13 @@ class AmazonConverseConfig(BaseConfig): unique_betas.append(beta) seen.add(beta) - # Filter out unsupported beta headers for Bedrock Converse API - filtered_betas = self._filter_unsupported_beta_headers_for_bedrock( - model=model, - beta_list=unique_betas, + filtered_betas = filter_and_transform_beta_headers( + beta_headers=unique_betas, + provider="bedrock_converse", ) - - additional_request_params["anthropic_beta"] = filtered_betas + + if filtered_betas: + additional_request_params["anthropic_beta"] = filtered_betas return bedrock_tools, anthropic_beta_list diff --git a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py index 90de67a822f..19fe7d8c140 100644 --- a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py +++ b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py @@ -12,6 +12,9 @@ from typing import ( import httpx +from litellm.anthropic_beta_headers_manager import ( + filter_and_transform_beta_headers, +) from litellm.llms.anthropic.common_utils import AnthropicModelInfo from litellm.llms.anthropic.experimental_pass_through.messages.transformation import ( AnthropicMessagesConfig, @@ -55,10 +58,6 @@ class AmazonAnthropicClaudeMessagesConfig( # Beta header patterns that are not supported by Bedrock Invoke API # These will be filtered out to prevent 400 "invalid beta flag" errors - UNSUPPORTED_BEDROCK_INVOKE_BETA_PATTERNS = [ - "advanced-tool-use", # Bedrock Invoke doesn't support advanced-tool-use beta headers - "prompt-caching-scope", - ] def __init__(self, **kwargs): BaseAnthropicMessagesConfig.__init__(self, **kwargs) @@ -276,39 +275,48 @@ class AmazonAnthropicClaudeMessagesConfig( model: The model name beta_set: The set of beta headers to filter in-place """ - beta_headers_to_remove = set() - has_advanced_tool_use = False - - # 1. Filter out beta headers that are universally unsupported on Bedrock Invoke and track if advanced-tool-use header is present - for beta in beta_set: - for unsupported_pattern in self.UNSUPPORTED_BEDROCK_INVOKE_BETA_PATTERNS: - if unsupported_pattern in beta.lower(): - beta_headers_to_remove.add(beta) - has_advanced_tool_use = True - break - - # 2. Filter out extended thinking headers for models that don't support them + # 1. Handle header transformations BEFORE filtering + # (advanced-tool-use -> tool-search-tool) + # This must happen before filtering because advanced-tool-use is in the unsupported list + has_advanced_tool_use = "advanced-tool-use-2025-11-20" in beta_set + if has_advanced_tool_use and self._supports_tool_search_on_bedrock(model): + beta_set.discard("advanced-tool-use-2025-11-20") + beta_set.add("tool-search-tool-2025-10-19") + beta_set.add("tool-examples-2025-10-29") + + # 2. Apply provider-level filtering using centralized JSON config + beta_list = list(beta_set) + filtered_list = filter_and_transform_beta_headers( + beta_headers=beta_list, + provider="bedrock", + ) + + # Update the set with filtered headers + beta_set.clear() + beta_set.update(filtered_list) + + # 2.1. Handle model-specific exceptions: structured-outputs is only supported on Opus 4.6 + # Re-add structured-outputs if it was in the original set and model is Opus 4.6 + model_lower = model.lower() + is_opus_4_6 = any(pattern in model_lower for pattern in ["opus-4.6", "opus_4.6", "opus-4-6", "opus_4_6"]) + if is_opus_4_6 and "structured-outputs-2025-11-13" in beta_list: + beta_set.add("structured-outputs-2025-11-13") + + # 3. Filter out extended thinking headers for models that don't support them extended_thinking_patterns = [ "extended-thinking", "interleaved-thinking", ] if not self._supports_extended_thinking_on_bedrock(model): + beta_headers_to_remove = set() for beta in beta_set: for pattern in extended_thinking_patterns: if pattern in beta.lower(): beta_headers_to_remove.add(beta) break - - # Remove all filtered headers - for beta in beta_headers_to_remove: - beta_set.discard(beta) - - # 3. Translate advanced-tool-use to Bedrock-specific headers for models that support tool search - # Ref: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html - # Ref: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool - if has_advanced_tool_use and self._supports_tool_search_on_bedrock(model): - beta_set.add("tool-search-tool-2025-10-19") - beta_set.add("tool-examples-2025-10-29") + + for beta in beta_headers_to_remove: + beta_set.discard(beta) def _get_tool_search_beta_header_for_bedrock( self, diff --git a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py index 9b8ff3ecc2d..918b8ecc225 100644 --- a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py +++ b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py @@ -1,5 +1,8 @@ from typing import Any, Dict, List, Optional, Tuple +from litellm.anthropic_beta_headers_manager import ( + update_headers_with_filtered_beta, +) from litellm.llms.anthropic.common_utils import AnthropicModelInfo from litellm.llms.anthropic.experimental_pass_through.messages.transformation import ( AnthropicMessagesConfig, @@ -7,7 +10,6 @@ from litellm.llms.anthropic.experimental_pass_through.messages.transformation im from litellm.types.llms.anthropic import ( ANTHROPIC_BETA_HEADER_VALUES, ANTHROPIC_HOSTED_TOOLS, - ANTHROPIC_PROMPT_CACHING_SCOPE_BETA_HEADER, ) from litellm.types.llms.anthropic_tool_search import get_tool_search_beta_header from litellm.types.llms.vertex_ai import VertexPartnerProvider @@ -65,10 +67,6 @@ class VertexAIPartnerModelsAnthropicMessagesConfig(AnthropicMessagesConfig, Vert existing_beta = headers.get("anthropic-beta") if existing_beta: beta_values.update(b.strip() for b in existing_beta.split(",")) - - # Use the helper to remove unsupported beta headers - self.remove_unsupported_beta(headers) - beta_values.discard(ANTHROPIC_PROMPT_CACHING_SCOPE_BETA_HEADER) # Check for web search tool for tool in tools: @@ -84,6 +82,12 @@ class VertexAIPartnerModelsAnthropicMessagesConfig(AnthropicMessagesConfig, Vert if beta_values: headers["anthropic-beta"] = ",".join(beta_values) + # Filter out unsupported beta headers for Vertex AI + headers = update_headers_with_filtered_beta( + headers=headers, + provider="vertex_ai", + ) + return headers, api_base def get_complete_url( @@ -128,23 +132,3 @@ class VertexAIPartnerModelsAnthropicMessagesConfig(AnthropicMessagesConfig, Vert ) # do not pass output_format in request body to vertex ai - vertex ai does not support output_format as yet return anthropic_messages_request - - def remove_unsupported_beta(self, headers: dict) -> None: - """ - Helper method to remove unsupported beta headers from the beta headers. - Modifies headers in place. - """ - unsupported_beta_headers = [ - ANTHROPIC_PROMPT_CACHING_SCOPE_BETA_HEADER - ] - existing_beta = headers.get("anthropic-beta") - if existing_beta: - filtered_beta = [ - b.strip() - for b in existing_beta.split(",") - if b.strip() not in unsupported_beta_headers - ] - if filtered_beta: - headers["anthropic-beta"] = ",".join(filtered_beta) - elif "anthropic-beta" in headers: - del headers["anthropic-beta"] From c1a43914eea18d0d8cf9467e6462a1ac0633a419 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 17:54:56 +0530 Subject: [PATCH 051/300] Add documentation related to new beta header json --- .../tutorials/claude_code_beta_headers.md | 129 ++++++++++++++++++ docs/my-website/sidebars.js | 1 + litellm/anthropic_beta_headers_config.json | 3 +- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 docs/my-website/docs/tutorials/claude_code_beta_headers.md diff --git a/docs/my-website/docs/tutorials/claude_code_beta_headers.md b/docs/my-website/docs/tutorials/claude_code_beta_headers.md new file mode 100644 index 00000000000..9c1645e0277 --- /dev/null +++ b/docs/my-website/docs/tutorials/claude_code_beta_headers.md @@ -0,0 +1,129 @@ +import Image from '@theme/IdealImage'; + +# Claude Code - Fixing Invalid Beta Header Errors + +When using Claude Code with LiteLLM and non-Anthropic providers (Bedrock, Azure AI, Vertex AI), you may encounter "invalid beta header" errors. This guide explains how to fix these errors locally or contribute a fix to LiteLLM. + +## What Are Beta Headers? + +Anthropic uses beta headers to enable experimental features in Claude. When you use Claude Code, it may send beta headers like: + +``` +anthropic-beta: prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20 +``` + +However, not all providers support all Anthropic beta features. When an unsupported beta header is sent to a provider, you'll see an error. + +## Common Error Message + +```bash +Error: The model returned the following errors: invalid beta flag +``` + +## How LiteLLM Handles Beta Headers + +LiteLLM automatically filters out unsupported beta headers using a configuration file: + +``` +litellm/litellm/anthropic_beta_headers_config.json +``` + +This JSON file lists which beta headers are **unsupported** for each provider. Headers not in the unsupported list are passed through to the provider. + +## Quick Fix: Update Config Locally + +If you encounter an invalid beta header error, you can fix it immediately by updating the config file locally. + +### Step 1: Locate the Config File + +Find the file in your LiteLLM installation: + +```bash +# If installed via pip +cd $(python -c "import litellm; import os; print(os.path.dirname(litellm.__file__))") + +# The config file is at: +# litellm/anthropic_beta_headers_config.json +``` + +### Step 2: Add the Unsupported Header + +Open `anthropic_beta_headers_config.json` and add the problematic header to the appropriate provider's list: + +```json title="anthropic_beta_headers_config.json" +{ + "description": "Unsupported Anthropic beta headers for each provider. Headers listed here will be dropped. Headers not listed are passed through as-is.", + "anthropic": [], + "azure_ai": [], + "bedrock_converse": [ + "prompt-caching-scope-2026-01-05", + "bash_20250124", + "bash_20241022", + "text_editor_20250124", + "text_editor_20241022", + "compact-2026-01-12", + "advanced-tool-use-2025-11-20", + "web-fetch-2025-09-10", + "code-execution-2025-08-25", + "skills-2025-10-02", + "files-api-2025-04-14" + ], + "bedrock": [ + "advanced-tool-use-2025-11-20", + "prompt-caching-scope-2026-01-05", + "structured-outputs-2025-11-13", + "web-fetch-2025-09-10", + "code-execution-2025-08-25", + "skills-2025-10-02", + "files-api-2025-04-14" + ], + "vertex_ai": [ + "prompt-caching-scope-2026-01-05" + ] +} +``` + +### Step 3: Restart Your Application + +After updating the config file, restart your LiteLLM proxy or application: + +```bash +# If using LiteLLM proxy +litellm --config config.yaml + +# If using Python SDK +# Just restart your Python application +``` + +The updated configuration will be loaded automatically. + +## Contributing a Fix to LiteLLM + +Help the community by contributing your fix! If your local changes work, please raise a PR with the addition of the header and we will merge it. + + +## How Beta Header Filtering Works + +When you make a request through LiteLLM: + +```mermaid +sequenceDiagram + participant CC as Claude Code + participant LP as LiteLLM + participant Config as Beta Headers Config + participant Provider as Provider (Bedrock/Azure/etc) + + CC->>LP: Request with beta headers + Note over CC,LP: anthropic-beta: header1,header2,header3 + + LP->>Config: Load unsupported headers for provider + Config-->>LP: Returns unsupported list + + Note over LP: Filter headers:
- Remove unsupported
- Keep supported + + LP->>Provider: Request with filtered headers + Note over LP,Provider: anthropic-beta: header2
(header1, header3 removed) + + Provider-->>LP: Success response + LP-->>CC: Response +``` \ No newline at end of file diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index fda0e3be4e4..688ad714370 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -129,6 +129,7 @@ const sidebars = { "tutorials/claude_mcp", "tutorials/claude_non_anthropic_models", "tutorials/claude_code_plugin_marketplace", + "tutorials/claude_code_beta_headers", ] }, "tutorials/opencode_integration", diff --git a/litellm/anthropic_beta_headers_config.json b/litellm/anthropic_beta_headers_config.json index b6b0753f9ba..193091c0176 100644 --- a/litellm/anthropic_beta_headers_config.json +++ b/litellm/anthropic_beta_headers_config.json @@ -22,8 +22,7 @@ "web-fetch-2025-09-10", "code-execution-2025-08-25", "skills-2025-10-02", - "files-api-2025-04-14", - "code-execution-2025-08-25" + "files-api-2025-04-14" ], "vertex_ai": [ "prompt-caching-scope-2026-01-05" From 786bd6ebc082c99dbfaed2531e64480fc8e33b7a Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:29:14 +0530 Subject: [PATCH 052/300] Fix merge conflicts --- ...odel_prices_and_context_window_backup.json | 48 +------------------ model_prices_and_context_window.json | 2 +- .../test_claude_opus_4_6_config.py | 44 +---------------- 3 files changed, 3 insertions(+), 91 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 757c291e352..0da47634a94 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -1083,7 +1083,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us.anthropic.claude-opus-4-6-v1": { + "us.anthropic.claude-opus-4-6-v1:0": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, @@ -3494,29 +3494,6 @@ "supports_tool_choice": true, "supports_vision": true }, - "azure/gpt-5-search-api": { - "cache_read_input_token_cost": 1.25e-07, - "input_cost_per_token": 1.25e-06, - "litellm_provider": "azure", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_token": 1e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.05, - "search_context_size_low": 0.03, - "search_context_size_medium": 0.035 - }, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_prompt_caching": true, - "supports_response_schema": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true - }, "azure/gpt-5-2025-08-07": { "cache_read_input_token_cost": 1.25e-07, "input_cost_per_token": 1.25e-06, @@ -18820,29 +18797,6 @@ "supports_service_tier": true, "supports_vision": true }, - "gpt-5-search-api": { - "cache_read_input_token_cost": 1.25e-07, - "input_cost_per_token": 1.25e-06, - "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", - "output_cost_per_token": 1e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.05, - "search_context_size_low": 0.03, - "search_context_size_medium": 0.035 - }, - "supports_function_calling": true, - "supports_parallel_function_calling": true, - "supports_prompt_caching": true, - "supports_response_schema": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true - }, "gpt-5.1": { "cache_read_input_token_cost": 1.25e-07, "cache_read_input_token_cost_priority": 2.5e-07, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index eee30b36ab3..0da47634a94 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -1083,7 +1083,7 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us.anthropic.claude-opus-4-6-v1": { + "us.anthropic.claude-opus-4-6-v1:0": { "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost": 5.5e-07, diff --git a/tests/test_litellm/test_claude_opus_4_6_config.py b/tests/test_litellm/test_claude_opus_4_6_config.py index 03a1a750772..071d0a26369 100644 --- a/tests/test_litellm/test_claude_opus_4_6_config.py +++ b/tests/test_litellm/test_claude_opus_4_6_config.py @@ -26,12 +26,6 @@ def test_opus_4_6_model_pricing_and_capabilities(): "tool_use_system_prompt_tokens": 346, "max_input_tokens": 1000000, }, - "anthropic.claude-opus-4-6-v1:0": { - "provider": "bedrock_converse", - "has_long_context_pricing": True, - "tool_use_system_prompt_tokens": 346, - "max_input_tokens": 1000000, - }, "anthropic.claude-opus-4-6-v1": { "provider": "bedrock_converse", "has_long_context_pricing": True, @@ -98,26 +92,6 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, "cache_read_input_token_cost_above_200k_tokens": 1e-06, }, - "global.anthropic.claude-opus-4-6-v1": { - "input_cost_per_token": 5e-06, - "output_cost_per_token": 2.5e-05, - "cache_creation_input_token_cost": 6.25e-06, - "cache_read_input_token_cost": 5e-07, - "input_cost_per_token_above_200k_tokens": 1e-05, - "output_cost_per_token_above_200k_tokens": 3.75e-05, - "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, - "cache_read_input_token_cost_above_200k_tokens": 1e-06, - }, - "us.anthropic.claude-opus-4-6-v1:0": { - "input_cost_per_token": 5.5e-06, - "output_cost_per_token": 2.75e-05, - "cache_creation_input_token_cost": 6.875e-06, - "cache_read_input_token_cost": 5.5e-07, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - }, "us.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, @@ -128,16 +102,6 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, }, - "eu.anthropic.claude-opus-4-6-v1:0": { - "input_cost_per_token": 5.5e-06, - "output_cost_per_token": 2.75e-05, - "cache_creation_input_token_cost": 6.875e-06, - "cache_read_input_token_cost": 5.5e-07, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - }, "eu.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, @@ -148,7 +112,7 @@ def test_opus_4_6_bedrock_regional_model_pricing(): "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, }, - "apac.anthropic.claude-opus-4-6-v1:0": { + "apac.anthropic.claude-opus-4-6-v1": { "input_cost_per_token": 5.5e-06, "output_cost_per_token": 2.75e-05, "cache_creation_input_token_cost": 6.875e-06, @@ -212,14 +176,8 @@ def test_opus_4_6_alias_and_dated_metadata_match(): def test_opus_4_6_bedrock_converse_registration(): - assert "anthropic.claude-opus-4-6-v1:0" in litellm.BEDROCK_CONVERSE_MODELS assert "anthropic.claude-opus-4-6-v1" in litellm.BEDROCK_CONVERSE_MODELS - assert "anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models - assert "global.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models assert "global.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models - assert "us.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models assert "us.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models - assert "eu.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models assert "eu.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models - assert "apac.anthropic.claude-opus-4-6-v1:0" in litellm.bedrock_converse_models assert "apac.anthropic.claude-opus-4-6-v1" in litellm.bedrock_converse_models From 40ff79655c5768d27eaca67a4848fd4abb5f2af0 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:20:03 +0530 Subject: [PATCH 053/300] Add not_available in inference_geo --- litellm/llms/anthropic/cost_calculation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/anthropic/cost_calculation.py b/litellm/llms/anthropic/cost_calculation.py index a1a2803c2cb..11b61cc92f0 100644 --- a/litellm/llms/anthropic/cost_calculation.py +++ b/litellm/llms/anthropic/cost_calculation.py @@ -23,7 +23,7 @@ def cost_per_token(model: str, usage: "Usage") -> Tuple[float, float]: Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd """ # If usage has inference_geo, prepend it as prefix to model name - if hasattr(usage, "inference_geo") and usage.inference_geo and usage.inference_geo.lower() != "global": + if hasattr(usage, "inference_geo") and usage.inference_geo and usage.inference_geo.lower() not in ["global", "not_available"]: model_with_geo_prefix = f"{usage.inference_geo}/{model}" else: model_with_geo_prefix = model From fa26c6eeec6a9a6c29f5c765a8583f0cf8ee08b4 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:26:45 +0530 Subject: [PATCH 054/300] fix mypy issue --- litellm/llms/anthropic/chat/transformation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 7f507e8217c..02b8d952445 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -1273,7 +1273,6 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): tool_calls: List[ChatCompletionToolCallChunk] = [] web_search_results: Optional[List[Any]] = None tool_results: Optional[List[Any]] = None - context_management: Optional[List[Any]] = None compaction_blocks: Optional[List[Any]] = None for idx, content in enumerate(completion_response["content"]): if content["type"] == "text": From 05ce4c68e51491a28757298abd56c957463d5778 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:34:57 +0530 Subject: [PATCH 055/300] Fix: test_vertex_ai_partner_models_anthropic_remove_prompt_caching_scope_beta_header --- ...t_vertex_ai_partner_models_anthropic_transformation.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py index cda875175cc..90ab41aadf6 100644 --- a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py +++ b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_transformation.py @@ -6,6 +6,9 @@ import pytest sys.path.insert( 0, os.path.abspath("../../../../../..") ) # Adds the parent directory to the system path +from litellm.anthropic_beta_headers_manager import ( + update_headers_with_filtered_beta, +) from litellm.llms.vertex_ai.vertex_ai_partner_models.anthropic.transformation import ( VertexAIAnthropicConfig, ) @@ -346,8 +349,7 @@ def test_vertex_ai_partner_models_anthropic_remove_prompt_caching_scope_beta_hea "anthropic-beta": f"other-feature,{PROMPT_CACHING_BETA_HEADER},web-search-2025-03-05" } - config = VertexAIPartnerModelsAnthropicMessagesConfig() - config.remove_unsupported_beta(headers) + headers = update_headers_with_filtered_beta(headers, "vertex_ai") beta_header = headers.get("anthropic-beta") assert PROMPT_CACHING_BETA_HEADER not in (beta_header or ""), \ @@ -358,5 +360,5 @@ def test_vertex_ai_partner_models_anthropic_remove_prompt_caching_scope_beta_hea "Other non-excluded beta headers should remain" # If prompt-caching was the only value, header should be removed completely headers2 = {"anthropic-beta": PROMPT_CACHING_BETA_HEADER} - config.remove_unsupported_beta(headers2) + headers2 = update_headers_with_filtered_beta(headers2, "vertex_ai") assert "anthropic-beta" not in headers2, "Header should be removed if no supported values remain" \ No newline at end of file From 2e0715bd61799f6156d1fe532c227aed2a90417b Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:45:54 +0530 Subject: [PATCH 056/300] Fix mypy issue --- litellm/types/llms/anthropic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/types/llms/anthropic.py b/litellm/types/llms/anthropic.py index 85d419ccc7d..fedf419efd6 100644 --- a/litellm/types/llms/anthropic.py +++ b/litellm/types/llms/anthropic.py @@ -613,7 +613,7 @@ ANTHROPIC_API_ONLY_HEADERS = { # fails if calling anthropic on vertex ai / bedr class AnthropicThinkingParam(TypedDict, total=False): - type: Literal["enabled"] + type: Literal["enabled", "adaptive"] budget_tokens: int From db8423b799b660a6950e68d91381fe392a9a18fb Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 18:52:04 +0530 Subject: [PATCH 057/300] Fix: test_json_response_nested_json_schema --- .../proxy/spend_tracking/test_spend_management_endpoints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py b/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py index 13368d0a142..54a276bc97f 100644 --- a/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py +++ b/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py @@ -205,6 +205,7 @@ ignored_keys = [ "metadata.additional_usage_values.prompt_tokens_details", "metadata.additional_usage_values.cache_creation_input_tokens", "metadata.additional_usage_values.cache_read_input_tokens", + "metadata.additional_usage_values.inference_geo", "metadata.litellm_overhead_time_ms", "metadata.cost_breakdown", ] From 285b2d2a125c3f90f2fbb34ad8b74e73f2f5a48f Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Feb 2026 19:06:49 +0530 Subject: [PATCH 058/300] add context_management header for compact_20260112 for messages --- .../messages/transformation.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py index 308bf367d06..52e3ca7159d 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py @@ -189,8 +189,27 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig): beta_values.update(b.strip() for b in existing_beta.split(",")) # Check for context management - if optional_params.get("context_management") is not None: - beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value) + context_management_param = optional_params.get("context_management") + if context_management_param is not None: + # Check edits array for compact_20260112 type + edits = context_management_param.get("edits", []) + has_compact = False + has_other = False + + for edit in edits: + edit_type = edit.get("type", "") + if edit_type == "compact_20260112": + has_compact = True + else: + has_other = True + + # Add compact header if any compact edits exist + if has_compact: + beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.COMPACT_2026_01_12.value) + + # Add context management header if any other edits exist + if has_other: + beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value) # Check for structured outputs if optional_params.get("output_format") is not None: From 53a1f2d21cbfcada1283ab4e83a7e40ab1c8013f Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Fri, 6 Feb 2026 09:18:24 -0800 Subject: [PATCH 059/300] perf(prometheus): parallelize budget metrics, fix caching bug, reduce CPU by ~40% (#20544) --- litellm/integrations/prometheus.py | 53 +++++++++++-------- poetry.lock | 4 -- ...or.py => test_azure_ai_cost_calculator.py} | 0 3 files changed, 31 insertions(+), 26 deletions(-) rename tests/test_litellm/llms/azure_ai/{test_cost_calculator.py => test_azure_ai_cost_calculator.py} (100%) diff --git a/litellm/integrations/prometheus.py b/litellm/integrations/prometheus.py index 00c38eac188..0a61dab0680 100644 --- a/litellm/integrations/prometheus.py +++ b/litellm/integrations/prometheus.py @@ -1,6 +1,7 @@ # used for /metrics endpoint on LiteLLM Proxy #### What this does #### # On success, log events to Prometheus +import asyncio import os import sys from datetime import datetime, timedelta @@ -1188,28 +1189,34 @@ class PrometheusLogger(CustomLogger): _user_spend = _metadata.get("user_api_key_user_spend", None) _user_max_budget = _metadata.get("user_api_key_user_max_budget", None) - await self._set_api_key_budget_metrics_after_api_request( - user_api_key=user_api_key, - user_api_key_alias=user_api_key_alias, - response_cost=response_cost, - key_max_budget=_api_key_max_budget, - key_spend=_api_key_spend, - ) - - await self._set_team_budget_metrics_after_api_request( - user_api_team=user_api_team, - user_api_team_alias=user_api_team_alias, - team_spend=_team_spend, - team_max_budget=_team_max_budget, - response_cost=response_cost, - ) - - await self._set_user_budget_metrics_after_api_request( - user_id=user_id, - user_spend=_user_spend, - user_max_budget=_user_max_budget, - response_cost=response_cost, + results = await asyncio.gather( + self._set_api_key_budget_metrics_after_api_request( + user_api_key=user_api_key, + user_api_key_alias=user_api_key_alias, + response_cost=response_cost, + key_max_budget=_api_key_max_budget, + key_spend=_api_key_spend, + ), + self._set_team_budget_metrics_after_api_request( + user_api_team=user_api_team, + user_api_team_alias=user_api_team_alias, + team_spend=_team_spend, + team_max_budget=_team_max_budget, + response_cost=response_cost, + ), + self._set_user_budget_metrics_after_api_request( + user_id=user_id, + user_spend=_user_spend, + user_max_budget=_user_max_budget, + response_cost=response_cost, + ), + return_exceptions=True, ) + for i, r in enumerate(results): + if isinstance(r, Exception): + verbose_logger.debug( + f"[Non-Blocking] Prometheus: Budget metric lookup {['key', 'team', 'user'][i]} failed: {r}" + ) def _increment_top_level_request_and_spend_metrics( self, @@ -2898,12 +2905,14 @@ class PrometheusLogger(CustomLogger): max_budget=max_budget, ) try: + # Note: Setting check_db_only=True bypasses cache and hits DB on every request, + # causing huge latency increase and CPU spikes. Keep check_db_only=False. user_info = await get_user_object( user_id=user_id, prisma_client=prisma_client, user_api_key_cache=user_api_key_cache, user_id_upsert=False, - check_db_only=True, + check_db_only=False, ) except Exception as e: verbose_logger.debug( diff --git a/poetry.lock b/poetry.lock index 5e926509d54..b37fd863431 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8531,8 +8531,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -<<<<<<< litellm_oss_staging_02_04_2026 -content-hash = "797603dcfef0a79781c7d3cba5dfe18f6aea4aa792220f47487ebc7bd04ae2e3" -======= content-hash = "e5447e14dd37e324ac07a8fc6286d27e9a0d355ed93ebb24fc11e3f5df12fd3e" ->>>>>>> main diff --git a/tests/test_litellm/llms/azure_ai/test_cost_calculator.py b/tests/test_litellm/llms/azure_ai/test_azure_ai_cost_calculator.py similarity index 100% rename from tests/test_litellm/llms/azure_ai/test_cost_calculator.py rename to tests/test_litellm/llms/azure_ai/test_azure_ai_cost_calculator.py From 82ba49690e41da63699b4f8962e8027340cbb586 Mon Sep 17 00:00:00 2001 From: Kelvin Tran Date: Fri, 6 Feb 2026 09:19:26 -0800 Subject: [PATCH 060/300] generate poetry lock with 2.3.2 poetry --- poetry.lock | 4100 ++++++++++++++++++++++++++++----------------------- 1 file changed, 2227 insertions(+), 1873 deletions(-) diff --git a/poetry.lock b/poetry.lock index 06b5cdff8c5..8b5e3253197 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. [[package]] name = "a2a-sdk" @@ -59,132 +59,132 @@ files = [ [[package]] name = "aiohttp" -version = "3.13.2" +version = "3.13.3" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155"}, - {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c"}, - {file = "aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6"}, - {file = "aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251"}, - {file = "aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8"}, - {file = "aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec"}, - {file = "aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248"}, - {file = "aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e"}, - {file = "aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23"}, - {file = "aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254"}, - {file = "aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a"}, - {file = "aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940"}, - {file = "aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c"}, - {file = "aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734"}, - {file = "aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329"}, - {file = "aiohttp-3.13.2-cp39-cp39-win32.whl", hash = "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084"}, - {file = "aiohttp-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5"}, - {file = "aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, + {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, + {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, + {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, + {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, + {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, + {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, + {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, + {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, + {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, + {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, + {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, + {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, + {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, ] [package.dependencies] @@ -198,7 +198,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -244,20 +244,20 @@ files = [ [[package]] name = "alembic" -version = "1.17.2" +version = "1.18.3" description = "A database migration tool for SQLAlchemy." optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "alembic-1.17.2-py3-none-any.whl", hash = "sha256:f483dd1fe93f6c5d49217055e4d15b905b425b6af906746abb35b69c1996c4e6"}, - {file = "alembic-1.17.2.tar.gz", hash = "sha256:bbe9751705c5e0f14877f02d46c53d10885e377e3d90eda810a016f9baa19e8e"}, + {file = "alembic-1.18.3-py3-none-any.whl", hash = "sha256:12a0359bfc068a4ecbb9b3b02cf77856033abfdb59e4a5aca08b7eacd7b74ddd"}, + {file = "alembic-1.18.3.tar.gz", hash = "sha256:1212aa3778626f2b0f0aa6dd4e99a5f99b94bd25a0c1ac0bba3be65e081e50b0"}, ] [package.dependencies] Mako = "*" -SQLAlchemy = ">=1.4.0" +SQLAlchemy = ">=1.4.23" tomli = {version = "*", markers = "python_version < \"3.11\""} typing-extensions = ">=4.12" @@ -291,36 +291,35 @@ files = [ [[package]] name = "anyio" -version = "4.11.0" +version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, - {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" -sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.31.0)"] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] [[package]] name = "apscheduler" -version = "3.11.1" +version = "3.11.2" description = "In-process task scheduler with Cron-like capabilities" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "apscheduler-3.11.1-py3-none-any.whl", hash = "sha256:6162cb5683cb09923654fa9bdd3130c4be4bfda6ad8990971c9597ecd52965d2"}, - {file = "apscheduler-3.11.1.tar.gz", hash = "sha256:0db77af6400c84d1747fe98a04b8b58f0080c77d11d338c4f507a9752880f221"}, + {file = "apscheduler-3.11.2-py3-none-any.whl", hash = "sha256:ce005177f741409db4e4dd40a7431b76feb856b9dd69d57e0da49d6715bfd26d"}, + {file = "apscheduler-3.11.2.tar.gz", hash = "sha256:2a9966b052ec805f020c8c4c3ae6e6a06e24b1bf19f2e11d91d8cca0473eef41"}, ] [package.dependencies] @@ -334,7 +333,7 @@ mongodb = ["pymongo (>=3.0)"] redis = ["redis (>=3.0)"] rethinkdb = ["rethinkdb (>=2.4.0)"] sqlalchemy = ["sqlalchemy (>=1.4)"] -test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytz", "twisted ; python_version < \"3.14\""] +test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytest-timeout", "pytz", "twisted ; python_version < \"3.14\""] tornado = ["tornado (>=4.3)"] twisted = ["twisted"] zookeeper = ["kazoo"] @@ -343,7 +342,7 @@ zookeeper = ["kazoo"] name = "async-timeout" version = "5.0.1" description = "Timeout context manager for asyncio programs" -optional = true +optional = false python-versions = ">=3.8" groups = ["main"] markers = "python_full_version < \"3.11.3\" and (extra == \"extra-proxy\" or extra == \"proxy\" or python_version < \"3.11\")" @@ -389,15 +388,16 @@ tornado = ">=6.4.2" [[package]] name = "azure-core" -version = "1.36.0" +version = "1.38.0" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.9" groups = ["main", "proxy-dev"] files = [ - {file = "azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b"}, - {file = "azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7"}, + {file = "azure_core-1.38.0-py3-none-any.whl", hash = "sha256:ab0c9b2cd71fecb1842d52c965c95285d3cfb38902f6766e4a471f1cd8905335"}, + {file = "azure_core-1.38.0.tar.gz", hash = "sha256:8194d2682245a3e4e3151a667c686464c3786fed7918b394d035bdcd61bb5993"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] requests = ">=2.21.0" @@ -418,6 +418,7 @@ files = [ {file = "azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651"}, {file = "azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] azure-core = ">=1.31.0" @@ -446,15 +447,15 @@ typing-extensions = ">=4.6.0" [[package]] name = "azure-storage-blob" -version = "12.27.1" +version = "12.28.0" description = "Microsoft Azure Blob Storage Client Library for Python" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "azure_storage_blob-12.27.1-py3-none-any.whl", hash = "sha256:65d1e25a4628b7b6acd20ff7902d8da5b4fde8e46e19c8f6d213a3abc3ece272"}, - {file = "azure_storage_blob-12.27.1.tar.gz", hash = "sha256:a1596cc4daf5dac9be115fcb5db67245eae894cf40e4248243754261f7b674a6"}, + {file = "azure_storage_blob-12.28.0-py3-none-any.whl", hash = "sha256:00fb1db28bf6a7b7ecaa48e3b1d5c83bfadacc5a678b77826081304bd87d6461"}, + {file = "azure_storage_blob-12.28.0.tar.gz", hash = "sha256:e7d98ea108258d29aa0efbfd591b2e2075fa1722a2fae8699f0b3c9de11eff41"}, ] [package.dependencies] @@ -468,15 +469,15 @@ aio = ["azure-core[aio] (>=1.30.0)"] [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"utils\"" files = [ - {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, - {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] [package.extras] @@ -593,8 +594,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] @@ -602,27 +603,27 @@ crt = ["awscrt (==0.28.4)"] [[package]] name = "cachetools" -version = "6.2.2" +version = "6.2.6" description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" +markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "cachetools-6.2.2-py3-none-any.whl", hash = "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace"}, - {file = "cachetools-6.2.2.tar.gz", hash = "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6"}, + {file = "cachetools-6.2.6-py3-none-any.whl", hash = "sha256:8c9717235b3c651603fff0076db52d6acbfd1b338b8ed50256092f7ce9c85bda"}, + {file = "cachetools-6.2.6.tar.gz", hash = "sha256:16c33e1f276b9a9c0b49ab5782d901e3ad3de0dd6da9bf9bcd29ac5672f2f9e6"}, ] [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, - {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] @@ -718,7 +719,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" or extra == \"proxy\"", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} +markers = {main = "(python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\") and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -1149,7 +1150,6 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] -markers = "python_version == \"3.9\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1179,6 +1179,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1195,68 +1196,63 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main", "dev", "proxy-dev"] -markers = "python_version >= \"3.10\"" files = [ - {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac"}, - {file = "cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018"}, - {file = "cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb"}, - {file = "cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c"}, - {file = "cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de"}, - {file = "cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21"}, - {file = "cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4"}, - {file = "cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df"}, - {file = "cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f"}, - {file = "cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, - {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, + {file = "cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616"}, + {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0"}, + {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0"}, + {file = "cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5"}, + {file = "cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b"}, + {file = "cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f"}, + {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82"}, + {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c"}, + {file = "cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061"}, + {file = "cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7"}, + {file = "cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019"}, + {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4"}, + {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b"}, + {file = "cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc"}, + {file = "cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3"}, + {file = "cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59"}, ] +markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} [package.dependencies] cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} @@ -1269,7 +1265,7 @@ nox = ["nox[uv] (>=2024.4.15)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==46.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.4)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1291,15 +1287,15 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "databricks-sdk" -version = "0.73.0" +version = "0.85.0" description = "Databricks SDK for Python (Beta)" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "databricks_sdk-0.73.0-py3-none-any.whl", hash = "sha256:a4d3cfd19357a2b459d2dc3101454d7f0d1b62865ce099c35d0c342b66ac64ff"}, - {file = "databricks_sdk-0.73.0.tar.gz", hash = "sha256:db09eaaacd98e07dded78d3e7ab47d2f6c886e0380cb577977bd442bace8bd8d"}, + {file = "databricks_sdk-0.85.0-py3-none-any.whl", hash = "sha256:2a2da176a55d55fb84696e0255520e99e838dd942b97b971dff724041fe00c64"}, + {file = "databricks_sdk-0.85.0.tar.gz", hash = "sha256:0b5f415fba69ea0c5bfc4d0b21cb3366c6b66f678e78e4b3c94cbcf2e9e0972f"}, ] [package.dependencies] @@ -1308,7 +1304,7 @@ protobuf = ">=4.25.8,<5.26.dev0 || >5.29.0,<5.29.1 || >5.29.1,<5.29.2 || >5.29.2 requests = ">=2.28.1,<3" [package.extras] -dev = ["autoflake", "black", "build", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort", "langchain-openai ; python_version > \"3.7\"", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist (>=3.6.1,<4.0)", "requests-mock", "wheel"] +dev = ["autoflake (==2.3.1)", "black (==24.8.0)", "build", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort (==5.13.2)", "langchain-openai ; python_version > \"3.7\"", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist (>=3.6.1,<4.0)", "requests-mock", "wheel"] notebook = ["ipython (>=8,<10)", "ipywidgets (>=8,<9)"] openai = ["httpx", "langchain-openai ; python_version > \"3.7\"", "openai"] @@ -1451,12 +1447,25 @@ description = "Docutils -- Python Documentation Utilities" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"utils\"" +markers = "python_version < \"3.11\" and extra == \"utils\"" files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] +[[package]] +name = "docutils" +version = "0.22.4" +description = "Docutils -- Python Documentation Utilities" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.11\" and extra == \"utils\"" +files = [ + {file = "docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"}, + {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, +] + [[package]] name = "email-validator" version = "2.3.0" @@ -1476,15 +1485,15 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] [package.dependencies] @@ -1495,38 +1504,39 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.121.3" +version = "0.128.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "fastapi-0.121.3-py3-none-any.whl", hash = "sha256:0c78fc87587fcd910ca1bbf5bc8ba37b80e119b388a7206b39f0ecc95ebf53e9"}, - {file = "fastapi-0.121.3.tar.gz", hash = "sha256:0055bc24fe53e56a40e9e0ad1ae2baa81622c406e548e501e717634e2dfbc40b"}, + {file = "fastapi-0.128.3-py3-none-any.whl", hash = "sha256:c8cdf7c2182c9a06bf9cfa3329819913c189dc86389b90d5709892053582db29"}, + {file = "fastapi-0.128.3.tar.gz", hash = "sha256:ed99383fd96063447597d5aa2a9ec3973be198e3b4fc10c55f15c62efdb21c60"}, ] markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [package.dependencies] annotated-doc = ">=0.0.2" -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.40.0,<0.51.0" +pydantic = ">=2.7.0" +starlette = ">=0.40.0,<1.0.0" typing-extensions = ">=4.8.0" +typing-inspection = ">=0.4.2" [package.extras] -all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] -standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.9.3)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=5.8.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "fastapi-offline" -version = "1.7.5" +version = "1.7.6" description = "FastAPI without reliance on CDNs for docs" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "fastapi_offline-1.7.5-py3-none-any.whl", hash = "sha256:00369632d604e8156b9ca9ab9c65e58ad8beff83d1ffc7bdbcec4a86173d51b4"}, - {file = "fastapi_offline-1.7.5.tar.gz", hash = "sha256:07a58cb8d8fab68ba625698414b4cac833bb2d94d82dc0fbc2a8519bee7af87d"}, + {file = "fastapi_offline-1.7.6-py3-none-any.whl", hash = "sha256:24d6851b5a94c50f669594b7ab9d1bbe3a4c0a53c4f4e9ce47798ff4591790d2"}, + {file = "fastapi_offline-1.7.6.tar.gz", hash = "sha256:c84d08584faa646932951b493106992caa79b838e454f14dd410cef9a1a5e07d"}, ] [package.dependencies] @@ -1658,15 +1668,15 @@ files = [ [[package]] name = "filelock" -version = "3.20.0" +version = "3.20.3" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\"" files = [ - {file = "filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2"}, - {file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"}, + {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, + {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, ] [[package]] @@ -1713,15 +1723,15 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-cors" -version = "6.0.1" +version = "6.0.2" description = "A Flask extension simplifying CORS support" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "flask_cors-6.0.1-py3-none-any.whl", hash = "sha256:c7b2cbfb1a31aa0d2e5341eea03a6805349f7a61647daee1a15c46bbe981494c"}, - {file = "flask_cors-6.0.1.tar.gz", hash = "sha256:d81bcb31f07b0985be7f48406247e9243aced229b7747219160a0559edd678db"}, + {file = "flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a"}, + {file = "flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423"}, ] [package.dependencies] @@ -1730,84 +1740,76 @@ Werkzeug = ">=0.7" [[package]] name = "fonttools" -version = "4.60.1" +version = "4.61.1" description = "Tools to manipulate font files" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28"}, - {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15"}, - {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c"}, - {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea"}, - {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652"}, - {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a"}, - {file = "fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce"}, - {file = "fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038"}, - {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f"}, - {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2"}, - {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914"}, - {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1"}, - {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d"}, - {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa"}, - {file = "fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258"}, - {file = "fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf"}, - {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc"}, - {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877"}, - {file = "fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c"}, - {file = "fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401"}, - {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903"}, - {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed"}, - {file = "fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6"}, - {file = "fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383"}, - {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb"}, - {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4"}, - {file = "fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c"}, - {file = "fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77"}, - {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199"}, - {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c"}, - {file = "fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272"}, - {file = "fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac"}, - {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3"}, - {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85"}, - {file = "fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537"}, - {file = "fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003"}, - {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08"}, - {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99"}, - {file = "fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6"}, - {file = "fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987"}, - {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299"}, - {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01"}, - {file = "fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801"}, - {file = "fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc"}, - {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc"}, - {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed"}, - {file = "fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259"}, - {file = "fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c"}, - {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2"}, - {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036"}, - {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856"}, - {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7"}, - {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854"}, - {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da"}, - {file = "fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a"}, - {file = "fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217"}, - {file = "fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb"}, - {file = "fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, + {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, + {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, + {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, + {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, + {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, + {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, + {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, + {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, + {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, + {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, + {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, + {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, + {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, + {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] @@ -1957,6 +1959,7 @@ description = "File-system specification" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version == \"3.9\"" files = [ {file = "fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d"}, {file = "fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"}, @@ -1990,6 +1993,47 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] tqdm = ["tqdm"] +[[package]] +name = "fsspec" +version = "2026.2.0" +description = "File-system specification" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437"}, + {file = "fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff (>=0.5)"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs (>2024.2.0)", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs (>2024.2.0)", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs (>2024.2.0)"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs (>2024.2.0)"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "backports-zstd ; python_version < \"3.14\"", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas (<3.0.0)", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] +tqdm = ["tqdm"] + [[package]] name = "gitdb" version = "4.0.12" @@ -2008,15 +2052,15 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.46" description = "GitPython is a Python library used to interact with Git repositories" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, - {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, + {file = "gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058"}, + {file = "gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f"}, ] [package.dependencies] @@ -2024,7 +2068,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy (==1.18.2) ; python_version >= \"3.9\"", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "google-api-core" @@ -2056,27 +2100,27 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] [[package]] name = "google-api-core" -version = "2.28.1" +version = "2.29.0" description = "Google API client core library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\"" +markers = "python_version < \"3.14\" and (extra == \"extra-proxy\" or extra == \"google\")" files = [ - {file = "google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c"}, - {file = "google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8"}, + {file = "google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9"}, + {file = "google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.0" googleapis-common-protos = ">=1.56.2,<2.0.0" grpcio = [ + {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, - {version = ">=1.33.2,<2.0.0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = [ {version = ">=1.22.3,<2.0.0"}, @@ -2093,89 +2137,92 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] [[package]] name = "google-auth" -version = "2.43.0" +version = "2.48.0" description = "Google Authentication Library" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16"}, - {file = "google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483"}, + {file = "google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f"}, + {file = "google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce"}, ] [package.dependencies] -cachetools = ">=2.0.0,<7.0" +cryptography = ">=38.0.3" pyasn1-modules = ">=0.2.1" requests = {version = ">=2.20.0,<3.0.0", optional = true, markers = "extra == \"requests\""} rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyjwt = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"] -pyopenssl = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +cryptography = ["cryptography (>=38.0.3)"] +enterprise-cert = ["pyopenssl"] +pyjwt = ["pyjwt (>=2.0)"] +pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0)"] -testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] +testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "flask", "freezegun", "grpcio", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] urllib3 = ["packaging", "urllib3"] [[package]] name = "google-cloud-aiplatform" -version = "1.130.0" +version = "1.136.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"google\"" files = [ - {file = "google_cloud_aiplatform-1.130.0-py2.py3-none-any.whl", hash = "sha256:f578ccee55655dd9e2300cfcafb178e47c3dfdcf746ad465234b875d3e955929"}, - {file = "google_cloud_aiplatform-1.130.0.tar.gz", hash = "sha256:f66aeb23f0a6848fc2d5bbdf1b5777c3cf8e06056f73ef815317abf89d5a0262"}, + {file = "google_cloud_aiplatform-1.136.0-py2.py3-none-any.whl", hash = "sha256:5c829f002b7b673dcd0e718f55cc0557b571bd10eb5cdb7882d72916cfbf8c0e"}, + {file = "google_cloud_aiplatform-1.136.0.tar.gz", hash = "sha256:01e64a0d0861486e842bf7e904077c847bcc1b654a29883509d57476de915b7d"}, ] [package.dependencies] docstring_parser = "<1" google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0" +google-auth = ">=2.47.0,<3.0.0" google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0" google-cloud-resource-manager = ">=1.3.3,<3.0.0" google-cloud-storage = [ {version = ">=1.32.0,<4.0.0", markers = "python_version < \"3.13\""}, {version = ">=2.10.0,<4.0.0", markers = "python_version >= \"3.13\""}, ] -google-genai = ">=1.37.0,<2.0.0" +google-genai = [ + {version = ">=1.37.0,<2.0.0", markers = "python_version < \"3.10\""}, + {version = ">=1.59.0,<2.0.0", markers = "python_version >= \"3.10\""}, +] packaging = ">=14.3" proto-plus = ">=1.22.3,<2.0.0" protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" pydantic = "<3" -shapely = "<3.0.0" typing_extensions = "*" [package.extras] -adk = ["google-adk (>=1.0.0,<2.0.0)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)"] +adk = ["google-adk (>=1.0.0,<2.0.0)"] ag2 = ["ag2[gemini]", "openinference-instrumentation-autogen (>=0.1.6,<0.2)"] -ag2-testing = ["absl-py", "ag2[gemini]", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "openinference-instrumentation-autogen (>=0.1.6,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] -agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "packaging (>=24.0)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +ag2-testing = ["absl-py", "ag2[gemini]", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "openinference-instrumentation-autogen (>=0.1.6,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-iam", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "packaging (>=24.0)", "pydantic (>=2.11.1,<3)", "typing_extensions"] autologging = ["mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\""] cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] datasets = ["pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\""] endpoint = ["requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)"] evaluation = ["jsonschema", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "pandas (>=1.0.0)", "pyyaml", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "tqdm (>=4.23.0)"] -full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "jsonschema", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.124.4)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "jsonschema", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)"] langchain = ["langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] -langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] -lit = ["explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] +langchain-testing = ["absl-py", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +lit = ["explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] llama-index = ["llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)"] -llama-index-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +llama-index-testing = ["absl-py", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] pipelines = ["pyyaml (>=5.3.1,<7)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.114.0)", "httpx (>=0.23.0,<=0.28.1)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.124.4)", "httpx (>=0.23.0,<=0.28.1)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\""] ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "ray[train]", "scikit-learn (<1.6.0)", "tensorflow ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost_ray"] -reasoningengine = ["cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +reasoningengine = ["aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "typing_extensions"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] -testing = ["Pillow", "aiohttp", "bigframes ; python_version >= \"3.10\" and python_version < \"3.14\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "google-vizier (>=0.1.6)", "grpcio-testing", "grpcio-tools (>=1.63.0) ; python_version >= \"3.13\"", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "immutabledict", "ipython", "jsonschema", "kfp (>=2.6.0,<3.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "mock", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "protobuf (<=5.29.4)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-cov", "pytest-xdist", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.14.1) ; python_version <= \"3.11\"", "tensorflow (==2.19.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)", "werkzeug (>=2.0.0,<4.0.0)", "xgboost"] +testing = ["Pillow", "aiohttp", "bigframes ; python_version >= \"3.10\" and python_version < \"3.14\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.124.4)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-iam", "google-vizier (>=0.1.6)", "google-vizier (>=0.1.6)", "grpcio-testing", "grpcio-tools (>=1.63.0) ; python_version >= \"3.13\"", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "immutabledict", "ipython", "jsonschema", "kfp (>=2.6.0,<3.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "mock", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "protobuf (<=5.29.4)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-cov", "pytest-xdist", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.14.1) ; python_version <= \"3.11\"", "tensorflow (==2.19.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)", "werkzeug (>=2.0.0,<4.0.0)", "xgboost"] tokenization = ["sentencepiece (>=0.2.0)"] vizier = ["google-vizier (>=0.1.6)"] xai = ["tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] @@ -2236,15 +2283,15 @@ grpc = ["grpcio (>=1.38.0,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75. [[package]] name = "google-cloud-iam" -version = "2.20.0" +version = "2.21.0" description = "Google Cloud Iam API client library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"extra-proxy\"" files = [ - {file = "google_cloud_iam-2.20.0-py3-none-any.whl", hash = "sha256:643fcf6db3100772f222c7173bc1af15541a05ec1c43785191e835146ed150b8"}, - {file = "google_cloud_iam-2.20.0.tar.gz", hash = "sha256:06568ed8313f59fac46d21a5aae4c54eb1dda9f6bcecf2736c58ab1065dc9173"}, + {file = "google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4"}, + {file = "google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3"}, ] [package.dependencies] @@ -2275,11 +2322,11 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0.dev0", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0.dev0" +proto-plus = ">=1.22.3,<2.0.0.dev0" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [[package]] name = "google-cloud-resource-manager" @@ -2335,15 +2382,15 @@ tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] [[package]] name = "google-cloud-storage" -version = "3.8.0" +version = "3.9.0" description = "Google Cloud Storage API client library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"google\" and python_version < \"3.14\"" files = [ - {file = "google_cloud_storage-3.8.0-py3-none-any.whl", hash = "sha256:78cfeae7cac2ca9441d0d0271c2eb4ebfa21aa4c6944dd0ccac0389e81d955a7"}, - {file = "google_cloud_storage-3.8.0.tar.gz", hash = "sha256:cc67952dce84ebc9d44970e24647a58260630b7b64d72360cedaf422d6727f28"}, + {file = "google_cloud_storage-3.9.0-py3-none-any.whl", hash = "sha256:2dce75a9e8b3387078cbbdad44757d410ecdb916101f8ba308abf202b6968066"}, + {file = "google_cloud_storage-3.9.0.tar.gz", hash = "sha256:f2d8ca7db2f652be757e92573b2196e10fbc09649b5c016f8b422ad593c641cc"}, ] [package.dependencies] @@ -2357,6 +2404,7 @@ requests = ">=2.22.0,<3.0.0" [package.extras] grpc = ["google-api-core[grpc] (>=2.27.0,<3.0.0)", "grpc-google-iam-v1 (>=0.14.0,<1.0.0)", "grpcio (>=1.33.2,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.76.0,<2.0.0)", "proto-plus (>=1.22.3,<2.0.0) ; python_version < \"3.13\"", "proto-plus (>=1.25.0,<2.0.0) ; python_version >= \"3.13\"", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0)"] protobuf = ["protobuf (>=3.20.2,<7.0.0)"] +testing = ["PyYAML", "black", "brotli", "coverage", "flake8", "google-cloud-iam", "google-cloud-kms", "google-cloud-pubsub", "google-cloud-testutils", "google-cloud-testutils", "mock", "numpy", "opentelemetry-sdk", "psutil", "py-cpuinfo", "pyopenssl", "pytest", "pytest-asyncio", "pytest-benchmark", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"] tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] [[package]] @@ -2410,7 +2458,7 @@ description = "GenAI Python SDK" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\" and extra == \"google\"" +markers = "extra == \"google\" and python_version == \"3.9\"" files = [ {file = "google_genai-1.47.0-py3-none-any.whl", hash = "sha256:e3851237556cbdec96007d8028b4b1f2425cdc5c099a8dc36b72a57e42821b60"}, {file = "google_genai-1.47.0.tar.gz", hash = "sha256:ecece00d0a04e6739ea76cc8dad82ec9593d9380aaabef078990e60574e5bf59"}, @@ -2432,21 +2480,21 @@ local-tokenizer = ["protobuf", "sentencepiece (>=0.2.0)"] [[package]] name = "google-genai" -version = "1.55.0" +version = "1.62.0" description = "GenAI Python SDK" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"google\"" files = [ - {file = "google_genai-1.55.0-py3-none-any.whl", hash = "sha256:98c422762b5ff6e16b8d9a1e4938e8e0ad910392a5422e47f5301498d7f373a1"}, - {file = "google_genai-1.55.0.tar.gz", hash = "sha256:ae9f1318fedb05c7c1b671a4148724751201e8908a87568364a309804064d986"}, + {file = "google_genai-1.62.0-py3-none-any.whl", hash = "sha256:4c3daeff3d05fafee4b9a1a31f9c07f01bc22051081aa58b4d61f58d16d1bcc0"}, + {file = "google_genai-1.62.0.tar.gz", hash = "sha256:709468a14c739a080bc240a4f3191df597bf64485b1ca3728e0fb67517774c18"}, ] [package.dependencies] anyio = ">=4.8.0,<5.0.0" distro = ">=1.7.0,<2" -google-auth = {version = ">=2.14.1,<3.0.0", extras = ["requests"]} +google-auth = {version = ">=2.47.0,<3.0.0", extras = ["requests"]} httpx = ">=0.28.1,<1.0.0" pydantic = ">=2.9.0,<3.0.0" requests = ">=2.28.1,<3.0.0" @@ -2553,79 +2601,66 @@ graphql-core = ">=3.2,<3.3" [[package]] name = "greenlet" -version = "3.2.4" +version = "3.3.1" description = "Lightweight in-process concurrent programming" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" +markers = "python_version >= \"3.10\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") and extra == \"mlflow\"" files = [ - {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8"}, - {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, - {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5"}, - {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, - {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d"}, - {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, - {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929"}, - {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, - {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, - {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269"}, - {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681"}, - {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, - {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be"}, - {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, - {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, - {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, + {file = "greenlet-3.3.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13"}, + {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4"}, + {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5"}, + {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1108b61b06b5224656121c3c8ee8876161c491cbe74e5c519e0634c837cf93d5"}, + {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe"}, + {file = "greenlet-3.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729"}, + {file = "greenlet-3.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4"}, + {file = "greenlet-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:7932f5f57609b6a3b82cc11877709aa7a98e3308983ed93552a1c377069b20c8"}, + {file = "greenlet-3.3.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c"}, + {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd"}, + {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5"}, + {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f"}, + {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2"}, + {file = "greenlet-3.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9"}, + {file = "greenlet-3.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f"}, + {file = "greenlet-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:32e4ca9777c5addcbf42ff3915d99030d8e00173a56f80001fb3875998fe410b"}, + {file = "greenlet-3.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:da19609432f353fed186cc1b85e9440db93d489f198b4bdf42ae19cc9d9ac9b4"}, + {file = "greenlet-3.3.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975"}, + {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36"}, + {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba"}, + {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c620051669fd04ac6b60ebc70478210119c56e2d5d5df848baec4312e260e4ca"}, + {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336"}, + {file = "greenlet-3.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1"}, + {file = "greenlet-3.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149"}, + {file = "greenlet-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cc98b9c4e4870fa983436afa999d4eb16b12872fab7071423d5262fa7120d57a"}, + {file = "greenlet-3.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bfb2d1763d777de5ee495c85309460f6fd8146e50ec9d0ae0183dbf6f0a829d1"}, + {file = "greenlet-3.3.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3"}, + {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac"}, + {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd"}, + {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e"}, + {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3"}, + {file = "greenlet-3.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951"}, + {file = "greenlet-3.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2"}, + {file = "greenlet-3.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:27289986f4e5b0edec7b5a91063c109f0276abb09a7e9bdab08437525977c946"}, + {file = "greenlet-3.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:2f080e028001c5273e0b42690eaf359aeef9cb1389da0f171ea51a5dc3c7608d"}, + {file = "greenlet-3.3.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5"}, + {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b"}, + {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e"}, + {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d"}, + {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f"}, + {file = "greenlet-3.3.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683"}, + {file = "greenlet-3.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1"}, + {file = "greenlet-3.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:96aff77af063b607f2489473484e39a0bbae730f2ea90c9e5606c9b73c44174a"}, + {file = "greenlet-3.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:b066e8b50e28b503f604fa538adc764a638b38cf8e81e025011d26e8a627fa79"}, + {file = "greenlet-3.3.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242"}, + {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774"}, + {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97"}, + {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab"}, + {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2"}, + {file = "greenlet-3.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53"}, + {file = "greenlet-3.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249"}, + {file = "greenlet-3.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:301860987846c24cb8964bdec0e31a96ad4a2a801b41b4ef40963c1b44f33451"}, + {file = "greenlet-3.3.1.tar.gz", hash = "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98"}, ] [package.extras] @@ -2652,73 +2687,73 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [[package]] name = "grpcio" -version = "1.76.0" +version = "1.78.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"}, - {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"}, - {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3"}, - {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990"}, - {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af"}, - {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2"}, - {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6"}, - {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3"}, - {file = "grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b"}, - {file = "grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b"}, - {file = "grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a"}, - {file = "grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c"}, - {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465"}, - {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48"}, - {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da"}, - {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397"}, - {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749"}, - {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00"}, - {file = "grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054"}, - {file = "grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d"}, - {file = "grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8"}, - {file = "grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280"}, - {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4"}, - {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11"}, - {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6"}, - {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8"}, - {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980"}, - {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882"}, - {file = "grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958"}, - {file = "grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347"}, - {file = "grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2"}, - {file = "grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468"}, - {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3"}, - {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb"}, - {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae"}, - {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77"}, - {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03"}, - {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42"}, - {file = "grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f"}, - {file = "grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8"}, - {file = "grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62"}, - {file = "grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd"}, - {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc"}, - {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a"}, - {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba"}, - {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09"}, - {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc"}, - {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc"}, - {file = "grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e"}, - {file = "grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e"}, - {file = "grpcio-1.76.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:8ebe63ee5f8fa4296b1b8cfc743f870d10e902ca18afc65c68cf46fd39bb0783"}, - {file = "grpcio-1.76.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:3bf0f392c0b806905ed174dcd8bdd5e418a40d5567a05615a030a5aeddea692d"}, - {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b7604868b38c1bfd5cf72d768aedd7db41d78cb6a4a18585e33fb0f9f2363fd"}, - {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e6d1db20594d9daba22f90da738b1a0441a7427552cc6e2e3d1297aeddc00378"}, - {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d099566accf23d21037f18a2a63d323075bebace807742e4b0ac210971d4dd70"}, - {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebea5cc3aa8ea72e04df9913492f9a96d9348db876f9dda3ad729cfedf7ac416"}, - {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0c37db8606c258e2ee0c56b78c62fc9dee0e901b5dbdcf816c2dd4ad652b8b0c"}, - {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ebebf83299b0cb1721a8859ea98f3a77811e35dce7609c5c963b9ad90728f886"}, - {file = "grpcio-1.76.0-cp39-cp39-win32.whl", hash = "sha256:0aaa82d0813fd4c8e589fac9b65d7dd88702555f702fb10417f96e2a2a6d4c0f"}, - {file = "grpcio-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a"}, - {file = "grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73"}, + {file = "grpcio-1.78.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:7cc47943d524ee0096f973e1081cb8f4f17a4615f2116882a5f1416e4cfe92b5"}, + {file = "grpcio-1.78.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c3f293fdc675ccba4db5a561048cca627b5e7bd1c8a6973ffedabe7d116e22e2"}, + {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10a9a644b5dd5aec3b82b5b0b90d41c0fa94c85ef42cb42cf78a23291ddb5e7d"}, + {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c5533d03a6cbd7f56acfc9cfb44ea64f63d29091e40e44010d34178d392d7eb"}, + {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff870aebe9a93a85283837801d35cd5f8814fe2ad01e606861a7fb47c762a2b7"}, + {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:391e93548644e6b2726f1bb84ed60048d4bcc424ce5e4af0843d28ca0b754fec"}, + {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:df2c8f3141f7cbd112a6ebbd760290b5849cda01884554f7c67acc14e7b1758a"}, + {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd8cb8026e5f5b50498a3c4f196f57f9db344dad829ffae16b82e4fdbaea2813"}, + {file = "grpcio-1.78.0-cp310-cp310-win32.whl", hash = "sha256:f8dff3d9777e5d2703a962ee5c286c239bf0ba173877cc68dc02c17d042e29de"}, + {file = "grpcio-1.78.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f95cf5d532d0e717eed4fc1810e8e6eded04621342ec54c89a7c2f14b581bf"}, + {file = "grpcio-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2777b783f6c13b92bd7b716667452c329eefd646bfb3f2e9dabea2e05dbd34f6"}, + {file = "grpcio-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9dca934f24c732750389ce49d638069c3892ad065df86cb465b3fa3012b70c9e"}, + {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:459ab414b35f4496138d0ecd735fed26f1318af5e52cb1efbc82a09f0d5aa911"}, + {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:082653eecbdf290e6e3e2c276ab2c54b9e7c299e07f4221872380312d8cf395e"}, + {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85f93781028ec63f383f6bc90db785a016319c561cc11151fbb7b34e0d012303"}, + {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f12857d24d98441af6a1d5c87442d624411db486f7ba12550b07788f74b67b04"}, + {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5397fff416b79e4b284959642a4e95ac4b0f1ece82c9993658e0e477d40551ec"}, + {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbe6e89c7ffb48518384068321621b2a69cab509f58e40e4399fdd378fa6d074"}, + {file = "grpcio-1.78.0-cp311-cp311-win32.whl", hash = "sha256:6092beabe1966a3229f599d7088b38dfc8ffa1608b5b5cdda31e591e6500f856"}, + {file = "grpcio-1.78.0-cp311-cp311-win_amd64.whl", hash = "sha256:1afa62af6e23f88629f2b29ec9e52ec7c65a7176c1e0a83292b93c76ca882558"}, + {file = "grpcio-1.78.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f9ab915a267fc47c7e88c387a3a28325b58c898e23d4995f765728f4e3dedb97"}, + {file = "grpcio-1.78.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3f8904a8165ab21e07e58bf3e30a73f4dffc7a1e0dbc32d51c61b5360d26f43e"}, + {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:859b13906ce098c0b493af92142ad051bf64c7870fa58a123911c88606714996"}, + {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b2342d87af32790f934a79c3112641e7b27d63c261b8b4395350dad43eff1dc7"}, + {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12a771591ae40bc65ba67048fa52ef4f0e6db8279e595fd349f9dfddeef571f9"}, + {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:185dea0d5260cbb2d224c507bf2a5444d5abbb1fa3594c1ed7e4c709d5eb8383"}, + {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51b13f9aed9d59ee389ad666b8c2214cc87b5de258fa712f9ab05f922e3896c6"}, + {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd5f135b1bd58ab088930b3c613455796dfa0393626a6972663ccdda5b4ac6ce"}, + {file = "grpcio-1.78.0-cp312-cp312-win32.whl", hash = "sha256:94309f498bcc07e5a7d16089ab984d42ad96af1d94b5a4eb966a266d9fcabf68"}, + {file = "grpcio-1.78.0-cp312-cp312-win_amd64.whl", hash = "sha256:9566fe4ababbb2610c39190791e5b829869351d14369603702e890ef3ad2d06e"}, + {file = "grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b"}, + {file = "grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a"}, + {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84"}, + {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb"}, + {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5"}, + {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9"}, + {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702"}, + {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20"}, + {file = "grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670"}, + {file = "grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4"}, + {file = "grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e"}, + {file = "grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f"}, + {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724"}, + {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b"}, + {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7"}, + {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452"}, + {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127"}, + {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65"}, + {file = "grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c"}, + {file = "grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb"}, + {file = "grpcio-1.78.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:86f85dd7c947baa707078a236288a289044836d4b640962018ceb9cd1f899af5"}, + {file = "grpcio-1.78.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:de8cb00d1483a412a06394b8303feec5dcb3b55f81d83aa216dbb6a0b86a94f5"}, + {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e888474dee2f59ff68130f8a397792d8cb8e17e6b3434339657ba4ee90845a8c"}, + {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:86ce2371bfd7f212cf60d8517e5e854475c2c43ce14aa910e136ace72c6db6c1"}, + {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0c689c02947d636bc7fab3e30cc3a3445cca99c834dfb77cd4a6cabfc1c5597"}, + {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ce7599575eeb25c0f4dc1be59cada6219f3b56176f799627f44088b21381a28a"}, + {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:684083fd383e9dc04c794adb838d4faea08b291ce81f64ecd08e4577c7398adf"}, + {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ab399ef5e3cd2a721b1038a0f3021001f19c5ab279f145e1146bb0b9f1b2b12c"}, + {file = "grpcio-1.78.0-cp39-cp39-win32.whl", hash = "sha256:f3d6379493e18ad4d39537a82371c5281e153e963cecb13f953ebac155756525"}, + {file = "grpcio-1.78.0-cp39-cp39-win_amd64.whl", hash = "sha256:5361a0630a7fdb58a6a97638ab70e1dae2893c4d08d7aba64ded28bb9e7a29df"}, + {file = "grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5"}, ] markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or extra == \"grpc\""} @@ -2726,25 +2761,25 @@ markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or extra == \ typing-extensions = ">=4.12,<5.0" [package.extras] -protobuf = ["grpcio-tools (>=1.76.0)"] +protobuf = ["grpcio-tools (>=1.78.0)"] [[package]] name = "grpcio-status" -version = "1.62.3" +version = "1.71.2" description = "Status proto mapping for gRPC" optional = true -python-versions = ">=3.6" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ - {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, - {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, + {file = "grpcio_status-1.71.2-py3-none-any.whl", hash = "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3"}, + {file = "grpcio_status-1.71.2.tar.gz", hash = "sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.3" -protobuf = ">=4.21.6" +grpcio = ">=1.71.2" +protobuf = ">=5.26.1,<6.0.dev0" [[package]] name = "gunicorn" @@ -2753,7 +2788,7 @@ description = "WSGI HTTP Server for UNIX" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"proxy\" or python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") and platform_system != \"Windows\"" +markers = "(python_version <= \"3.13\" or extra == \"mlflow\" or extra == \"proxy\") and (platform_system != \"Windows\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"mlflow\") and (python_version >= \"3.10\" or extra == \"proxy\")" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -2907,31 +2942,30 @@ files = [ [[package]] name = "huey" -version = "2.5.4" -description = "huey, a little task queue" +version = "2.6.0" +description = "a little task queue" optional = true python-versions = "*" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "huey-2.5.4-py3-none-any.whl", hash = "sha256:0eac1fb2711f6366a1db003629354a0cea470a3db720d5bab0d140c28e993f9c"}, - {file = "huey-2.5.4.tar.gz", hash = "sha256:4b7fb217b640fbb46efc4f4681b446b40726593522f093e8ef27c4a8fcb6cfbb"}, + {file = "huey-2.6.0-py3-none-any.whl", hash = "sha256:1b9df9d370b49c6d5721ba8a01ac9a787cf86b3bdc584e4679de27b920395c3f"}, + {file = "huey-2.6.0.tar.gz", hash = "sha256:8d11f8688999d65266af1425b831f6e3773e99415027177b8734b0ffd5e251f6"}, ] [package.extras] backends = ["redis (>=3.0.0)"] -redis = ["redis (>=3.0.0)"] [[package]] name = "huggingface-hub" -version = "1.1.5" +version = "1.4.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "huggingface_hub-1.1.5-py3-none-any.whl", hash = "sha256:e88ecc129011f37b868586bbcfae6c56868cae80cd56a79d61575426a3aa0d7d"}, - {file = "huggingface_hub-1.1.5.tar.gz", hash = "sha256:40ba5c9a08792d888fde6088920a0a71ab3cd9d5e6617c81a797c657f1fd9968"}, + {file = "huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18"}, + {file = "huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5"}, ] [package.dependencies] @@ -2944,13 +2978,13 @@ pyyaml = ">=5.1" shellingham = "*" tqdm = ">=4.42.1" typer-slim = "*" -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.1.0" [package.extras] all = ["Jinja2", "Pillow", "authlib (>=1.3.2)", "fastapi", "fastapi", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "numpy", "pytest (>=8.4.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures (<16.0)", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "ty", "types-PyYAML", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] dev = ["Jinja2", "Pillow", "authlib (>=1.3.2)", "fastapi", "fastapi", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "numpy", "pytest (>=8.4.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures (<16.0)", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "ty", "types-PyYAML", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -hf-xet = ["hf-xet (>=1.1.3,<2.0.0)"] +hf-xet = ["hf-xet (>=1.2.0,<2.0.0)"] mcp = ["mcp (>=1.8.0)"] oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"] quality = ["libcst (>=1.4.0)", "mypy (==1.15.0)", "ruff (>=0.9.0)", "ty"] @@ -3042,23 +3076,27 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.7.1" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, + {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=3.4)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "iniconfig" @@ -3132,140 +3170,140 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.12.0" +version = "0.13.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65"}, - {file = "jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2"}, - {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025"}, - {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca"}, - {file = "jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4"}, - {file = "jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11"}, - {file = "jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9"}, - {file = "jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725"}, - {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6"}, - {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e"}, - {file = "jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c"}, - {file = "jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f"}, - {file = "jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5"}, - {file = "jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37"}, - {file = "jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126"}, - {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9"}, - {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86"}, - {file = "jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44"}, - {file = "jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb"}, - {file = "jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789"}, - {file = "jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e"}, - {file = "jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9"}, - {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626"}, - {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c"}, - {file = "jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de"}, - {file = "jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a"}, - {file = "jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60"}, - {file = "jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6"}, - {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4"}, - {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb"}, - {file = "jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7"}, - {file = "jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3"}, - {file = "jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525"}, - {file = "jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a"}, - {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67"}, - {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b"}, - {file = "jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42"}, - {file = "jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf"}, - {file = "jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451"}, - {file = "jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783"}, - {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b"}, - {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6"}, - {file = "jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183"}, - {file = "jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873"}, - {file = "jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473"}, - {file = "jiter-0.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9d28b218d5f9e5f69a0787a196322a5056540cb378cac8ff542b4fa7219966c"}, - {file = "jiter-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0ee12028daf8cfcf880dd492349a122a64f42c059b6c62a2b0c96a83a8da820"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b135ebe757a82d67ed2821526e72d0acf87dd61f6013e20d3c45b8048af927b"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15d7fafb81af8a9e3039fc305529a61cd933eecee33b4251878a1c89859552a3"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92d1f41211d8a8fe412faad962d424d334764c01dac6691c44691c2e4d3eedaf"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a64a48d7c917b8f32f25c176df8749ecf08cec17c466114727efe7441e17f6d"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122046f3b3710b85de99d9aa2f3f0492a8233a2f54a64902b096efc27ea747b5"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:27ec39225e03c32c6b863ba879deb427882f243ae46f0d82d68b695fa5b48b40"}, - {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26b9e155ddc132225a39b1995b3b9f0fe0f79a6d5cbbeacf103271e7d309b404"}, - {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab05b7c58e29bb9e60b70c2e0094c98df79a1e42e397b9bb6eaa989b7a66dd0"}, - {file = "jiter-0.12.0-cp39-cp39-win32.whl", hash = "sha256:59f9f9df87ed499136db1c2b6c9efb902f964bed42a582ab7af413b6a293e7b0"}, - {file = "jiter-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3719596a1ebe7a48a498e8d5d0c4bf7553321d4c3eee1d620628d51351a3928"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c"}, - {file = "jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b"}, + {file = "jiter-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2ffc63785fd6c7977defe49b9824ae6ce2b2e2b77ce539bdaf006c26da06342e"}, + {file = "jiter-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a638816427006c1e3f0013eb66d391d7a3acda99a7b0cf091eff4497ccea33a"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19928b5d1ce0ff8c1ee1b9bdef3b5bfc19e8304f1b904e436caf30bc15dc6cf5"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:309549b778b949d731a2f0e1594a3f805716be704a73bf3ad9a807eed5eb5721"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcdabaea26cb04e25df3103ce47f97466627999260290349a88c8136ecae0060"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a377af27b236abbf665a69b2bdd680e3b5a0bd2af825cd3b81245279a7606c"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe49d3ff6db74321f144dff9addd4a5874d3105ac5ba7c5b77fac099cfae31ae"}, + {file = "jiter-0.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2113c17c9a67071b0f820733c0893ed1d467b5fcf4414068169e5c2cabddb1e2"}, + {file = "jiter-0.13.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab1185ca5c8b9491b55ebf6c1e8866b8f68258612899693e24a92c5fdb9455d5"}, + {file = "jiter-0.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9621ca242547edc16400981ca3231e0c91c0c4c1ab8573a596cd9bb3575d5c2b"}, + {file = "jiter-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a7637d92b1c9d7a771e8c56f445c7f84396d48f2e756e5978840ecba2fac0894"}, + {file = "jiter-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c1b609e5cbd2f52bb74fb721515745b407df26d7b800458bd97cb3b972c29e7d"}, + {file = "jiter-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ea026e70a9a28ebbdddcbcf0f1323128a8db66898a06eaad3a4e62d2f554d096"}, + {file = "jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec7e287d7fbd02cb6e22f9a00dd9c9cd504c40a61f2c61e7e1f9690a82726b4c"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47455245307e4debf2ce6c6e65a717550a0244231240dcf3b8f7d64e4c2f22f4"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee9da221dca6e0429c2704c1b3655fe7b025204a71d4d9b73390c759d776d165"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24ab43126d5e05f3d53a36a8e11eb2f23304c6c1117844aaaf9a0aa5e40b5018"}, + {file = "jiter-0.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9da38b4fedde4fb528c740c2564628fbab737166a0e73d6d46cb4bb5463ff411"}, + {file = "jiter-0.13.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b34c519e17658ed88d5047999a93547f8889f3c1824120c26ad6be5f27b6cf5"}, + {file = "jiter-0.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2a6394e6af690d462310a86b53c47ad75ac8c21dc79f120714ea449979cb1d3"}, + {file = "jiter-0.13.0-cp311-cp311-win32.whl", hash = "sha256:0f0c065695f616a27c920a56ad0d4fc46415ef8b806bf8fc1cacf25002bd24e1"}, + {file = "jiter-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:0733312953b909688ae3c2d58d043aa040f9f1a6a75693defed7bc2cc4bf2654"}, + {file = "jiter-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:5d9b34ad56761b3bf0fbe8f7e55468704107608512350962d3317ffd7a4382d5"}, + {file = "jiter-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0a2bd69fc1d902e89925fc34d1da51b2128019423d7b339a45d9e99c894e0663"}, + {file = "jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93"}, + {file = "jiter-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b88d649135aca526da172e48083da915ec086b54e8e73a425ba50999468cc08"}, + {file = "jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2"}, + {file = "jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228"}, + {file = "jiter-0.13.0-cp312-cp312-win32.whl", hash = "sha256:0bf670e3b1445fc4d31612199f1744f67f889ee1bbae703c4b54dc097e5dd394"}, + {file = "jiter-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:15db60e121e11fe186c0b15236bd5d18381b9ddacdcf4e659feb96fc6c969c92"}, + {file = "jiter-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:41f92313d17989102f3cb5dd533a02787cdb99454d494344b0361355da52fcb9"}, + {file = "jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf"}, + {file = "jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663"}, + {file = "jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa"}, + {file = "jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820"}, + {file = "jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68"}, + {file = "jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72"}, + {file = "jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc"}, + {file = "jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b"}, + {file = "jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10"}, + {file = "jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef"}, + {file = "jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6"}, + {file = "jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d"}, + {file = "jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d"}, + {file = "jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0"}, + {file = "jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad"}, + {file = "jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d"}, + {file = "jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df"}, + {file = "jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d"}, + {file = "jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6"}, + {file = "jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f"}, + {file = "jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d"}, + {file = "jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59"}, + {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe"}, + {file = "jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939"}, + {file = "jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9"}, + {file = "jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6"}, + {file = "jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8"}, + {file = "jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024"}, + {file = "jiter-0.13.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4397ee562b9f69d283e5674445551b47a5e8076fdde75e71bfac5891113dc543"}, + {file = "jiter-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f90023f8f672e13ea1819507d2d21b9d2d1c18920a3b3a5f1541955a85b5504"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed0240dd1536a98c3ab55e929c60dfff7c899fecafcb7d01161b21a99fc8c363"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6207fc61c395b26fffdcf637a0b06b4326f35bfa93c6e92fe1a166a21aeb6731"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00203f47c214156df427b5989de74cb340c65c8180d09be1bf9de81d0abad599"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c26ad6967c9dcedf10c995a21539c3aa57d4abad7001b7a84f621a263a6b605"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a576f5dce9ac7de5d350b8e2f552cf364f32975ed84717c35379a51c7cb198bd"}, + {file = "jiter-0.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b22945be8425d161f2e536cdae66da300b6b000f1c0ba3ddf237d1bfd45d21b8"}, + {file = "jiter-0.13.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6eeb7db8bc77dc20476bc2f7407a23dbe3d46d9cc664b166e3d474e1c1de4baa"}, + {file = "jiter-0.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:19cd6f85e1dc090277c3ce90a5b7d96f32127681d825e71c9dce28788e39fc0c"}, + {file = "jiter-0.13.0-cp39-cp39-win32.whl", hash = "sha256:dc3ce84cfd4fa9628fe62c4f85d0d597a4627d4242cfafac32a12cc1455d00f7"}, + {file = "jiter-0.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9ffda299e417dc83362963966c50cb76d42da673ee140de8a8ac762d4bb2378b"}, + {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b1cbfa133241d0e6bdab48dcdc2604e8ba81512f6bbd68ec3e8e1357dd3c316c"}, + {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:db367d8be9fad6e8ebbac4a7578b7af562e506211036cba2c06c3b998603c3d2"}, + {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f6f8efb2f3b0603092401dc2df79fa89ccbc027aaba4174d2d4133ed661434"}, + {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597245258e6ad085d064780abfb23a284d418d3e61c57362d9449c6c7317ee2d"}, + {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:3d744a6061afba08dd7ae375dcde870cffb14429b7477e10f67e9e6d68772a0a"}, + {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f"}, + {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59"}, + {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19"}, + {file = "jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4"}, ] [[package]] name = "jmespath" -version = "1.0.1" +version = "1.1.0" description = "JSON Matching Expressions" optional = true -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, + {file = "jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64"}, + {file = "jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d"}, ] [[package]] name = "joblib" -version = "1.5.2" +version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241"}, - {file = "joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55"}, + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, ] [[package]] @@ -3275,6 +3313,7 @@ description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version == \"3.9\"" files = [ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, @@ -3282,7 +3321,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" +jsonschema-specifications = ">=2023.3.6" referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -3290,6 +3329,29 @@ rpds-py = ">=0.7.1" format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.3.6" +referencing = ">=0.28.4" +rpds-py = ">=0.25.0" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -3444,6 +3506,93 @@ langchain = ["langchain (>=0.0.309)"] llama-index = ["llama-index (>=0.10.12,<2.0.0)"] openai = ["openai (>=0.27.8)"] +[[package]] +name = "librt" +version = "0.7.8" +description = "Mypyc runtime library" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "librt-0.7.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b45306a1fc5f53c9330fbee134d8b3227fe5da2ab09813b892790400aa49352d"}, + {file = "librt-0.7.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:864c4b7083eeee250ed55135d2127b260d7eb4b5e953a9e5df09c852e327961b"}, + {file = "librt-0.7.8-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6938cc2de153bc927ed8d71c7d2f2ae01b4e96359126c602721340eb7ce1a92d"}, + {file = "librt-0.7.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:66daa6ac5de4288a5bbfbe55b4caa7bf0cd26b3269c7a476ffe8ce45f837f87d"}, + {file = "librt-0.7.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4864045f49dc9c974dadb942ac56a74cd0479a2aafa51ce272c490a82322ea3c"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a36515b1328dc5b3ffce79fe204985ca8572525452eacabee2166f44bb387b2c"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b7e7f140c5169798f90b80d6e607ed2ba5059784968a004107c88ad61fb3641d"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff71447cb778a4f772ddc4ce360e6ba9c95527ed84a52096bd1bbf9fee2ec7c0"}, + {file = "librt-0.7.8-cp310-cp310-win32.whl", hash = "sha256:047164e5f68b7a8ebdf9fae91a3c2161d3192418aadd61ddd3a86a56cbe3dc85"}, + {file = "librt-0.7.8-cp310-cp310-win_amd64.whl", hash = "sha256:d6f254d096d84156a46a84861183c183d30734e52383602443292644d895047c"}, + {file = "librt-0.7.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3e9c11aa260c31493d4b3197d1e28dd07768594a4f92bec4506849d736248f"}, + {file = "librt-0.7.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb52499d0b3ed4aa88746aaf6f36a08314677d5c346234c3987ddc506404eac"}, + {file = "librt-0.7.8-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e9c0afebbe6ce177ae8edba0c7c4d626f2a0fc12c33bb993d163817c41a7a05c"}, + {file = "librt-0.7.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:631599598e2c76ded400c0a8722dec09217c89ff64dc54b060f598ed68e7d2a8"}, + {file = "librt-0.7.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c1ba843ae20db09b9d5c80475376168feb2640ce91cd9906414f23cc267a1ff"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b5b007bb22ea4b255d3ee39dfd06d12534de2fcc3438567d9f48cdaf67ae1ae3"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbd79caaf77a3f590cbe32dc2447f718772d6eea59656a7dcb9311161b10fa75"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:87808a8d1e0bd62a01cafc41f0fd6818b5a5d0ca0d8a55326a81643cdda8f873"}, + {file = "librt-0.7.8-cp311-cp311-win32.whl", hash = "sha256:31724b93baa91512bd0a376e7cf0b59d8b631ee17923b1218a65456fa9bda2e7"}, + {file = "librt-0.7.8-cp311-cp311-win_amd64.whl", hash = "sha256:978e8b5f13e52cf23a9e80f3286d7546baa70bc4ef35b51d97a709d0b28e537c"}, + {file = "librt-0.7.8-cp311-cp311-win_arm64.whl", hash = "sha256:20e3946863d872f7cabf7f77c6c9d370b8b3d74333d3a32471c50d3a86c0a232"}, + {file = "librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63"}, + {file = "librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93"}, + {file = "librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592"}, + {file = "librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850"}, + {file = "librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449"}, + {file = "librt-0.7.8-cp312-cp312-win32.whl", hash = "sha256:0241a6ed65e6666236ea78203a73d800dbed896cf12ae25d026d75dc1fcd1dac"}, + {file = "librt-0.7.8-cp312-cp312-win_amd64.whl", hash = "sha256:6db5faf064b5bab9675c32a873436b31e01d66ca6984c6f7f92621656033a708"}, + {file = "librt-0.7.8-cp312-cp312-win_arm64.whl", hash = "sha256:57175aa93f804d2c08d2edb7213e09276bd49097611aefc37e3fa38d1fb99ad0"}, + {file = "librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc"}, + {file = "librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2"}, + {file = "librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3"}, + {file = "librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6"}, + {file = "librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93"}, + {file = "librt-0.7.8-cp313-cp313-win32.whl", hash = "sha256:b09c52ed43a461994716082ee7d87618096851319bf695d57ec123f2ab708951"}, + {file = "librt-0.7.8-cp313-cp313-win_amd64.whl", hash = "sha256:f8f4a901a3fa28969d6e4519deceab56c55a09d691ea7b12ca830e2fa3461e34"}, + {file = "librt-0.7.8-cp313-cp313-win_arm64.whl", hash = "sha256:43d4e71b50763fcdcf64725ac680d8cfa1706c928b844794a7aa0fa9ac8e5f09"}, + {file = "librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418"}, + {file = "librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611"}, + {file = "librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758"}, + {file = "librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea"}, + {file = "librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83"}, + {file = "librt-0.7.8-cp314-cp314-win32.whl", hash = "sha256:7aa7d5457b6c542ecaed79cec4ad98534373c9757383973e638ccced0f11f46d"}, + {file = "librt-0.7.8-cp314-cp314-win_amd64.whl", hash = "sha256:3d1322800771bee4a91f3b4bd4e49abc7d35e65166821086e5afd1e6c0d9be44"}, + {file = "librt-0.7.8-cp314-cp314-win_arm64.whl", hash = "sha256:5363427bc6a8c3b1719f8f3845ea53553d301382928a86e8fab7984426949bce"}, + {file = "librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f"}, + {file = "librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca"}, + {file = "librt-0.7.8-cp314-cp314t-win32.whl", hash = "sha256:171ca3a0a06c643bd0a2f62a8944e1902c94aa8e5da4db1ea9a8daf872685365"}, + {file = "librt-0.7.8-cp314-cp314t-win_amd64.whl", hash = "sha256:445b7304145e24c60288a2f172b5ce2ca35c0f81605f5299f3fa567e189d2e32"}, + {file = "librt-0.7.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8766ece9de08527deabcd7cb1b4f1a967a385d26e33e536d6d8913db6ef74f06"}, + {file = "librt-0.7.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c7e8f88f79308d86d8f39c491773cbb533d6cb7fa6476f35d711076ee04fceb6"}, + {file = "librt-0.7.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:389bd25a0db916e1d6bcb014f11aa9676cedaa485e9ec3752dfe19f196fd377b"}, + {file = "librt-0.7.8-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73fd300f501a052f2ba52ede721232212f3b06503fa12665408ecfc9d8fd149c"}, + {file = "librt-0.7.8-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d772edc6a5f7835635c7562f6688e031f0b97e31d538412a852c49c9a6c92d5"}, + {file = "librt-0.7.8-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde8a130bd0f239e45503ab39fab239ace094d63ee1d6b67c25a63d741c0f71"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fdec6e2368ae4f796fc72fad7fd4bd1753715187e6d870932b0904609e7c878e"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:00105e7d541a8f2ee5be52caacea98a005e0478cfe78c8080fbb7b5d2b340c63"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c6f8947d3dfd7f91066c5b4385812c18be26c9d5a99ca56667547f2c39149d94"}, + {file = "librt-0.7.8-cp39-cp39-win32.whl", hash = "sha256:41d7bb1e07916aeb12ae4a44e3025db3691c4149ab788d0315781b4d29b86afb"}, + {file = "librt-0.7.8-cp39-cp39-win_amd64.whl", hash = "sha256:e90a8e237753c83b8e484d478d9a996dc5e39fd5bd4c6ce32563bc8123f132be"}, + {file = "librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862"}, +] + [[package]] name = "litellm-enterprise" version = "0.1.27" @@ -3643,68 +3792,68 @@ files = [ [[package]] name = "matplotlib" -version = "3.10.7" +version = "3.10.8" description = "Python plotting package" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380"}, - {file = "matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d"}, - {file = "matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297"}, - {file = "matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42"}, - {file = "matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7"}, - {file = "matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3"}, - {file = "matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a"}, - {file = "matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6"}, - {file = "matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a"}, - {file = "matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1"}, - {file = "matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc"}, - {file = "matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e"}, - {file = "matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9"}, - {file = "matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748"}, - {file = "matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f"}, - {file = "matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0"}, - {file = "matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695"}, - {file = "matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65"}, - {file = "matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee"}, - {file = "matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8"}, - {file = "matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f"}, - {file = "matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c"}, - {file = "matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1"}, - {file = "matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632"}, - {file = "matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84"}, - {file = "matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815"}, - {file = "matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7"}, - {file = "matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355"}, - {file = "matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b"}, - {file = "matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67"}, - {file = "matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67"}, - {file = "matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84"}, - {file = "matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2"}, - {file = "matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf"}, - {file = "matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100"}, - {file = "matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f"}, - {file = "matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715"}, - {file = "matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1"}, - {file = "matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722"}, - {file = "matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866"}, - {file = "matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb"}, - {file = "matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1"}, - {file = "matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4"}, - {file = "matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318"}, - {file = "matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca"}, - {file = "matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc"}, - {file = "matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8"}, - {file = "matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c"}, - {file = "matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537"}, - {file = "matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657"}, - {file = "matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b"}, - {file = "matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0"}, - {file = "matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68"}, - {file = "matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91"}, - {file = "matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, ] [package.dependencies] @@ -3735,15 +3884,15 @@ files = [ [[package]] name = "mcp" -version = "1.25.0" +version = "1.26.0" description = "Model Context Protocol SDK" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "mcp-1.25.0-py3-none-any.whl", hash = "sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a"}, - {file = "mcp-1.25.0.tar.gz", hash = "sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802"}, + {file = "mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca"}, + {file = "mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66"}, ] [package.dependencies] @@ -3810,9 +3959,9 @@ files = [ [package.dependencies] numpy = [ + {version = ">1.20"}, {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, - {version = ">1.20"}, {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, ] @@ -3821,15 +3970,15 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] [[package]] name = "mlflow" -version = "3.6.0" +version = "3.9.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow-3.6.0-py3-none-any.whl", hash = "sha256:04d1691facd412be8e61b963fad859286cfeb2dbcafaea294e6aa0b83a15fc04"}, - {file = "mlflow-3.6.0.tar.gz", hash = "sha256:d945d259b5c6b551a9f26846db8979fd84c78114a027b77ada3298f821a9b0e1"}, + {file = "mlflow-3.9.0-py3-none-any.whl", hash = "sha256:280f94854e5ece42fc5538180b276661c62dbfb2c848a98e8873e78915379ac6"}, + {file = "mlflow-3.9.0.tar.gz", hash = "sha256:47a41fa22107b0ceee1f91e2184759ebfaffa31d7913b70318b78fb5369e52ec"}, ] [package.dependencies] @@ -3840,15 +3989,16 @@ Flask = "<4" Flask-CORS = "<7" graphene = "<4" gunicorn = {version = "<24", markers = "platform_system != \"Windows\""} -huey = ">=2.5.0,<3" +huey = ">=2.5.4,<3" matplotlib = "<4" -mlflow-skinny = "3.6.0" -mlflow-tracing = "3.6.0" +mlflow-skinny = "3.9.0" +mlflow-tracing = "3.9.0" numpy = "<3" pandas = "<3" pyarrow = ">=4.0.0,<23" scikit-learn = "<2" scipy = "<2" +skops = "<1" sqlalchemy = ">=1.4.0,<3" waitress = {version = "<4", markers = "platform_system == \"Windows\""} @@ -3856,26 +4006,27 @@ waitress = {version = "<4", markers = "platform_system == \"Windows\""} aliyun-oss = ["aliyunstoreplugin"] auth = ["Flask-WTF (<2)"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"] +db = ["PyMySQL", "psycopg2-binary", "pymssql"] extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "litellm (>=1.0.0,<2)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.3.7,<=0.3.27)"] -mcp = ["fastmcp (>=2.0.0,<3)"] +langchain = ["langchain (>=0.3.15,<=1.2.3)"] +mcp = ["click (!=8.3.0)", "fastmcp (>=2.0.0,<3)"] mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"] sqlserver = ["mlflow-dbstore"] [[package]] name = "mlflow-skinny" -version = "3.6.0" +version = "3.9.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow_skinny-3.6.0-py3-none-any.whl", hash = "sha256:c83b34fce592acb2cc6bddcb507587a6d9ef3f590d9e7a8658c85e0980596d78"}, - {file = "mlflow_skinny-3.6.0.tar.gz", hash = "sha256:cc04706b5b6faace9faf95302a6e04119485e1bfe98ddc9b85b81984e80944b6"}, + {file = "mlflow_skinny-3.9.0-py3-none-any.whl", hash = "sha256:9b98706cdf9e07a61da7fbcd717c8d35ac89c76e084d25aafdbc150028e832d5"}, + {file = "mlflow_skinny-3.9.0.tar.gz", hash = "sha256:0598e0635dd1af9d195fb429210819aa4b56e9d6014f87134241f2325d57a290"}, ] [package.dependencies] @@ -3903,26 +4054,27 @@ uvicorn = "<1" aliyun-oss = ["aliyunstoreplugin"] auth = ["Flask-WTF (<2)"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"] +db = ["PyMySQL", "psycopg2-binary", "pymssql"] extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "litellm (>=1.0.0,<2)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.3.7,<=0.3.27)"] -mcp = ["fastmcp (>=2.0.0,<3)"] +langchain = ["langchain (>=0.3.15,<=1.2.3)"] +mcp = ["click (!=8.3.0)", "fastmcp (>=2.0.0,<3)"] mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"] sqlserver = ["mlflow-dbstore"] [[package]] name = "mlflow-tracing" -version = "3.6.0" +version = "3.9.0" description = "MLflow Tracing SDK is an open-source, lightweight Python package that only includes the minimum set of dependencies and functionality to instrument your code/models/agents with MLflow Tracing." optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow_tracing-3.6.0-py3-none-any.whl", hash = "sha256:a68ff03ba5129c67dc98e6871e0d5ef512dd3ee66d01e1c1a0c946c08a6d4755"}, - {file = "mlflow_tracing-3.6.0.tar.gz", hash = "sha256:ccff80b3aad6caa18233c98ba69922a91a6f914e0a13d12e1977af7523523d4c"}, + {file = "mlflow_tracing-3.9.0-py3-none-any.whl", hash = "sha256:93df8df0697303ad3135df6228934e5d9d2f264d2683b97a6f06ad865ec418a0"}, + {file = "mlflow_tracing-3.9.0.tar.gz", hash = "sha256:3a0676e6f362712299d191108a5cbcd596f6d84f23f050dfbf80161e245d456c"}, ] [package.dependencies] @@ -3946,6 +4098,7 @@ files = [ {file = "msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1"}, {file = "msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] cryptography = ">=2.5,<49" @@ -3966,6 +4119,7 @@ files = [ {file = "msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca"}, {file = "msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4"}, ] +markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} [package.dependencies] msal = ">=1.29,<2" @@ -3975,158 +4129,158 @@ portalocker = ["portalocker (>=1.4,<4)"] [[package]] name = "multidict" -version = "6.7.0" +version = "6.7.1" description = "multidict implementation" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, - {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, - {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, - {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, - {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, - {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, - {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, - {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, - {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, - {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, - {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, - {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, - {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, - {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, - {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, - {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, - {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, - {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, - {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, - {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, - {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, - {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, - {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, - {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, - {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, - {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, - {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505"}, + {file = "multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122"}, + {file = "multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df"}, + {file = "multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa"}, + {file = "multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a"}, + {file = "multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b"}, + {file = "multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba"}, + {file = "multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511"}, + {file = "multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19"}, + {file = "multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33"}, + {file = "multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3"}, + {file = "multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5"}, + {file = "multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108"}, + {file = "multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32"}, + {file = "multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8"}, + {file = "multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b"}, + {file = "multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d"}, + {file = "multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f"}, + {file = "multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2"}, + {file = "multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7"}, + {file = "multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5"}, + {file = "multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65573858d27cdeaca41893185677dc82395159aa28875a8867af66532d413a8f"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c524c6fb8fc342793708ab111c4dbc90ff9abd568de220432500e47e990c0358"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa23b001d968faef416ff70dc0f1ab045517b9b42a90edd3e9bcdb06479e31d5"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6704fa2b7453b2fb121740555fa1ee20cd98c4d011120caf4d2b8d4e7c76eec0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:121a34e5bfa410cdf2c8c49716de160de3b1dbcd86b49656f5681e4543bcd1a8"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:026d264228bcd637d4e060844e39cdc60f86c479e463d49075dedc21b18fbbe0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e697826df7eb63418ee190fd06ce9f1803593bb4b9517d08c60d9b9a7f69d8f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb08271280173720e9fea9ede98e5231defcbad90f1624bea26f32ec8a956e2f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6b3228e1d80af737b72925ce5fb4daf5a335e49cd7ab77ed7b9fdfbf58c526e"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3943debf0fbb57bdde5901695c11094a9a36723e5c03875f87718ee15ca2f4d2"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:98c5787b0a0d9a41d9311eae44c3b76e6753def8d8870ab501320efe75a6a5f8"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08ccb2a6dc72009093ebe7f3f073e5ec5964cba9a706fa94b1a1484039b87941"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb351f72c26dc9abe338ca7294661aa22969ad8ffe7ef7d5541d19f368dc854a"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ac1c665bad8b5d762f5f85ebe4d94130c26965f11de70c708c75671297c776de"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fa6609d0364f4f6f58351b4659a1f3e0e898ba2a8c5cac04cb2c7bc556b0bc5"}, + {file = "multidict-6.7.1-cp39-cp39-win32.whl", hash = "sha256:6f77ce314a29263e67adadc7e7c1bc699fcb3a305059ab973d038f87caa42ed0"}, + {file = "multidict-6.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:f537b55778cd3cbee430abe3131255d3a78202e0f9ea7ffc6ada893a4bcaeea4"}, + {file = "multidict-6.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:749aa54f578f2e5f439538706a475aa844bfa8ef75854b1401e6e528e4937cf9"}, + {file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"}, + {file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"}, ] [package.dependencies] @@ -4134,53 +4288,54 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy" -version = "1.18.2" +version = "1.19.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, - {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, - {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, - {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, - {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, - {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, - {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, - {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, - {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, - {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, - {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, - {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, - {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, - {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, - {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, - {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, - {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, - {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, - {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, - {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, - {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, - {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, - {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, - {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, - {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, - {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, - {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, - {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, - {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, - {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, - {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, - {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, - {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, - {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, - {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, - {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, - {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, - {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, + {file = "mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec"}, + {file = "mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74"}, + {file = "mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1"}, + {file = "mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331"}, + {file = "mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925"}, + {file = "mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8"}, + {file = "mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a"}, + {file = "mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef"}, + {file = "mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75"}, + {file = "mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045"}, + {file = "mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957"}, + {file = "mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e"}, + {file = "mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376"}, + {file = "mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24"}, + {file = "mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247"}, + {file = "mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba"}, ] [package.dependencies] +librt = {version = ">=0.6.2", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=0.9.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -4207,15 +4362,16 @@ files = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["main", "proxy-dev"] files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, + {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, + {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] +markers = {main = "extra == \"extra-proxy\""} [[package]] name = "numpy" @@ -4224,7 +4380,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version >= \"3.10\" or extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\") and python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or extra == \"mlflow\")" +markers = "python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or python_version >= \"3.10\") and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\")" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -4266,87 +4422,85 @@ files = [ [[package]] name = "numpy" -version = "2.3.5" +version = "2.4.2" description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"google\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\" or extra == \"google\")" +markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\")" files = [ - {file = "numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10"}, - {file = "numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218"}, - {file = "numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d"}, - {file = "numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5"}, - {file = "numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7"}, - {file = "numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4"}, - {file = "numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e"}, - {file = "numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748"}, - {file = "numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c"}, - {file = "numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c"}, - {file = "numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa"}, - {file = "numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e"}, - {file = "numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769"}, - {file = "numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5"}, - {file = "numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4"}, - {file = "numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d"}, - {file = "numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28"}, - {file = "numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b"}, - {file = "numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c"}, - {file = "numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952"}, - {file = "numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa"}, - {file = "numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013"}, - {file = "numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff"}, - {file = "numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188"}, - {file = "numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0"}, - {file = "numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903"}, - {file = "numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d"}, - {file = "numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017"}, - {file = "numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf"}, - {file = "numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce"}, - {file = "numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e"}, - {file = "numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b"}, - {file = "numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae"}, - {file = "numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd"}, - {file = "numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f"}, - {file = "numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a"}, - {file = "numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139"}, - {file = "numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e"}, - {file = "numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9"}, - {file = "numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946"}, - {file = "numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1"}, - {file = "numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3"}, - {file = "numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234"}, - {file = "numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7"}, - {file = "numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82"}, - {file = "numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0"}, - {file = "numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63"}, - {file = "numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9"}, - {file = "numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b"}, - {file = "numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520"}, - {file = "numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c"}, - {file = "numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8"}, - {file = "numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248"}, - {file = "numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e"}, - {file = "numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2"}, - {file = "numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41"}, - {file = "numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad"}, - {file = "numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39"}, - {file = "numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20"}, - {file = "numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52"}, - {file = "numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b"}, - {file = "numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3"}, - {file = "numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227"}, - {file = "numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5"}, - {file = "numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf"}, - {file = "numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7"}, - {file = "numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425"}, - {file = "numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, + {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, + {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, + {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, + {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, + {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, + {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, + {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, + {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, + {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, + {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, + {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, + {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, + {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, + {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, + {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, + {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, + {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, + {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, + {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, ] [[package]] @@ -4356,7 +4510,7 @@ description = "Sphinx extension to support docstrings in Numpy format" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"utils\"" +markers = "python_version == \"3.9\" and extra == \"utils\"" files = [ {file = "numpydoc-1.9.0-py3-none-any.whl", hash = "sha256:8a2983b2d62bfd0a8c470c7caa25e7e0c3d163875cdec12a8a1034020a9d1135"}, {file = "numpydoc-1.9.0.tar.gz", hash = "sha256:5fec64908fe041acc4b3afc2a32c49aab1540cf581876f5563d68bb129e27c5b"}, @@ -4366,6 +4520,23 @@ files = [ sphinx = ">=6" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +[[package]] +name = "numpydoc" +version = "1.10.0" +description = "Sphinx extension to support docstrings in Numpy format" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"utils\"" +files = [ + {file = "numpydoc-1.10.0-py3-none-any.whl", hash = "sha256:3149da9874af890bcc2a82ef7aae5484e5aa81cb2778f08e3c307ba6d963721b"}, + {file = "numpydoc-1.10.0.tar.gz", hash = "sha256:3f7970f6eee30912260a6b31ac72bba2432830cd6722569ec17ee8d3ef5ffa01"}, +] + +[package.dependencies] +sphinx = ">=6" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "oauthlib" version = "3.3.1" @@ -4386,14 +4557,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "2.8.1" +version = "2.17.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "openai-2.8.1-py3-none-any.whl", hash = "sha256:c6c3b5a04994734386e8dad3c00a393f56d3b68a27cd2e8acae91a59e4122463"}, - {file = "openai-2.8.1.tar.gz", hash = "sha256:cb1b79eef6e809f6da326a7ef6038719e35aa944c42d081807bfa1be8060f15f"}, + {file = "openai-2.17.0-py3-none-any.whl", hash = "sha256:4f393fd886ca35e113aac7ff239bcd578b81d8f104f5aedc7d3693eb2af1d338"}, + {file = "openai-2.17.0.tar.gz", hash = "sha256:47224b74bd20f30c6b0a6a329505243cb2f26d5cf84d9f8d0825ff8b35e9c999"}, ] [package.dependencies] @@ -4423,7 +4594,7 @@ files = [ {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] importlib-metadata = ">=6.0,<8.8.0" @@ -4538,7 +4709,7 @@ files = [ {file = "opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c"}, {file = "opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -4556,7 +4727,7 @@ files = [ {file = "opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb"}, {file = "opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953"}, ] -markers = {main = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and extra == \"mlflow\""} [package.dependencies] opentelemetry-api = "1.39.1" @@ -4564,100 +4735,185 @@ typing-extensions = ">=4.5.0" [[package]] name = "orjson" -version = "3.11.4" +version = "3.11.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"proxy\"" +markers = "python_version == \"3.9\" and extra == \"proxy\"" files = [ - {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b"}, - {file = "orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3"}, - {file = "orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc"}, - {file = "orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39"}, - {file = "orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907"}, - {file = "orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c"}, - {file = "orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a"}, - {file = "orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045"}, - {file = "orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50"}, - {file = "orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9"}, - {file = "orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa"}, - {file = "orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140"}, - {file = "orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e"}, - {file = "orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534"}, - {file = "orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6"}, - {file = "orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839"}, - {file = "orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a"}, - {file = "orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de"}, - {file = "orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803"}, - {file = "orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155"}, - {file = "orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394"}, - {file = "orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1"}, - {file = "orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d"}, - {file = "orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9"}, - {file = "orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1"}, - {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, - {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, + {file = "orjson-3.11.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:df9eadb2a6386d5ea2bfd81309c505e125cfc9ba2b1b99a97e60985b0b3665d1"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc70da619744467d8f1f49a8cadae5ec7bbe054e5232d95f92ed8737f8c5870"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:073aab025294c2f6fc0807201c76fdaed86f8fc4be52c440fb78fbb759a1ac09"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:835f26fa24ba0bb8c53ae2a9328d1706135b74ec653ed933869b74b6909e63fd"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667c132f1f3651c14522a119e4dd631fad98761fa960c55e8e7430bb2a1ba4ac"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42e8961196af655bb5e63ce6c60d25e8798cd4dfbc04f4203457fa3869322c2e"}, + {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75412ca06e20904c19170f8a24486c4e6c7887dea591ba18a1ab572f1300ee9f"}, + {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6af8680328c69e15324b5af3ae38abbfcf9cbec37b5346ebfd52339c3d7e8a18"}, + {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a86fe4ff4ea523eac8f4b57fdac319faf037d3c1be12405e6a7e86b3fbc4756a"}, + {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e607b49b1a106ee2086633167033afbd63f76f2999e9236f638b06b112b24ea7"}, + {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7339f41c244d0eea251637727f016b3d20050636695bc78345cce9029b189401"}, + {file = "orjson-3.11.5-cp310-cp310-win32.whl", hash = "sha256:8be318da8413cdbbce77b8c5fac8d13f6eb0f0db41b30bb598631412619572e8"}, + {file = "orjson-3.11.5-cp310-cp310-win_amd64.whl", hash = "sha256:b9f86d69ae822cabc2a0f6c099b43e8733dda788405cba2665595b7e8dd8d167"}, + {file = "orjson-3.11.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9c8494625ad60a923af6b2b0bd74107146efe9b55099e20d7740d995f338fcd8"}, + {file = "orjson-3.11.5-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:7bb2ce0b82bc9fd1168a513ddae7a857994b780b2945a8c51db4ab1c4b751ebc"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67394d3becd50b954c4ecd24ac90b5051ee7c903d167459f93e77fc6f5b4c968"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:298d2451f375e5f17b897794bcc3e7b821c0f32b4788b9bcae47ada24d7f3cf7"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa5e4244063db8e1d87e0f54c3f7522f14b2dc937e65d5241ef0076a096409fd"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1db2088b490761976c1b2e956d5d4e6409f3732e9d79cfa69f876c5248d1baf9"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2ed66358f32c24e10ceea518e16eb3549e34f33a9d51f99ce23b0251776a1ef"}, + {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2021afda46c1ed64d74b555065dbd4c2558d510d8cec5ea6a53001b3e5e82a9"}, + {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b42ffbed9128e547a1647a3e50bc88ab28ae9daa61713962e0d3dd35e820c125"}, + {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8d5f16195bb671a5dd3d1dbea758918bada8f6cc27de72bd64adfbd748770814"}, + {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c0e5d9f7a0227df2927d343a6e3859bebf9208b427c79bd31949abcc2fa32fa5"}, + {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:23d04c4543e78f724c4dfe656b3791b5f98e4c9253e13b2636f1af5d90e4a880"}, + {file = "orjson-3.11.5-cp311-cp311-win32.whl", hash = "sha256:c404603df4865f8e0afe981aa3c4b62b406e6d06049564d58934860b62b7f91d"}, + {file = "orjson-3.11.5-cp311-cp311-win_amd64.whl", hash = "sha256:9645ef655735a74da4990c24ffbd6894828fbfa117bc97c1edd98c282ecb52e1"}, + {file = "orjson-3.11.5-cp311-cp311-win_arm64.whl", hash = "sha256:1cbf2735722623fcdee8e712cbaaab9e372bbcb0c7924ad711b261c2eccf4a5c"}, + {file = "orjson-3.11.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:334e5b4bff9ad101237c2d799d9fd45737752929753bf4faf4b207335a416b7d"}, + {file = "orjson-3.11.5-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:ff770589960a86eae279f5d8aa536196ebda8273a2a07db2a54e82b93bc86626"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed24250e55efbcb0b35bed7caaec8cedf858ab2f9f2201f17b8938c618c8ca6f"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a66d7769e98a08a12a139049aac2f0ca3adae989817f8c43337455fbc7669b85"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86cfc555bfd5794d24c6a1903e558b50644e5e68e6471d66502ce5cb5fdef3f9"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a230065027bc2a025e944f9d4714976a81e7ecfa940923283bca7bbc1f10f626"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b29d36b60e606df01959c4b982729c8845c69d1963f88686608be9ced96dbfaa"}, + {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74099c6b230d4261fdc3169d50efc09abf38ace1a42ea2f9994b1d79153d477"}, + {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e697d06ad57dd0c7a737771d470eedc18e68dfdefcdd3b7de7f33dfda5b6212e"}, + {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e08ca8a6c851e95aaecc32bc44a5aa75d0ad26af8cdac7c77e4ed93acf3d5b69"}, + {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e8b5f96c05fce7d0218df3fdfeb962d6b8cfff7e3e20264306b46dd8b217c0f3"}, + {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ddbfdb5099b3e6ba6d6ea818f61997bb66de14b411357d24c4612cf1ebad08ca"}, + {file = "orjson-3.11.5-cp312-cp312-win32.whl", hash = "sha256:9172578c4eb09dbfcf1657d43198de59b6cef4054de385365060ed50c458ac98"}, + {file = "orjson-3.11.5-cp312-cp312-win_amd64.whl", hash = "sha256:2b91126e7b470ff2e75746f6f6ee32b9ab67b7a93c8ba1d15d3a0caaf16ec875"}, + {file = "orjson-3.11.5-cp312-cp312-win_arm64.whl", hash = "sha256:acbc5fac7e06777555b0722b8ad5f574739e99ffe99467ed63da98f97f9ca0fe"}, + {file = "orjson-3.11.5-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3b01799262081a4c47c035dd77c1301d40f568f77cc7ec1bb7db5d63b0a01629"}, + {file = "orjson-3.11.5-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:61de247948108484779f57a9f406e4c84d636fa5a59e411e6352484985e8a7c3"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:894aea2e63d4f24a7f04a1908307c738d0dce992e9249e744b8f4e8dd9197f39"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ddc21521598dbe369d83d4d40338e23d4101dad21dae0e79fa20465dbace019f"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cce16ae2f5fb2c53c3eafdd1706cb7b6530a67cc1c17abe8ec747f5cd7c0c51"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e46c762d9f0e1cfb4ccc8515de7f349abbc95b59cb5a2bd68df5973fdef913f8"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7345c759276b798ccd6d77a87136029e71e66a8bbf2d2755cbdde1d82e78706"}, + {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75bc2e59e6a2ac1dd28901d07115abdebc4563b5b07dd612bf64260a201b1c7f"}, + {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:54aae9b654554c3b4edd61896b978568c6daa16af96fa4681c9b5babd469f863"}, + {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4bdd8d164a871c4ec773f9de0f6fe8769c2d6727879c37a9666ba4183b7f8228"}, + {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a261fef929bcf98a60713bf5e95ad067cea16ae345d9a35034e73c3990e927d2"}, + {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c028a394c766693c5c9909dec76b24f37e6a1b91999e8d0c0d5feecbe93c3e05"}, + {file = "orjson-3.11.5-cp313-cp313-win32.whl", hash = "sha256:2cc79aaad1dfabe1bd2d50ee09814a1253164b3da4c00a78c458d82d04b3bdef"}, + {file = "orjson-3.11.5-cp313-cp313-win_amd64.whl", hash = "sha256:ff7877d376add4e16b274e35a3f58b7f37b362abf4aa31863dadacdd20e3a583"}, + {file = "orjson-3.11.5-cp313-cp313-win_arm64.whl", hash = "sha256:59ac72ea775c88b163ba8d21b0177628bd015c5dd060647bbab6e22da3aad287"}, + {file = "orjson-3.11.5-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e446a8ea0a4c366ceafc7d97067bfd55292969143b57e3c846d87fc701e797a0"}, + {file = "orjson-3.11.5-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:53deb5addae9c22bbe3739298f5f2196afa881ea75944e7720681c7080909a81"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd00d49d6063d2b8791da5d4f9d20539c5951f965e45ccf4e96d33505ce68f"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3fd15f9fc8c203aeceff4fda211157fad114dde66e92e24097b3647a08f4ee9e"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df95000fbe6777bf9820ae82ab7578e8662051bb5f83d71a28992f539d2cda7"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a8d676748fca47ade5bc3da7430ed7767afe51b2f8100e3cd65e151c0eaceb"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa0f513be38b40234c77975e68805506cad5d57b3dfd8fe3baa7f4f4051e15b4"}, + {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1863e75b92891f553b7922ce4ee10ed06db061e104f2b7815de80cdcb135ad"}, + {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4be86b58e9ea262617b8ca6251a2f0d63cc132a6da4b5fcc8e0a4128782c829"}, + {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b923c1c13fa02084eb38c9c065afd860a5cff58026813319a06949c3af5732ac"}, + {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1b6bd351202b2cd987f35a13b5e16471cf4d952b42a73c391cc537974c43ef6d"}, + {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb150d529637d541e6af06bbe3d02f5498d628b7f98267ff87647584293ab439"}, + {file = "orjson-3.11.5-cp314-cp314-win32.whl", hash = "sha256:9cc1e55c884921434a84a0c3dd2699eb9f92e7b441d7f53f3941079ec6ce7499"}, + {file = "orjson-3.11.5-cp314-cp314-win_amd64.whl", hash = "sha256:a4f3cb2d874e03bc7767c8f88adaa1a9a05cecea3712649c3b58589ec7317310"}, + {file = "orjson-3.11.5-cp314-cp314-win_arm64.whl", hash = "sha256:38b22f476c351f9a1c43e5b07d8b5a02eb24a6ab8e75f700f7d479d4568346a5"}, + {file = "orjson-3.11.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1b280e2d2d284a6713b0cfec7b08918ebe57df23e3f76b27586197afca3cb1e9"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d8a112b274fae8c5f0f01954cb0480137072c271f3f4958127b010dfefaec"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0a2ae6f09ac7bd47d2d5a5305c1d9ed08ac057cda55bb0a49fa506f0d2da00"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d87bd1896faac0d10b4f849016db81a63e4ec5df38757ffae84d45ab38aa71"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:801a821e8e6099b8c459ac7540b3c32dba6013437c57fdcaec205b169754f38c"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a0f6ac618c98c74b7fbc8c0172ba86f9e01dbf9f62aa0b1776c2231a7bffe5"}, + {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea7339bdd22e6f1060c55ac31b6a755d86a5b2ad3657f2669ec243f8e3b2bdb"}, + {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4dad582bc93cef8f26513e12771e76385a7e6187fd713157e971c784112aad56"}, + {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:0522003e9f7fba91982e83a97fec0708f5a714c96c4209db7104e6b9d132f111"}, + {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7403851e430a478440ecc1258bcbacbfbd8175f9ac1e39031a7121dd0de05ff8"}, + {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5f691263425d3177977c8d1dd896cde7b98d93cbf390b2544a090675e83a6a0a"}, + {file = "orjson-3.11.5-cp39-cp39-win32.whl", hash = "sha256:61026196a1c4b968e1b1e540563e277843082e9e97d78afa03eb89315af531f1"}, + {file = "orjson-3.11.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b94b947ac08586af635ef922d69dc9bc63321527a3a04647f4986a73f4bd30"}, + {file = "orjson-3.11.5.tar.gz", hash = "sha256:82393ab47b4fe44ffd0a7659fa9cfaacc717eb617c93cde83795f14af5c2e9d5"}, +] + +[[package]] +name = "orjson" +version = "3.11.7" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"proxy\"" +files = [ + {file = "orjson-3.11.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a02c833f38f36546ba65a452127633afce4cf0dd7296b753d3bb54e55e5c0174"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63c6e6738d7c3470ad01601e23376aa511e50e1f3931395b9f9c722406d1a67"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043d3006b7d32c7e233b8cfb1f01c651013ea079e08dcef7189a29abd8befe11"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57036b27ac8a25d81112eb0cc9835cd4833c5b16e1467816adc0015f59e870dc"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:733ae23ada68b804b222c44affed76b39e30806d38660bf1eb200520d259cc16"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fdfad2093bdd08245f2e204d977facd5f871c88c4a71230d5bcbd0e43bf6222"}, + {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cededd6738e1c153530793998e31c05086582b08315db48ab66649768f326baa"}, + {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:14f440c7268c8f8633d1b3d443a434bd70cb15686117ea6beff8fdc8f5917a1e"}, + {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3a2479753bbb95b0ebcf7969f562cdb9668e6d12416a35b0dda79febf89cdea2"}, + {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:71924496986275a737f38e3f22b4e0878882b3f7a310d2ff4dc96e812789120c"}, + {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4a9eefdc70bf8bf9857f0290f973dec534ac84c35cd6a7f4083be43e7170a8f"}, + {file = "orjson-3.11.7-cp310-cp310-win32.whl", hash = "sha256:ae9e0b37a834cef7ce8f99de6498f8fad4a2c0bf6bfc3d02abd8ed56aa15b2de"}, + {file = "orjson-3.11.7-cp310-cp310-win_amd64.whl", hash = "sha256:d772afdb22555f0c58cfc741bdae44180122b3616faa1ecadb595cd526e4c993"}, + {file = "orjson-3.11.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9487abc2c2086e7c8eb9a211d2ce8855bae0e92586279d0d27b341d5ad76c85c"}, + {file = "orjson-3.11.7-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:79cacb0b52f6004caf92405a7e1f11e6e2de8bdf9019e4f76b44ba045125cd6b"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e85fe4698b6a56d5e2ebf7ae87544d668eb6bde1ad1226c13f44663f20ec9e"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8d14b71c0b12963fe8a62aac87119f1afdf4cb88a400f61ca5ae581449efcb5"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91c81ef070c8f3220054115e1ef468b1c9ce8497b4e526cb9f68ab4dc0a7ac62"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:411ebaf34d735e25e358a6d9e7978954a9c9d58cfb47bc6683cdc3964cd2f910"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a16bcd08ab0bcdfc7e8801d9c4a9cc17e58418e4d48ddc6ded4e9e4b1a94062b"}, + {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0b51672e466fd7e56230ffbae7f1639e18d0ce023351fb75da21b71bc2c960"}, + {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:136dcd6a2e796dfd9ffca9fc027d778567b0b7c9968d092842d3c323cef88aa8"}, + {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ba61079379b0ae29e117db13bda5f28d939766e410d321ec1624afc6a0b0504"}, + {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0527a4510c300e3b406591b0ba69b5dc50031895b0a93743526a3fc45f59d26e"}, + {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a709e881723c9b18acddcfb8ba357322491ad553e277cf467e1e7e20e2d90561"}, + {file = "orjson-3.11.7-cp311-cp311-win32.whl", hash = "sha256:c43b8b5bab288b6b90dac410cca7e986a4fa747a2e8f94615aea407da706980d"}, + {file = "orjson-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:6543001328aa857187f905308a028935864aefe9968af3848401b6fe80dbb471"}, + {file = "orjson-3.11.7-cp311-cp311-win_arm64.whl", hash = "sha256:1ee5cc7160a821dfe14f130bc8e63e7611051f964b463d9e2a3a573204446a4d"}, + {file = "orjson-3.11.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd03ea7606833655048dab1a00734a2875e3e86c276e1d772b2a02556f0d895f"}, + {file = "orjson-3.11.7-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:89e440ebc74ce8ab5c7bc4ce6757b4a6b1041becb127df818f6997b5c71aa60b"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ede977b5fe5ac91b1dffc0a517ca4542d2ec8a6a4ff7b2652d94f640796342a"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b1dae39230a393df353827c855a5f176271c23434cfd2db74e0e424e693e10"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed46f17096e28fb28d2975834836a639af7278aa87c84f68ab08fbe5b8bd75fa"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3726be79e36e526e3d9c1aceaadbfb4a04ee80a72ab47b3f3c17fefb9812e7b8"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0724e265bc548af1dedebd9cb3d24b4e1c1e685a343be43e87ba922a5c5fff2f"}, + {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7745312efa9e11c17fbd3cb3097262d079da26930ae9ae7ba28fb738367cbad"}, + {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f904c24bdeabd4298f7a977ef14ca2a022ca921ed670b92ecd16ab6f3d01f867"}, + {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b9fc4d0f81f394689e0814617aadc4f2ea0e8025f38c226cbf22d3b5ddbf025d"}, + {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:849e38203e5be40b776ed2718e587faf204d184fc9a008ae441f9442320c0cab"}, + {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4682d1db3bcebd2b64757e0ddf9e87ae5f00d29d16c5cdf3a62f561d08cc3dd2"}, + {file = "orjson-3.11.7-cp312-cp312-win32.whl", hash = "sha256:f4f7c956b5215d949a1f65334cf9d7612dde38f20a95f2315deef167def91a6f"}, + {file = "orjson-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:bf742e149121dc5648ba0a08ea0871e87b660467ef168a3a5e53bc1fbd64bb74"}, + {file = "orjson-3.11.7-cp312-cp312-win_arm64.whl", hash = "sha256:26c3b9132f783b7d7903bf1efb095fed8d4a3a85ec0d334ee8beff3d7a4749d5"}, + {file = "orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733"}, + {file = "orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705"}, + {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace"}, + {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b"}, + {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157"}, + {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3"}, + {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223"}, + {file = "orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3"}, + {file = "orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757"}, + {file = "orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539"}, + {file = "orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0"}, + {file = "orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e"}, + {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1"}, + {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183"}, + {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650"}, + {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141"}, + {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2"}, + {file = "orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576"}, + {file = "orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1"}, + {file = "orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d"}, + {file = "orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49"}, ] [[package]] @@ -4775,116 +5031,122 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, ] +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + [[package]] name = "pillow" -version = "12.0.0" +version = "12.1.0" description = "Python Imaging Library (fork)" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b"}, - {file = "pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782"}, - {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10"}, - {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa"}, - {file = "pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275"}, - {file = "pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d"}, - {file = "pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7"}, - {file = "pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc"}, - {file = "pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227"}, - {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b"}, - {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e"}, - {file = "pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739"}, - {file = "pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e"}, - {file = "pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d"}, - {file = "pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371"}, - {file = "pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8"}, - {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79"}, - {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba"}, - {file = "pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0"}, - {file = "pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a"}, - {file = "pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399"}, - {file = "pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5"}, - {file = "pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344"}, - {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27"}, - {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79"}, - {file = "pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098"}, - {file = "pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905"}, - {file = "pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a"}, - {file = "pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3"}, - {file = "pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe"}, - {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee"}, - {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef"}, - {file = "pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9"}, - {file = "pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b"}, - {file = "pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a"}, - {file = "pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b"}, - {file = "pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e"}, - {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9"}, - {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab"}, - {file = "pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b"}, - {file = "pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b"}, - {file = "pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0"}, - {file = "pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6"}, - {file = "pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925"}, - {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8"}, - {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4"}, - {file = "pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52"}, - {file = "pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a"}, - {file = "pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5"}, - {file = "pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353"}, + {file = "pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd"}, + {file = "pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef"}, + {file = "pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09"}, + {file = "pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91"}, + {file = "pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18"}, + {file = "pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64"}, + {file = "pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75"}, + {file = "pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616"}, + {file = "pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7"}, + {file = "pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d"}, + {file = "pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c"}, + {file = "pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171"}, + {file = "pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a"}, + {file = "pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b"}, + {file = "pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65"}, + {file = "pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0"}, + {file = "pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a"}, + {file = "pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030"}, + {file = "pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94"}, + {file = "pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef"}, + {file = "pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988"}, + {file = "pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6"}, + {file = "pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19"}, + {file = "pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9"}, ] [package.extras] @@ -4915,15 +5177,15 @@ type = ["mypy (>=1.14.1)"] [[package]] name = "platformdirs" -version = "4.5.0" +version = "4.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, - {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, + {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, + {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, ] [package.extras] @@ -4949,19 +5211,19 @@ testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "1.35.2" +version = "1.38.0" description = "Blazingly fast DataFrame library" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "polars-1.35.2-py3-none-any.whl", hash = "sha256:5e8057c8289ac148c793478323b726faea933d9776bd6b8a554b0ab7c03db87e"}, - {file = "polars-1.35.2.tar.gz", hash = "sha256:ae458b05ca6e7ca2c089342c70793f92f1103c502dc1b14b56f0a04f2cc1d205"}, + {file = "polars-1.38.0-py3-none-any.whl", hash = "sha256:d7a31b47da8c9522aa38908c46ac72eab8eaf0c992e024f9c95fedba4cbe7759"}, + {file = "polars-1.38.0.tar.gz", hash = "sha256:4dee569944c613d8c621eb709e452354e1570bd3d47ccb2d3d36681fb1bd2cf6"}, ] [package.dependencies] -polars-runtime-32 = "1.35.2" +polars-runtime-32 = "1.38.0" [package.extras] adbc = ["adbc-driver-manager[dbapi]", "adbc-driver-sqlite[dbapi]"] @@ -4981,11 +5243,11 @@ numpy = ["numpy (>=1.16.0)"] openpyxl = ["openpyxl (>=3.0.0)"] pandas = ["pandas", "polars[pyarrow]"] plot = ["altair (>=5.4.0)"] -polars-cloud = ["polars_cloud (>=0.0.1a1)"] +polars-cloud = ["polars_cloud (>=0.4.0)"] pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] -rt64 = ["polars-runtime-64 (==1.35.2)"] -rtcompat = ["polars-runtime-compat (==1.35.2)"] +rt64 = ["polars-runtime-64 (==1.38.0)"] +rtcompat = ["polars-runtime-compat (==1.38.0)"] sqlalchemy = ["polars[pandas]", "sqlalchemy"] style = ["great-tables (>=0.8.0)"] timezone = ["tzdata ; platform_system == \"Windows\""] @@ -4994,22 +5256,43 @@ xlsxwriter = ["xlsxwriter"] [[package]] name = "polars-runtime-32" -version = "1.35.2" +version = "1.38.0" description = "Blazingly fast DataFrame library" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "polars_runtime_32-1.35.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e465d12a29e8df06ea78947e50bd361cdf77535cd904fd562666a8a9374e7e3a"}, - {file = "polars_runtime_32-1.35.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ef2b029b78f64fb53f126654c0bfa654045c7546bd0de3009d08bd52d660e8cc"}, - {file = "polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85dda0994b5dff7f456bb2f4bbd22be9a9e5c5e28670e23fedb13601ec99a46d"}, - {file = "polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:3b9006902fc51b768ff747c0f74bd4ce04005ee8aeb290ce9c07ce1cbe1b58a9"}, - {file = "polars_runtime_32-1.35.2-cp39-abi3-win_amd64.whl", hash = "sha256:ddc015fac39735592e2e7c834c02193ba4d257bb4c8c7478b9ebe440b0756b84"}, - {file = "polars_runtime_32-1.35.2-cp39-abi3-win_arm64.whl", hash = "sha256:6861145aa321a44eda7cc6694fb7751cb7aa0f21026df51b5faa52e64f9dc39b"}, - {file = "polars_runtime_32-1.35.2.tar.gz", hash = "sha256:6e6e35733ec52abe54b7d30d245e6586b027d433315d20edfb4a5d162c79fe90"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:03f43c10a419837b89a493e946090cdaee08ce50a8d1933f2e8ac3a6874d7db4"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d664e53cba734e9fbed87d1c33078a13b5fc39b3e8790318fc65fa78954ea2d0"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c073c7b7e6e559769e10cdadbafce86d32b0709d5790de920081c6129acae507"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8806ddb684b17ae8b0bcb91d8d5ba361b04b0a31d77ce7f861d16b47734b3012"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c7b41163189bd3305fe2307e66fe478b35c4faa467777d74c32b70b52292039b"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e944f924a99750909299fa701edb07a63a5988e5ee58d673993f3d9147a22276"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-win_amd64.whl", hash = "sha256:46fbfb4ee6f8e1914dc0babfb6a138ead552db05a2d9e531c1fb19411b1a6744"}, + {file = "polars_runtime_32-1.38.0-cp310-abi3-win_arm64.whl", hash = "sha256:ed0e6d7a546de9179e5715bffe9d3b94ba658d5655bbbf44943e138e061dcc90"}, + {file = "polars_runtime_32-1.38.0.tar.gz", hash = "sha256:69ba986bff34f70d7eab931005e5d81dd4dc6c5c12e3532a4bd0fc7022671692"}, ] +[[package]] +name = "prettytable" +version = "3.17.0" +description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"mlflow\"" +files = [ + {file = "prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287"}, + {file = "prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0"}, +] + +[package.dependencies] +wcwidth = "*" + +[package.extras] +tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] + [[package]] name = "priority" version = "2.0.0" @@ -5033,6 +5316,7 @@ files = [ {file = "prisma-0.11.0-py3-none-any.whl", hash = "sha256:22bb869e59a2968b99f3483bb417717273ffbc569fd1e9ceed95e5614cbaf53a"}, {file = "prisma-0.11.0.tar.gz", hash = "sha256:3f2f2fd2361e1ec5ff655f2a04c7860c2f2a5bc4c91f78ca9c5c6349735bf693"}, ] +markers = {main = "extra == \"extra-proxy\""} [package.dependencies] click = ">=7.1.2" @@ -5197,15 +5481,15 @@ files = [ [[package]] name = "proto-plus" -version = "1.26.1" +version = "1.27.1" description = "Beautiful, Pythonic protocol buffers" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"extra-proxy\" or extra == \"google\"" +markers = "extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, - {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, + {file = "proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc"}, + {file = "proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147"}, ] [package.dependencies] @@ -5216,23 +5500,23 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.29.5" +version = "5.29.6" description = "" optional = false python-versions = ">=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, - {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, - {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, - {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, - {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, - {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, - {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, - {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, - {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, + {file = "protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1"}, + {file = "protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda"}, + {file = "protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9"}, + {file = "protobuf-5.29.6-cp38-cp38-win32.whl", hash = "sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05"}, + {file = "protobuf-5.29.6-cp38-cp38-win_amd64.whl", hash = "sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6"}, + {file = "protobuf-5.29.6-cp39-cp39-win32.whl", hash = "sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49"}, + {file = "protobuf-5.29.6-cp39-cp39-win_amd64.whl", hash = "sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18"}, + {file = "protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86"}, + {file = "protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723"}, ] markers = {main = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\""} @@ -5299,15 +5583,15 @@ files = [ [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.6.2" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = true python-versions = ">=3.8" groups = ["main"] markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, + {file = "pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf"}, + {file = "pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b"}, ] [[package]] @@ -5349,18 +5633,31 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} +markers = {main = "python_version == \"3.9\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and implementation_name != \"PyPy\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\")", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\" and python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\" and platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} + +[[package]] +name = "pycparser" +version = "3.0" +description = "C parser in Python" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev", "proxy-dev"] +files = [ + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, +] +markers = {main = "python_version >= \"3.10\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and implementation_name != \"PyPy\"", dev = "python_version >= \"3.10\" and implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "python_version >= \"3.10\" and implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" -version = "2.12.4" +version = "2.12.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, - {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, + {file = "pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d"}, + {file = "pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49"}, ] [package.dependencies] @@ -5563,61 +5860,60 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.11.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["main", "proxy-dev"] files = [ - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, + {file = "pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469"}, + {file = "pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623"}, ] +markers = {main = "extra == \"extra-proxy\" or extra == \"proxy\""} [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==7.10.7)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=8.4.2,<9.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +tests = ["coverage[toml] (==7.10.7)", "pytest (>=8.4.2,<9.0.0)"] [[package]] name = "pynacl" -version = "1.6.1" +version = "1.6.2" description = "Python binding to the Networking and Cryptography (NaCl) library" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "pynacl-1.6.1-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:7d7c09749450c385301a3c20dca967a525152ae4608c0a096fe8464bfc3df93d"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc734c1696ffd49b40f7c1779c89ba908157c57345cf626be2e0719488a076d3"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cd787ec1f5c155dc8ecf39b1333cfef41415dc96d392f1ce288b4fe970df489"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b35d93ab2df03ecb3aa506be0d3c73609a51449ae0855c2e89c7ed44abde40b"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dece79aecbb8f4640a1adbb81e4aa3bfb0e98e99834884a80eb3f33c7c30e708"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c2228054f04bf32d558fb89bb99f163a8197d5a9bf4efa13069a7fa8d4b93fc3"}, - {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:2b12f1b97346f177affcdfdc78875ff42637cb40dcf79484a97dae3448083a78"}, - {file = "pynacl-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e735c3a1bdfde3834503baf1a6d74d4a143920281cb724ba29fb84c9f49b9c48"}, - {file = "pynacl-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3384a454adf5d716a9fadcb5eb2e3e72cd49302d1374a60edc531c9957a9b014"}, - {file = "pynacl-1.6.1-cp314-cp314t-win32.whl", hash = "sha256:d8615ee34d01c8e0ab3f302dcdd7b32e2bcf698ba5f4809e7cc407c8cdea7717"}, - {file = "pynacl-1.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5f5b35c1a266f8a9ad22525049280a600b19edd1f785bccd01ae838437dcf935"}, - {file = "pynacl-1.6.1-cp314-cp314t-win_arm64.whl", hash = "sha256:d984c91fe3494793b2a1fb1e91429539c6c28e9ec8209d26d25041ec599ccf63"}, - {file = "pynacl-1.6.1-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:a6f9fd6d6639b1e81115c7f8ff16b8dedba1e8098d2756275d63d208b0e32021"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e49a3f3d0da9f79c1bec2aa013261ab9fa651c7da045d376bd306cf7c1792993"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7713f8977b5d25f54a811ec9efa2738ac592e846dd6e8a4d3f7578346a841078"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a3becafc1ee2e5ea7f9abc642f56b82dcf5be69b961e782a96ea52b55d8a9fc"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ce50d19f1566c391fedc8dc2f2f5be265ae214112ebe55315e41d1f36a7f0a9"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:543f869140f67d42b9b8d47f922552d7a967e6c116aad028c9bfc5f3f3b3a7b7"}, - {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a2bb472458c7ca959aeeff8401b8efef329b0fc44a89d3775cffe8fad3398ad8"}, - {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3206fa98737fdc66d59b8782cecc3d37d30aeec4593d1c8c145825a345bba0f0"}, - {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:53543b4f3d8acb344f75fd4d49f75e6572fce139f4bfb4815a9282296ff9f4c0"}, - {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:319de653ef84c4f04e045eb250e6101d23132372b0a61a7acf91bac0fda8e58c"}, - {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:262a8de6bba4aee8a66f5edf62c214b06647461c9b6b641f8cd0cb1e3b3196fe"}, - {file = "pynacl-1.6.1-cp38-abi3-win32.whl", hash = "sha256:9fd1a4eb03caf8a2fe27b515a998d26923adb9ddb68db78e35ca2875a3830dde"}, - {file = "pynacl-1.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:a569a4069a7855f963940040f35e87d8bc084cb2d6347428d5ad20550a0a1a21"}, - {file = "pynacl-1.6.1-cp38-abi3-win_arm64.whl", hash = "sha256:5953e8b8cfadb10889a6e7bd0f53041a745d1b3d30111386a1bb37af171e6daf"}, - {file = "pynacl-1.6.1.tar.gz", hash = "sha256:8d361dac0309f2b6ad33b349a56cd163c98430d409fa503b10b70b3ad66eaa1d"}, + {file = "pynacl-1.6.2-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:622d7b07cc5c02c666795792931b50c91f3ce3c2649762efb1ef0d5684c81594"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d071c6a9a4c94d79eb665db4ce5cedc537faf74f2355e4d502591d850d3913c0"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04316d1fc625d860b6c162fff704eb8426b1a8bcd3abacea11142cbd99a6b574"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44081faff368d6c5553ccf55322ef2819abb40e25afaec7e740f159f74813634"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:a9f9932d8d2811ce1a8ffa79dcbdf3970e7355b5c8eb0c1a881a57e7f7d96e88"}, + {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:bc4a36b28dd72fb4845e5d8f9760610588a96d5a51f01d84d8c6ff9849968c14"}, + {file = "pynacl-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bffb6d0f6becacb6526f8f42adfb5efb26337056ee0831fb9a7044d1a964444"}, + {file = "pynacl-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fef529ef3ee487ad8113d287a593fa26f48ee3620d92ecc6f1d09ea38e0709b"}, + {file = "pynacl-1.6.2-cp314-cp314t-win32.whl", hash = "sha256:a84bf1c20339d06dc0c85d9aea9637a24f718f375d861b2668b2f9f96fa51145"}, + {file = "pynacl-1.6.2-cp314-cp314t-win_amd64.whl", hash = "sha256:320ef68a41c87547c91a8b58903c9caa641ab01e8512ce291085b5fe2fcb7590"}, + {file = "pynacl-1.6.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2"}, + {file = "pynacl-1.6.2-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130"}, + {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6"}, + {file = "pynacl-1.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e"}, + {file = "pynacl-1.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577"}, + {file = "pynacl-1.6.2-cp38-abi3-win32.whl", hash = "sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa"}, + {file = "pynacl-1.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0"}, + {file = "pynacl-1.6.2-cp38-abi3-win_arm64.whl", hash = "sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c"}, + {file = "pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c"}, ] [package.dependencies] @@ -5629,15 +5925,15 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=7.4.0)", "pytest-cov (>=2.10.1)", " [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"}, - {file = "pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -5817,7 +6113,7 @@ description = "Python for Window Extensions" optional = true python-versions = "*" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") and sys_platform == \"win32\"" +markers = "python_version >= \"3.10\" and sys_platform == \"win32\" and (extra == \"proxy\" or extra == \"mlflow\")" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -6038,127 +6334,143 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" -version = "2025.11.3" +version = "2026.1.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"}, - {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"}, - {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"}, - {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"}, - {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"}, - {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"}, - {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"}, - {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"}, - {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"}, - {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"}, - {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"}, - {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"}, - {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"}, - {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"}, - {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"}, - {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"}, - {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"}, - {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"}, - {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"}, - {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"}, - {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"}, - {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"}, - {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"}, - {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"}, - {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"}, - {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3"}, + {file = "regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218"}, + {file = "regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a"}, + {file = "regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1"}, + {file = "regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569"}, + {file = "regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7"}, + {file = "regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22"}, + {file = "regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913"}, + {file = "regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a"}, + {file = "regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3"}, + {file = "regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f"}, + {file = "regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e"}, + {file = "regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60"}, + {file = "regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952"}, + {file = "regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10"}, + {file = "regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1"}, + {file = "regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1"}, + {file = "regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903"}, + {file = "regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db"}, + {file = "regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e"}, + {file = "regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf"}, + {file = "regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55b4ea996a8e4458dd7b584a2f89863b1655dd3d17b88b46cbb9becc495a0ec5"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e1e28be779884189cdd57735e997f282b64fd7ccf6e2eef3e16e57d7a34a815"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0057de9eaef45783ff69fa94ae9f0fd906d629d0bd4c3217048f46d1daa32e9b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7cd0b2be0f0269283a45c0d8b2c35e149d1319dcb4a43c9c3689fa935c1ee6"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8db052bbd981e1666f09e957f3790ed74080c2229007c1dd67afdbf0b469c48b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:343db82cb3712c31ddf720f097ef17c11dab2f67f7a3e7be976c4f82eba4e6df"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55e9d0118d97794367309635df398bdfd7c33b93e2fdfa0b239661cd74b4c14e"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:008b185f235acd1e53787333e5690082e4f156c44c87d894f880056089e9bc7c"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fd65af65e2aaf9474e468f9e571bd7b189e1df3a61caa59dcbabd0000e4ea839"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f42e68301ff4afee63e365a5fc302b81bb8ba31af625a671d7acb19d10168a8c"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f7792f27d3ee6e0244ea4697d92b825f9a329ab5230a78c1a68bd274e64b5077"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dbaf3c3c37ef190439981648ccbf0c02ed99ae066087dd117fcb616d80b010a4"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:adc97a9077c2696501443d8ad3fa1b4fc6d131fc8fd7dfefd1a723f89071cf0a"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:069f56a7bf71d286a6ff932a9e6fb878f151c998ebb2519a9f6d1cee4bffdba3"}, + {file = "regex-2026.1.15-cp39-cp39-win32.whl", hash = "sha256:ea4e6b3566127fda5e007e90a8fd5a4169f0cf0619506ed426db647f19c8454a"}, + {file = "regex-2026.1.15-cp39-cp39-win_amd64.whl", hash = "sha256:cda1ed70d2b264952e88adaa52eea653a33a1b98ac907ae2f86508eb44f65cdc"}, + {file = "regex-2026.1.15-cp39-cp39-win_arm64.whl", hash = "sha256:b325d4714c3c48277bfea1accd94e193ad6ed42b4bad79ad64f3b8f8a31260a5"}, + {file = "regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5"}, ] [[package]] @@ -6219,15 +6531,15 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "resend" -version = "2.19.0" +version = "2.21.0" description = "Resend Python SDK" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"extra-proxy\"" files = [ - {file = "resend-2.19.0-py2.py3-none-any.whl", hash = "sha256:1a8b9fcacbe058876ebce757ac2542103ed7227caec10e5c58613ee58615acaa"}, - {file = "resend-2.19.0.tar.gz", hash = "sha256:b11191561cdb0ed7aa193212b7c8865bf635013c4d11bd81caf471d1b362be02"}, + {file = "resend-2.21.0-py2.py3-none-any.whl", hash = "sha256:906d1916298e7b6b9a0f2a8e81a123f12cda5fd07683ecbfa53b54e8ec58f5f4"}, + {file = "resend-2.21.0.tar.gz", hash = "sha256:765288c2015c2c4dd0fb3c8596af4007709b790336eda2966593194377546d11"}, ] [package.dependencies] @@ -6290,22 +6602,18 @@ pygments = ">=2.13.0,<3.0.0" jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "roman-numerals-py" -version = "3.1.0" +name = "roman-numerals" +version = "4.1.0" description = "Manipulate well-formed Roman numerals" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.11\" and extra == \"utils\"" files = [ - {file = "roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c"}, - {file = "roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"}, + {file = "roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7"}, + {file = "roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2"}, ] -[package.extras] -lint = ["mypy (==1.15.0)", "pyright (==1.1.394)", "ruff (==0.9.7)"] -test = ["pytest (>=8)"] - [[package]] name = "rpds-py" version = "0.27.1" @@ -6474,141 +6782,141 @@ files = [ [[package]] name = "rpds-py" -version = "0.29.0" +version = "0.30.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\"" files = [ - {file = "rpds_py-0.29.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4ae4b88c6617e1b9e5038ab3fccd7bac0842fdda2b703117b2aa99bc85379113"}, - {file = "rpds_py-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d9128ec9d8cecda6f044001fde4fb71ea7c24325336612ef8179091eb9596b9"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37812c3da8e06f2bb35b3cf10e4a7b68e776a706c13058997238762b4e07f4f"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66786c3fb1d8de416a7fa8e1cb1ec6ba0a745b2b0eee42f9b7daa26f1a495545"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58f5c77f1af888b5fd1876c9a0d9858f6f88a39c9dd7c073a88e57e577da66d"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:799156ef1f3529ed82c36eb012b5d7a4cf4b6ef556dd7cc192148991d07206ae"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:453783477aa4f2d9104c4b59b08c871431647cb7af51b549bbf2d9eb9c827756"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:24a7231493e3c4a4b30138b50cca089a598e52c34cf60b2f35cebf62f274fdea"}, - {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7033c1010b1f57bb44d8067e8c25aa6fa2e944dbf46ccc8c92b25043839c3fd2"}, - {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0248b19405422573621172ab8e3a1f29141362d13d9f72bafa2e28ea0cdca5a2"}, - {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f9f436aee28d13b9ad2c764fc273e0457e37c2e61529a07b928346b219fcde3b"}, - {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24a16cb7163933906c62c272de20ea3c228e4542c8c45c1d7dc2b9913e17369a"}, - {file = "rpds_py-0.29.0-cp310-cp310-win32.whl", hash = "sha256:1a409b0310a566bfd1be82119891fefbdce615ccc8aa558aff7835c27988cbef"}, - {file = "rpds_py-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5523b0009e7c3c1263471b69d8da1c7d41b3ecb4cb62ef72be206b92040a950"}, - {file = "rpds_py-0.29.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9b9c764a11fd637e0322a488560533112837f5334ffeb48b1be20f6d98a7b437"}, - {file = "rpds_py-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fd2164d73812026ce970d44c3ebd51e019d2a26a4425a5dcbdfa93a34abc383"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a097b7f7f7274164566ae90a221fd725363c0e9d243e2e9ed43d195ccc5495c"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cdc0490374e31cedefefaa1520d5fe38e82fde8748cbc926e7284574c714d6b"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89ca2e673ddd5bde9b386da9a0aac0cab0e76f40c8f0aaf0d6311b6bbf2aa311"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5d9da3ff5af1ca1249b1adb8ef0573b94c76e6ae880ba1852f033bf429d4588"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8238d1d310283e87376c12f658b61e1ee23a14c0e54c7c0ce953efdbdc72deed"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2d6fb2ad1c36f91c4646989811e84b1ea5e0c3cf9690b826b6e32b7965853a63"}, - {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:534dc9df211387547267ccdb42253aa30527482acb38dd9b21c5c115d66a96d2"}, - {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d456e64724a075441e4ed648d7f154dc62e9aabff29bcdf723d0c00e9e1d352f"}, - {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a738f2da2f565989401bd6fd0b15990a4d1523c6d7fe83f300b7e7d17212feca"}, - {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a110e14508fd26fd2e472bb541f37c209409876ba601cf57e739e87d8a53cf95"}, - {file = "rpds_py-0.29.0-cp311-cp311-win32.whl", hash = "sha256:923248a56dd8d158389a28934f6f69ebf89f218ef96a6b216a9be6861804d3f4"}, - {file = "rpds_py-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:539eb77eb043afcc45314d1be09ea6d6cafb3addc73e0547c171c6d636957f60"}, - {file = "rpds_py-0.29.0-cp311-cp311-win_arm64.whl", hash = "sha256:bdb67151ea81fcf02d8f494703fb728d4d34d24556cbff5f417d74f6f5792e7c"}, - {file = "rpds_py-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954"}, - {file = "rpds_py-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181"}, - {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c"}, - {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7"}, - {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19"}, - {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0"}, - {file = "rpds_py-0.29.0-cp312-cp312-win32.whl", hash = "sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7"}, - {file = "rpds_py-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977"}, - {file = "rpds_py-0.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7"}, - {file = "rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61"}, - {file = "rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b"}, - {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55"}, - {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd"}, - {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea"}, - {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22"}, - {file = "rpds_py-0.29.0-cp313-cp313-win32.whl", hash = "sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7"}, - {file = "rpds_py-0.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e"}, - {file = "rpds_py-0.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2"}, - {file = "rpds_py-0.29.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c"}, - {file = "rpds_py-0.29.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e"}, - {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb"}, - {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967"}, - {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e"}, - {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a"}, - {file = "rpds_py-0.29.0-cp313-cp313t-win32.whl", hash = "sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb"}, - {file = "rpds_py-0.29.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352"}, - {file = "rpds_py-0.29.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1"}, - {file = "rpds_py-0.29.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c"}, - {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318"}, - {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212"}, - {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94"}, - {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d"}, - {file = "rpds_py-0.29.0-cp314-cp314-win32.whl", hash = "sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1"}, - {file = "rpds_py-0.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b"}, - {file = "rpds_py-0.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9"}, - {file = "rpds_py-0.29.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10"}, - {file = "rpds_py-0.29.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761"}, - {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3"}, - {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9"}, - {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8"}, - {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a"}, - {file = "rpds_py-0.29.0-cp314-cp314t-win32.whl", hash = "sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5"}, - {file = "rpds_py-0.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:acd82a9e39082dc5f4492d15a6b6c8599aa21db5c35aaf7d6889aea16502c07d"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:715b67eac317bf1c7657508170a3e011a1ea6ccb1c9d5f296e20ba14196be6b3"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3b1b87a237cb2dba4db18bcfaaa44ba4cd5936b91121b62292ff21df577fc43"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c3c3e8101bb06e337c88eb0c0ede3187131f19d97d43ea0e1c5407ea74c0cbf"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8e54d6e61f3ecd3abe032065ce83ea63417a24f437e4a3d73d2f85ce7b7cfe"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fbd4e9aebf110473a420dea85a238b254cf8a15acb04b22a5a6b5ce8925b760"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fdf53d36e6c72819993e35d1ebeeb8e8fc688d0c6c2b391b55e335b3afba5a"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:ea7173df5d86f625f8dde6d5929629ad811ed8decda3b60ae603903839ac9ac0"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:76054d540061eda273274f3d13a21a4abdde90e13eaefdc205db37c05230efce"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9f84c549746a5be3bc7415830747a3a0312573afc9f95785eb35228bb17742ec"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:0ea962671af5cb9a260489e311fa22b2e97103e3f9f0caaea6f81390af96a9ed"}, - {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f7728653900035fb7b8d06e1e5900545d8088efc9d5d4545782da7df03ec803f"}, - {file = "rpds_py-0.29.0.tar.gz", hash = "sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, ] [[package]] name = "rq" -version = "2.6.0" +version = "2.6.1" description = "RQ is a simple, lightweight, library for creating background jobs, and processing them." optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "rq-2.6.0-py3-none-any.whl", hash = "sha256:be5ccc0f0fc5f32da0999648340e31476368f08067f0c3fce6768d00064edbb5"}, - {file = "rq-2.6.0.tar.gz", hash = "sha256:92ad55676cda14512c4eea5782f398a102dc3af108bea197c868c4c50c5d3e81"}, + {file = "rq-2.6.1-py3-none-any.whl", hash = "sha256:5cc88d3bb5263a407fb2ba2dc6fe8dc710dae94b6f74396cdfe1b32beded9408"}, + {file = "rq-2.6.1.tar.gz", hash = "sha256:db5c0d125ac9dbd4438f9a5225ea3e64050542b416fd791d424e2ab5b2853289"}, ] [package.dependencies] @@ -6673,10 +6981,10 @@ files = [ ] [package.dependencies] -botocore = ">=1.37.4,<2.0a.0" +botocore = ">=1.37.4,<2.0a0" [package.extras] -crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] +crt = ["botocore[crt] (>=1.37.4,<2.0a0)"] [[package]] name = "scikit-learn" @@ -6685,7 +6993,7 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.10" groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\"" +markers = "python_version == \"3.10\" and extra == \"mlflow\"" files = [ {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, @@ -6735,6 +7043,69 @@ install = ["joblib (>=1.2.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)", "threadpoo maintenance = ["conda-lock (==3.0.1)"] tests = ["matplotlib (>=3.5.0)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.2.1)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)", "scikit-image (>=0.19.0)"] +[[package]] +name = "scikit-learn" +version = "1.8.0" +description = "A set of python modules for machine learning and data mining" +optional = true +python-versions = ">=3.11" +groups = ["main"] +markers = "python_version >= \"3.11\" and extra == \"mlflow\"" +files = [ + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da"}, + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c"}, + {file = "scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd"}, +] + +[package.dependencies] +joblib = ">=1.3.0" +numpy = ">=1.24.1" +scipy = ">=1.10.0" +threadpoolctl = ">=3.2.0" + +[package.extras] +benchmark = ["matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "pandas (>=1.5.0)"] +build = ["cython (>=3.1.2)", "meson-python (>=0.17.1)", "numpy (>=1.24.1)", "scipy (>=1.10.0)"] +docs = ["Pillow (>=10.1.0)", "matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.6.1)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "pooch (>=1.8.0)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)"] +install = ["joblib (>=1.3.0)", "numpy (>=1.24.1)", "scipy (>=1.10.0)", "threadpoolctl (>=3.2.0)"] +maintenance = ["conda-lock (==3.0.1)"] +tests = ["matplotlib (>=3.6.1)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pyamg (>=5.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)"] + [[package]] name = "scipy" version = "1.15.3" @@ -6802,82 +7173,82 @@ test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis [[package]] name = "scipy" -version = "1.16.3" +version = "1.17.0" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.11" groups = ["main"] markers = "python_version >= \"3.11\" and extra == \"mlflow\"" files = [ - {file = "scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97"}, - {file = "scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511"}, - {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005"}, - {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb"}, - {file = "scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876"}, - {file = "scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2"}, - {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e"}, - {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733"}, - {file = "scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78"}, - {file = "scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184"}, - {file = "scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6"}, - {file = "scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07"}, - {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9"}, - {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686"}, - {file = "scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203"}, - {file = "scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1"}, - {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe"}, - {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70"}, - {file = "scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc"}, - {file = "scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2"}, - {file = "scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c"}, - {file = "scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d"}, - {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9"}, - {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4"}, - {file = "scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959"}, - {file = "scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88"}, - {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234"}, - {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d"}, - {file = "scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304"}, - {file = "scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2"}, - {file = "scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b"}, - {file = "scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079"}, - {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a"}, - {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119"}, - {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c"}, - {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e"}, - {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135"}, - {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6"}, - {file = "scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc"}, - {file = "scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a"}, - {file = "scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6"}, - {file = "scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657"}, - {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26"}, - {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc"}, - {file = "scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22"}, - {file = "scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc"}, - {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0"}, - {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800"}, - {file = "scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d"}, - {file = "scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f"}, - {file = "scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c"}, - {file = "scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40"}, - {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d"}, - {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa"}, - {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8"}, - {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353"}, - {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146"}, - {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d"}, - {file = "scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7"}, - {file = "scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562"}, - {file = "scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449"}, + {file = "scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea"}, + {file = "scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e"}, + {file = "scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8"}, + {file = "scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea"}, + {file = "scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812"}, + {file = "scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04"}, + {file = "scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0"}, + {file = "scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b"}, + {file = "scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061"}, + {file = "scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f"}, + {file = "scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088"}, + {file = "scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff"}, + {file = "scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e"}, ] [package.dependencies] -numpy = ">=1.25.2,<2.6" +numpy = ">=1.26.4,<2.7" [package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] @@ -6909,9 +7280,9 @@ tornado = ">=6.4.2,<7" urllib3 = ">=1.26,<3" [package.extras] -all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.00)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] +all = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)", "cohere (>=5.9.4,<6.0)", "dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\"", "google-cloud-aiplatform (>=1.45.0,<2)", "ipykernel (>=6.25.0,<7)", "llama-cpp-python (>=0.2.28,<0.2.86) ; python_version < \"3.13\"", "mistralai (>=0.0.12,<0.1.0)", "mypy (>=1.7.1,<2)", "ollama (>=0.1.7)", "pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "pinecone[asyncio] (>=7.0.0,<8.0.0)", "psycopg[binary] (>=3.1.0,<4)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "qdrant-client (>=1.11.1,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "sentence-transformers (>=5.0.0) ; python_version < \"3.13\"", "tokenizers (>=0.19) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\"", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] bedrock = ["boto3 (>=1.34.98,<2)", "botocore (>=1.34.110,<2)"] -cohere = ["cohere (>=5.9.4,<6.00)"] +cohere = ["cohere (>=5.9.4,<6.0)"] dev = ["dagger-io (>=0.1.1) ; python_version >= \"3.11\"", "ipykernel (>=6.25.0,<7)", "mypy (>=1.7.1,<2)", "pytest (>=8.2,<9.0)", "pytest-asyncio (>=0.24.0,<0.25)", "pytest-cov (>=4.1.0,<5)", "pytest-mock (>=3.12.0,<4)", "pytest-timeout", "pytest-xdist (>=3.5.0,<4)", "python-dotenv (>=1.0.0,<2)", "requests-mock (>=1.12.1,<2)", "ruff (>=0.11.2,<0.12)", "types-pyyaml (>=6.0.12.12,<7)", "types-requests (>=2.31.0,<3)"] docs = ["pydoc-markdown (>=4.8.2) ; python_version < \"3.12\""] fastembed = ["fastembed (>=0.3.0,<0.4) ; python_version < \"3.13\""] @@ -6924,141 +7295,6 @@ postgres = ["psycopg[binary] (>=3.1.0,<4)"] qdrant = ["qdrant-client (>=1.11.1,<2)"] vision = ["pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\""] -[[package]] -name = "shapely" -version = "2.0.7" -description = "Manipulation and analysis of geometric objects" -optional = true -python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.9\" and extra == \"google\"" -files = [ - {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, - {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, - {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98"}, - {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895"}, - {file = "shapely-2.0.7-cp310-cp310-win32.whl", hash = "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2"}, - {file = "shapely-2.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39"}, - {file = "shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34"}, - {file = "shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013"}, - {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0"}, - {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3"}, - {file = "shapely-2.0.7-cp311-cp311-win32.whl", hash = "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2"}, - {file = "shapely-2.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608"}, - {file = "shapely-2.0.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa"}, - {file = "shapely-2.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51"}, - {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e"}, - {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73"}, - {file = "shapely-2.0.7-cp312-cp312-win32.whl", hash = "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd"}, - {file = "shapely-2.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108"}, - {file = "shapely-2.0.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb"}, - {file = "shapely-2.0.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027"}, - {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36"}, - {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98"}, - {file = "shapely-2.0.7-cp313-cp313-win32.whl", hash = "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913"}, - {file = "shapely-2.0.7-cp313-cp313-win_amd64.whl", hash = "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e"}, - {file = "shapely-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43"}, - {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc"}, - {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98"}, - {file = "shapely-2.0.7-cp37-cp37m-win32.whl", hash = "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d"}, - {file = "shapely-2.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8"}, - {file = "shapely-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36"}, - {file = "shapely-2.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc"}, - {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611"}, - {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24"}, - {file = "shapely-2.0.7-cp38-cp38-win32.whl", hash = "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532"}, - {file = "shapely-2.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74"}, - {file = "shapely-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5"}, - {file = "shapely-2.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013"}, - {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b"}, - {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27"}, - {file = "shapely-2.0.7-cp39-cp39-win32.whl", hash = "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999"}, - {file = "shapely-2.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5"}, - {file = "shapely-2.0.7.tar.gz", hash = "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5"}, -] - -[package.dependencies] -numpy = ">=1.14,<3" - -[package.extras] -docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov"] - -[[package]] -name = "shapely" -version = "2.1.2" -description = "Manipulation and analysis of geometric objects" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"google\"" -files = [ - {file = "shapely-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f"}, - {file = "shapely-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea"}, - {file = "shapely-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f"}, - {file = "shapely-2.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142"}, - {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4"}, - {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0"}, - {file = "shapely-2.1.2-cp310-cp310-win32.whl", hash = "sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e"}, - {file = "shapely-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f"}, - {file = "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618"}, - {file = "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d"}, - {file = "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09"}, - {file = "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26"}, - {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7"}, - {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2"}, - {file = "shapely-2.1.2-cp311-cp311-win32.whl", hash = "sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6"}, - {file = "shapely-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc"}, - {file = "shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94"}, - {file = "shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359"}, - {file = "shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3"}, - {file = "shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b"}, - {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc"}, - {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d"}, - {file = "shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454"}, - {file = "shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179"}, - {file = "shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8"}, - {file = "shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a"}, - {file = "shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e"}, - {file = "shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6"}, - {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af"}, - {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd"}, - {file = "shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350"}, - {file = "shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715"}, - {file = "shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40"}, - {file = "shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b"}, - {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801"}, - {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0"}, - {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c"}, - {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99"}, - {file = "shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf"}, - {file = "shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c"}, - {file = "shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223"}, - {file = "shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c"}, - {file = "shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df"}, - {file = "shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf"}, - {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4"}, - {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc"}, - {file = "shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566"}, - {file = "shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c"}, - {file = "shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a"}, - {file = "shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076"}, - {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1"}, - {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0"}, - {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26"}, - {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0"}, - {file = "shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735"}, - {file = "shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9"}, - {file = "shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9"}, -] - -[package.dependencies] -numpy = ">=1.21" - -[package.extras] -docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov", "scipy-doctest"] - [[package]] name = "shellingham" version = "1.5.4" @@ -7084,6 +7320,29 @@ files = [ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] +[[package]] +name = "skops" +version = "0.13.0" +description = "A set of tools, related to machine learning in production." +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"mlflow\"" +files = [ + {file = "skops-0.13.0-py3-none-any.whl", hash = "sha256:55e2cccb18c86f5916e4cfe5acf55ed7b0eecddf08a151906414c092fa5926dc"}, + {file = "skops-0.13.0.tar.gz", hash = "sha256:66949fd3c95cbb5c80270fbe40293c0fe1e46cb4a921860e42584dd9c20ebeb1"}, +] + +[package.dependencies] +numpy = ">=1.25.0" +packaging = ">=17.0" +prettytable = ">=3.9" +scikit-learn = ">=1.2" +scipy = ">=1.10.0" + +[package.extras] +rich = ["rich (>=12)"] + [[package]] name = "smmap" version = "5.0.2" @@ -7103,7 +7362,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main", "dev", "proxy-dev"] +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -7224,28 +7483,28 @@ test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools [[package]] name = "sphinx" -version = "8.2.3" +version = "9.0.4" description = "Python documentation generator" optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\" and extra == \"utils\"" +markers = "python_version == \"3.11\" and extra == \"utils\"" files = [ - {file = "sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3"}, - {file = "sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348"}, + {file = "sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb"}, + {file = "sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3"}, ] [package.dependencies] alabaster = ">=0.7.14" babel = ">=2.13" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} -docutils = ">=0.20,<0.22" +docutils = ">=0.20,<0.23" imagesize = ">=1.3" Jinja2 = ">=3.1" packaging = ">=23.0" Pygments = ">=2.17" requests = ">=2.30.0" -roman-numerals-py = ">=1.0.0" +roman-numerals = ">=1.0.0" snowballstemmer = ">=2.2" sphinxcontrib-applehelp = ">=1.0.7" sphinxcontrib-devhelp = ">=1.0.6" @@ -7254,10 +7513,37 @@ sphinxcontrib-jsmath = ">=1.0.1" sphinxcontrib-qthelp = ">=1.0.6" sphinxcontrib-serializinghtml = ">=1.1.9" -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["betterproto (==2.0.0b6)", "mypy (==1.15.0)", "pypi-attestations (==0.0.21)", "pyright (==1.1.395)", "pytest (>=8.0)", "ruff (==0.9.9)", "sphinx-lint (>=0.9)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.19.0.20250219)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241128)", "types-requests (==2.32.0.20241016)", "types-urllib3 (==1.26.25.14)"] -test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "pytest-xdist[psutil] (>=3.4)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] +[[package]] +name = "sphinx" +version = "9.1.0" +description = "Python documentation generator" +optional = true +python-versions = ">=3.12" +groups = ["main"] +markers = "python_version >= \"3.12\" and extra == \"utils\"" +files = [ + {file = "sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978"}, + {file = "sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb"}, +] + +[package.dependencies] +alabaster = ">=0.7.14" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.21,<0.23" +imagesize = ">=1.3" +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +roman-numerals = ">=1.0.0" +snowballstemmer = ">=2.2" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" +sphinxcontrib-serializinghtml = ">=1.1.9" [[package]] name = "sphinxcontrib-applehelp" @@ -7367,70 +7653,72 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.44" +version = "2.0.46" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "SQLAlchemy-2.0.44-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-win32.whl", hash = "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-win_amd64.whl", hash = "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-win32.whl", hash = "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-win_amd64.whl", hash = "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-win32.whl", hash = "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-win_amd64.whl", hash = "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-win32.whl", hash = "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-win_amd64.whl", hash = "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6"}, - {file = "sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05"}, - {file = "sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-win32.whl", hash = "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047"}, + {file = "sqlalchemy-2.0.46-cp310-cp310-win_amd64.whl", hash = "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-win32.whl", hash = "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d"}, + {file = "sqlalchemy-2.0.46-cp311-cp311-win_amd64.whl", hash = "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-win32.whl", hash = "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb"}, + {file = "sqlalchemy-2.0.46-cp312-cp312-win_amd64.whl", hash = "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-win32.whl", hash = "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f"}, + {file = "sqlalchemy-2.0.46-cp313-cp313-win_amd64.whl", hash = "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef"}, + {file = "sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10"}, + {file = "sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764"}, + {file = "sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b"}, + {file = "sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-win32.whl", hash = "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908"}, + {file = "sqlalchemy-2.0.46-cp314-cp314-win_amd64.whl", hash = "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b"}, + {file = "sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa"}, + {file = "sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863"}, + {file = "sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede"}, + {file = "sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e6199143d51e3e1168bedd98cc698397404a8f7508831b81b6a29b18b051069"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6f827fd687fa1ba7f51699e1132129eac8db8003695513fcf13fc587e1bd47a5"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c805fa6e5d461329fa02f53f88c914d189ea771b6821083937e79550bf31fc19"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-win32.whl", hash = "sha256:3aac08f7546179889c62b53b18ebf1148b10244b3405569c93984b0388d016a7"}, + {file = "sqlalchemy-2.0.46-cp38-cp38-win_amd64.whl", hash = "sha256:0cc3117db526cad3e61074100bd2867b533e2c7dc1569e95c14089735d6fb4fe"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90bde6c6b1827565a95fde597da001212ab436f1b2e0c2dcc7246e14db26e2a3"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94b1e5f3a5f1ff4f42d5daab047428cd45a3380e51e191360a35cef71c9a7a2a"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93bb0aae40b52c57fd74ef9c6933c08c040ba98daf23ad33c3f9893494b8d3ce"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4e2cc868b7b5208aec6c960950b7bb821f82c2fe66446c92ee0a571765e91a5"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:965c62be8256d10c11f8907e7a8d3e18127a4c527a5919d85fa87fd9ecc2cfdc"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-win32.whl", hash = "sha256:9397b381dcee8a2d6b99447ae85ea2530dcac82ca494d1db877087a13e38926d"}, + {file = "sqlalchemy-2.0.46-cp39-cp39-win_amd64.whl", hash = "sha256:4396c948d8217e83e2c202fbdcc0389cf8c93d2c1c5e60fa5c5a955eae0e64be"}, + {file = "sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e"}, + {file = "sqlalchemy-2.0.46.tar.gz", hash = "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7"}, ] [package.dependencies] @@ -7464,55 +7752,76 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlparse" -version = "0.5.3" +version = "0.5.5" description = "A non-validating SQL parser." optional = true python-versions = ">=3.8" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, - {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, + {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, + {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, ] [package.extras] -dev = ["build", "hatch"] +dev = ["build"] doc = ["sphinx"] [[package]] name = "sse-starlette" -version = "3.0.3" +version = "3.2.0" description = "SSE plugin for Starlette" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "sse_starlette-3.0.3-py3-none-any.whl", hash = "sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431"}, - {file = "sse_starlette-3.0.3.tar.gz", hash = "sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971"}, + {file = "sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf"}, + {file = "sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422"}, ] [package.dependencies] anyio = ">=4.7.0" +starlette = ">=0.49.1" [package.extras] daphne = ["daphne (>=4.2.0)"] -examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.49.1)", "uvicorn (>=0.34.0)"] +examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "uvicorn (>=0.34.0)"] granian = ["granian (>=2.3.1)"] uvicorn = ["uvicorn (>=0.34.0)"] [[package]] name = "starlette" -version = "0.50.0" +version = "0.49.3" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, + {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, +] +markers = {main = "python_version == \"3.9\" and extra == \"proxy\"", dev = "python_version == \"3.9\""} + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + +[[package]] +name = "starlette" +version = "0.52.1" description = "The little ASGI library that shines." optional = false python-versions = ">=3.10" groups = ["main", "dev"] files = [ - {file = "starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca"}, - {file = "starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca"}, + {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, + {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, ] -markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} +markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\")", dev = "python_version >= \"3.10\""} [package.dependencies] anyio = ">=3.6.2,<5" @@ -7561,7 +7870,7 @@ description = "Retry code until it succeeds" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\" or extra == \"google\"" +markers = "python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\")" files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -7571,6 +7880,23 @@ files = [ doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] +[[package]] +name = "tenacity" +version = "9.1.3" +description = "Retry code until it succeeds" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and (extra == \"google\" or extra == \"extra-proxy\") and (python_version < \"3.14\" or extra == \"google\")" +files = [ + {file = "tenacity-9.1.3-py3-none-any.whl", hash = "sha256:51171cfc6b8a7826551e2f029426b10a6af189c5ac6986adcd7eb36d42f17954"}, + {file = "tenacity-9.1.3.tar.gz", hash = "sha256:a6724c947aa717087e2531f883bde5c9188f603f6669a9b8d54eb998e604c12a"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + [[package]] name = "threadpoolctl" version = "3.6.0" @@ -7660,27 +7986,36 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.22.1" +version = "0.22.2" description = "" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "tokenizers-0.22.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59fdb013df17455e5f950b4b834a7b3ee2e0271e6378ccb33aa74d178b513c73"}, - {file = "tokenizers-0.22.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8d4e484f7b0827021ac5f9f71d4794aaef62b979ab7608593da22b1d2e3c4edc"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d2962dd28bc67c1f205ab180578a78eef89ac60ca7ef7cbe9635a46a56422a"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38201f15cdb1f8a6843e6563e6e79f4abd053394992b9bbdf5213ea3469b4ae7"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1cbe5454c9a15df1b3443c726063d930c16f047a3cc724b9e6e1a91140e5a21"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7d094ae6312d69cc2a872b54b91b309f4f6fbce871ef28eb27b52a98e4d0214"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd7594a56656ace95cdd6df4cca2e4059d294c5cfb1679c57824b605556cb2f"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ef6063d7a84994129732b47e7915e8710f27f99f3a3260b8a38fc7ccd083f4"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ba0a64f450b9ef412c98f6bcd2a50c6df6e2443b560024a09fa6a03189726879"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:331d6d149fa9c7d632cde4490fb8bbb12337fa3a0232e77892be656464f4b446"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:607989f2ea68a46cb1dfbaf3e3aabdf3f21d8748312dbeb6263d1b3b66c5010a"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a0f307d490295717726598ef6fa4f24af9d484809223bbc253b201c740a06390"}, - {file = "tokenizers-0.22.1-cp39-abi3-win32.whl", hash = "sha256:b5120eed1442765cd90b903bb6cfef781fd8fe64e34ccaecbae4c619b7b12a82"}, - {file = "tokenizers-0.22.1-cp39-abi3-win_amd64.whl", hash = "sha256:65fd6e3fb11ca1e78a6a93602490f134d1fdeb13bcef99389d5102ea318ed138"}, - {file = "tokenizers-0.22.1.tar.gz", hash = "sha256:61de6522785310a309b3407bac22d99c4db5dba349935e99e4d15ea2226af2d9"}, + {file = "tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c"}, + {file = "tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b"}, + {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67"}, + {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4"}, + {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a"}, + {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a"}, + {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5"}, + {file = "tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92"}, + {file = "tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48"}, + {file = "tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc"}, + {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4"}, + {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c"}, + {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195"}, + {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5"}, + {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319f659ee992222f04e58f84cbf407cfa66a65fe3a8de44e8ad2bc53e7d99012"}, + {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e50f8554d504f617d9e9d6e4c2c2884a12b388a97c5c77f0bc6cf4cd032feee"}, + {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a62ba2c5faa2dd175aaeed7b15abf18d20266189fb3406c5d0550dd34dd5f37"}, + {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143b999bdc46d10febb15cbffb4207ddd1f410e2c755857b5a0797961bbdc113"}, + {file = "tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917"}, ] [package.dependencies] @@ -7689,106 +8024,112 @@ huggingface-hub = ">=0.16.4,<2.0" [package.extras] dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff"] +testing = ["datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff", "ty"] [[package]] name = "tomli" -version = "2.3.0" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, - {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, - {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, - {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, - {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, - {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, - {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, - {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, - {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, - {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, - {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, - {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, - {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, - {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] markers = {main = "extra == \"utils\" and python_version == \"3.9\" or python_version == \"3.10\" and (extra == \"utils\" or extra == \"mlflow\")", dev = "python_version < \"3.11\"", proxy-dev = "python_version < \"3.11\""} [[package]] name = "tomlkit" -version = "0.13.3" +version = "0.14.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "proxy-dev"] files = [ - {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, - {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, + {file = "tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680"}, + {file = "tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064"}, ] +markers = {main = "extra == \"extra-proxy\""} [[package]] name = "tornado" -version = "6.5.2" +version = "6.5.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"semantic-router\" and python_version < \"3.14\"" files = [ - {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6"}, - {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef"}, - {file = "tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e"}, - {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882"}, - {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108"}, - {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c"}, - {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4"}, - {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04"}, - {file = "tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0"}, - {file = "tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f"}, - {file = "tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af"}, - {file = "tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, + {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, + {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, + {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, + {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, + {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, + {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, ] [package.dependencies] @@ -7803,14 +8144,14 @@ telegram = ["requests"] [[package]] name = "typer-slim" -version = "0.20.0" +version = "0.21.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "typer_slim-0.20.0-py3-none-any.whl", hash = "sha256:f42a9b7571a12b97dddf364745d29f12221865acef7a2680065f9bb29c7dc89d"}, - {file = "typer_slim-0.20.0.tar.gz", hash = "sha256:9fc6607b3c6c20f5c33ea9590cbeb17848667c51feee27d9e314a579ab07d1a3"}, + {file = "typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d"}, + {file = "typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd"}, ] [package.dependencies] @@ -7897,15 +8238,15 @@ types-urllib3 = "*" [[package]] name = "types-requests" -version = "2.32.4.20250913" +version = "2.32.4.20260107" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, - {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, + {file = "types_requests-2.32.4.20260107-py3-none-any.whl", hash = "sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d"}, + {file = "types_requests-2.32.4.20260107.tar.gz", hash = "sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f"}, ] [package.dependencies] @@ -7913,14 +8254,14 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "80.9.0.20250822" +version = "80.10.0.20260124" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3"}, - {file = "types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965"}, + {file = "types_setuptools-80.10.0.20260124-py3-none-any.whl", hash = "sha256:efed7e044f01adb9c2806c7a8e1b6aa3656b8e382379b53d5f26ee3db24d4c01"}, + {file = "types_setuptools-80.10.0.20260124.tar.gz", hash = "sha256:1b86d9f0368858663276a0cbe5fe5a9722caf94b5acde8aba0399a6e90680f20"}, ] [[package]] @@ -7965,15 +8306,15 @@ typing-extensions = ">=4.12.0" [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" description = "Provider of IANA time zone data" optional = true python-versions = ">=2" groups = ["main"] markers = "platform_system == \"Windows\" and python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") or platform_system == \"Windows\" and extra == \"proxy\" or python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, ] [[package]] @@ -8015,22 +8356,22 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "uvicorn" @@ -8113,7 +8454,7 @@ description = "Waitress WSGI server" optional = true python-versions = ">=3.9.0" groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\" and platform_system == \"Windows\"" +markers = "python_version >= \"3.10\" and platform_system == \"Windows\" and extra == \"mlflow\"" files = [ {file = "waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e"}, {file = "waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f"}, @@ -8123,6 +8464,19 @@ files = [ docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] testing = ["coverage (>=7.6.0)", "pytest", "pytest-cov"] +[[package]] +name = "wcwidth" +version = "0.5.3" +description = "Measures the displayed width of unicode strings in a terminal" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"mlflow\"" +files = [ + {file = "wcwidth-0.5.3-py3-none-any.whl", hash = "sha256:d584eff31cd4753e1e5ff6c12e1edfdb324c995713f75d26c29807bb84bf649e"}, + {file = "wcwidth-0.5.3.tar.gz", hash = "sha256:53123b7af053c74e9fe2e92ac810301f6139e64379031f7124574212fb3b4091"}, +] + [[package]] name = "websockets" version = "15.0.1" @@ -8205,19 +8559,19 @@ files = [ [[package]] name = "werkzeug" -version = "3.1.3" +version = "3.1.5" description = "The comprehensive WSGI web application library." optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, - {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, + {file = "werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc"}, + {file = "werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67"}, ] [package.dependencies] -MarkupSafe = ">=2.1.1" +markupsafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] From 789d9708b75d42529058f14009646bcf1659ff1f Mon Sep 17 00:00:00 2001 From: Kelvin Tran Date: Fri, 6 Feb 2026 09:23:40 -0800 Subject: [PATCH 061/300] restore poetry lock --- poetry.lock | 4070 +++++++++++++++++++++++---------------------------- 1 file changed, 1864 insertions(+), 2206 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8b5e3253197..5e926509d54 100644 --- a/poetry.lock +++ b/poetry.lock @@ -59,132 +59,132 @@ files = [ [[package]] name = "aiohttp" -version = "3.13.3" +version = "3.13.2" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, - {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, - {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, - {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, - {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, - {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, - {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, - {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, - {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, - {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, - {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, - {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, - {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, - {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, - {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, - {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, - {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, - {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6"}, + {file = "aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251"}, + {file = "aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8"}, + {file = "aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec"}, + {file = "aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248"}, + {file = "aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e"}, + {file = "aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23"}, + {file = "aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254"}, + {file = "aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a"}, + {file = "aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940"}, + {file = "aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c"}, + {file = "aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734"}, + {file = "aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329"}, + {file = "aiohttp-3.13.2-cp39-cp39-win32.whl", hash = "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084"}, + {file = "aiohttp-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5"}, + {file = "aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca"}, ] [package.dependencies] @@ -198,7 +198,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -244,20 +244,20 @@ files = [ [[package]] name = "alembic" -version = "1.18.3" +version = "1.17.2" description = "A database migration tool for SQLAlchemy." optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "alembic-1.18.3-py3-none-any.whl", hash = "sha256:12a0359bfc068a4ecbb9b3b02cf77856033abfdb59e4a5aca08b7eacd7b74ddd"}, - {file = "alembic-1.18.3.tar.gz", hash = "sha256:1212aa3778626f2b0f0aa6dd4e99a5f99b94bd25a0c1ac0bba3be65e081e50b0"}, + {file = "alembic-1.17.2-py3-none-any.whl", hash = "sha256:f483dd1fe93f6c5d49217055e4d15b905b425b6af906746abb35b69c1996c4e6"}, + {file = "alembic-1.17.2.tar.gz", hash = "sha256:bbe9751705c5e0f14877f02d46c53d10885e377e3d90eda810a016f9baa19e8e"}, ] [package.dependencies] Mako = "*" -SQLAlchemy = ">=1.4.23" +SQLAlchemy = ">=1.4.0" tomli = {version = "*", markers = "python_version < \"3.11\""} typing-extensions = ">=4.12" @@ -291,35 +291,36 @@ files = [ [[package]] name = "anyio" -version = "4.12.1" +version = "4.11.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, - {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, + {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, + {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" +sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] +trio = ["trio (>=0.31.0)"] [[package]] name = "apscheduler" -version = "3.11.2" +version = "3.11.1" description = "In-process task scheduler with Cron-like capabilities" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "apscheduler-3.11.2-py3-none-any.whl", hash = "sha256:ce005177f741409db4e4dd40a7431b76feb856b9dd69d57e0da49d6715bfd26d"}, - {file = "apscheduler-3.11.2.tar.gz", hash = "sha256:2a9966b052ec805f020c8c4c3ae6e6a06e24b1bf19f2e11d91d8cca0473eef41"}, + {file = "apscheduler-3.11.1-py3-none-any.whl", hash = "sha256:6162cb5683cb09923654fa9bdd3130c4be4bfda6ad8990971c9597ecd52965d2"}, + {file = "apscheduler-3.11.1.tar.gz", hash = "sha256:0db77af6400c84d1747fe98a04b8b58f0080c77d11d338c4f507a9752880f221"}, ] [package.dependencies] @@ -333,7 +334,7 @@ mongodb = ["pymongo (>=3.0)"] redis = ["redis (>=3.0)"] rethinkdb = ["rethinkdb (>=2.4.0)"] sqlalchemy = ["sqlalchemy (>=1.4)"] -test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytest-timeout", "pytz", "twisted ; python_version < \"3.14\""] +test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytz", "twisted ; python_version < \"3.14\""] tornado = ["tornado (>=4.3)"] twisted = ["twisted"] zookeeper = ["kazoo"] @@ -342,7 +343,7 @@ zookeeper = ["kazoo"] name = "async-timeout" version = "5.0.1" description = "Timeout context manager for asyncio programs" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] markers = "python_full_version < \"3.11.3\" and (extra == \"extra-proxy\" or extra == \"proxy\" or python_version < \"3.11\")" @@ -388,14 +389,14 @@ tornado = ">=6.4.2" [[package]] name = "azure-core" -version = "1.38.0" +version = "1.36.0" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.9" groups = ["main", "proxy-dev"] files = [ - {file = "azure_core-1.38.0-py3-none-any.whl", hash = "sha256:ab0c9b2cd71fecb1842d52c965c95285d3cfb38902f6766e4a471f1cd8905335"}, - {file = "azure_core-1.38.0.tar.gz", hash = "sha256:8194d2682245a3e4e3151a667c686464c3786fed7918b394d035bdcd61bb5993"}, + {file = "azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b"}, + {file = "azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7"}, ] markers = {main = "extra == \"proxy\" or extra == \"extra-proxy\""} @@ -447,15 +448,15 @@ typing-extensions = ">=4.6.0" [[package]] name = "azure-storage-blob" -version = "12.28.0" +version = "12.27.1" description = "Microsoft Azure Blob Storage Client Library for Python" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "azure_storage_blob-12.28.0-py3-none-any.whl", hash = "sha256:00fb1db28bf6a7b7ecaa48e3b1d5c83bfadacc5a678b77826081304bd87d6461"}, - {file = "azure_storage_blob-12.28.0.tar.gz", hash = "sha256:e7d98ea108258d29aa0efbfd591b2e2075fa1722a2fae8699f0b3c9de11eff41"}, + {file = "azure_storage_blob-12.27.1-py3-none-any.whl", hash = "sha256:65d1e25a4628b7b6acd20ff7902d8da5b4fde8e46e19c8f6d213a3abc3ece272"}, + {file = "azure_storage_blob-12.27.1.tar.gz", hash = "sha256:a1596cc4daf5dac9be115fcb5db67245eae894cf40e4248243754261f7b674a6"}, ] [package.dependencies] @@ -469,15 +470,15 @@ aio = ["azure-core[aio] (>=1.30.0)"] [[package]] name = "babel" -version = "2.18.0" +version = "2.17.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"utils\"" files = [ - {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, - {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] @@ -594,8 +595,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -603,27 +604,27 @@ crt = ["awscrt (==0.28.4)"] [[package]] name = "cachetools" -version = "6.2.6" +version = "6.2.2" description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "cachetools-6.2.6-py3-none-any.whl", hash = "sha256:8c9717235b3c651603fff0076db52d6acbfd1b338b8ed50256092f7ce9c85bda"}, - {file = "cachetools-6.2.6.tar.gz", hash = "sha256:16c33e1f276b9a9c0b49ab5782d901e3ad3de0dd6da9bf9bcd29ac5672f2f9e6"}, + {file = "cachetools-6.2.2-py3-none-any.whl", hash = "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace"}, + {file = "cachetools-6.2.2.tar.gz", hash = "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6"}, ] [[package]] name = "certifi" -version = "2026.1.4" +version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, + {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, + {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, ] [[package]] @@ -719,7 +720,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "(python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\") and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} +markers = {main = "(platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "platform_python_implementation != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -1179,7 +1180,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} +markers = {main = "python_version == \"3.9\" and (extra == \"proxy\" or extra == \"extra-proxy\")", dev = "python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1196,63 +1197,68 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cryptography" -version = "46.0.4" +version = "46.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32"}, - {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616"}, - {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0"}, - {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0"}, - {file = "cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5"}, - {file = "cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b"}, - {file = "cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e"}, - {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f"}, - {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82"}, - {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c"}, - {file = "cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061"}, - {file = "cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7"}, - {file = "cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b"}, - {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019"}, - {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4"}, - {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b"}, - {file = "cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc"}, - {file = "cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947"}, - {file = "cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3"}, - {file = "cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59"}, + {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926"}, + {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71"}, + {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac"}, + {file = "cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018"}, + {file = "cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb"}, + {file = "cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c"}, + {file = "cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3"}, + {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20"}, + {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de"}, + {file = "cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914"}, + {file = "cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db"}, + {file = "cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21"}, + {file = "cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506"}, + {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963"}, + {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4"}, + {file = "cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df"}, + {file = "cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f"}, + {file = "cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372"}, + {file = "cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32"}, + {file = "cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, + {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} +markers = {main = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "python_version >= \"3.10\"", proxy-dev = "python_version >= \"3.10\""} [package.dependencies] cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} @@ -1265,7 +1271,7 @@ nox = ["nox[uv] (>=2024.4.15)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==46.0.4)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1287,15 +1293,15 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "databricks-sdk" -version = "0.85.0" +version = "0.73.0" description = "Databricks SDK for Python (Beta)" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "databricks_sdk-0.85.0-py3-none-any.whl", hash = "sha256:2a2da176a55d55fb84696e0255520e99e838dd942b97b971dff724041fe00c64"}, - {file = "databricks_sdk-0.85.0.tar.gz", hash = "sha256:0b5f415fba69ea0c5bfc4d0b21cb3366c6b66f678e78e4b3c94cbcf2e9e0972f"}, + {file = "databricks_sdk-0.73.0-py3-none-any.whl", hash = "sha256:a4d3cfd19357a2b459d2dc3101454d7f0d1b62865ce099c35d0c342b66ac64ff"}, + {file = "databricks_sdk-0.73.0.tar.gz", hash = "sha256:db09eaaacd98e07dded78d3e7ab47d2f6c886e0380cb577977bd442bace8bd8d"}, ] [package.dependencies] @@ -1304,7 +1310,7 @@ protobuf = ">=4.25.8,<5.26.dev0 || >5.29.0,<5.29.1 || >5.29.1,<5.29.2 || >5.29.2 requests = ">=2.28.1,<3" [package.extras] -dev = ["autoflake (==2.3.1)", "black (==24.8.0)", "build", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort (==5.13.2)", "langchain-openai ; python_version > \"3.7\"", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist (>=3.6.1,<4.0)", "requests-mock", "wheel"] +dev = ["autoflake", "black", "build", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort", "langchain-openai ; python_version > \"3.7\"", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist (>=3.6.1,<4.0)", "requests-mock", "wheel"] notebook = ["ipython (>=8,<10)", "ipywidgets (>=8,<9)"] openai = ["httpx", "langchain-openai ; python_version > \"3.7\"", "openai"] @@ -1447,25 +1453,12 @@ description = "Docutils -- Python Documentation Utilities" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"utils\"" +markers = "extra == \"utils\"" files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] -[[package]] -name = "docutils" -version = "0.22.4" -description = "Docutils -- Python Documentation Utilities" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version >= \"3.11\" and extra == \"utils\"" -files = [ - {file = "docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"}, - {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, -] - [[package]] name = "email-validator" version = "2.3.0" @@ -1485,15 +1478,15 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.3.1" +version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev", "proxy-dev"] markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, - {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] [package.dependencies] @@ -1504,39 +1497,38 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.128.3" +version = "0.121.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "fastapi-0.128.3-py3-none-any.whl", hash = "sha256:c8cdf7c2182c9a06bf9cfa3329819913c189dc86389b90d5709892053582db29"}, - {file = "fastapi-0.128.3.tar.gz", hash = "sha256:ed99383fd96063447597d5aa2a9ec3973be198e3b4fc10c55f15c62efdb21c60"}, + {file = "fastapi-0.121.3-py3-none-any.whl", hash = "sha256:0c78fc87587fcd910ca1bbf5bc8ba37b80e119b388a7206b39f0ecc95ebf53e9"}, + {file = "fastapi-0.121.3.tar.gz", hash = "sha256:0055bc24fe53e56a40e9e0ad1ae2baa81622c406e548e501e717634e2dfbc40b"}, ] markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [package.dependencies] annotated-doc = ">=0.0.2" -pydantic = ">=2.7.0" -starlette = ">=0.40.0,<1.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.51.0" typing-extensions = ">=4.8.0" -typing-inspection = ">=0.4.2" [package.extras] -all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.9.3)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=5.8.0)", "uvicorn[standard] (>=0.12.0)"] -standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] -standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "fastapi-offline" -version = "1.7.6" +version = "1.7.5" description = "FastAPI without reliance on CDNs for docs" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "fastapi_offline-1.7.6-py3-none-any.whl", hash = "sha256:24d6851b5a94c50f669594b7ab9d1bbe3a4c0a53c4f4e9ce47798ff4591790d2"}, - {file = "fastapi_offline-1.7.6.tar.gz", hash = "sha256:c84d08584faa646932951b493106992caa79b838e454f14dd410cef9a1a5e07d"}, + {file = "fastapi_offline-1.7.5-py3-none-any.whl", hash = "sha256:00369632d604e8156b9ca9ab9c65e58ad8beff83d1ffc7bdbcec4a86173d51b4"}, + {file = "fastapi_offline-1.7.5.tar.gz", hash = "sha256:07a58cb8d8fab68ba625698414b4cac833bb2d94d82dc0fbc2a8519bee7af87d"}, ] [package.dependencies] @@ -1668,15 +1660,15 @@ files = [ [[package]] name = "filelock" -version = "3.20.3" +version = "3.20.0" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\"" files = [ - {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, - {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, + {file = "filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2"}, + {file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"}, ] [[package]] @@ -1723,15 +1715,15 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-cors" -version = "6.0.2" +version = "6.0.1" description = "A Flask extension simplifying CORS support" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a"}, - {file = "flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423"}, + {file = "flask_cors-6.0.1-py3-none-any.whl", hash = "sha256:c7b2cbfb1a31aa0d2e5341eea03a6805349f7a61647daee1a15c46bbe981494c"}, + {file = "flask_cors-6.0.1.tar.gz", hash = "sha256:d81bcb31f07b0985be7f48406247e9243aced229b7747219160a0559edd678db"}, ] [package.dependencies] @@ -1740,76 +1732,84 @@ Werkzeug = ">=0.7" [[package]] name = "fonttools" -version = "4.61.1" +version = "4.60.1" description = "Tools to manipulate font files" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, - {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, - {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, - {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, - {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, - {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, - {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, - {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, - {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, - {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, - {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, - {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, - {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, - {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, - {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, - {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, - {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, - {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, - {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, - {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, - {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, - {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, - {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, - {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, - {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, - {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, - {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, - {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, - {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, - {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, - {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, - {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, - {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, - {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, - {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, - {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, - {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, - {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, - {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, - {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, - {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, - {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, - {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, - {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, - {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, - {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, - {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, - {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, - {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, - {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, + {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28"}, + {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15"}, + {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c"}, + {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea"}, + {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652"}, + {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a"}, + {file = "fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce"}, + {file = "fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038"}, + {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f"}, + {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2"}, + {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914"}, + {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1"}, + {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d"}, + {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa"}, + {file = "fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258"}, + {file = "fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf"}, + {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc"}, + {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877"}, + {file = "fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c"}, + {file = "fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401"}, + {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903"}, + {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed"}, + {file = "fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6"}, + {file = "fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383"}, + {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb"}, + {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4"}, + {file = "fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c"}, + {file = "fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77"}, + {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199"}, + {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c"}, + {file = "fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272"}, + {file = "fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac"}, + {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3"}, + {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85"}, + {file = "fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537"}, + {file = "fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003"}, + {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08"}, + {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99"}, + {file = "fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6"}, + {file = "fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987"}, + {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299"}, + {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01"}, + {file = "fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801"}, + {file = "fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc"}, + {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc"}, + {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed"}, + {file = "fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259"}, + {file = "fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c"}, + {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2"}, + {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036"}, + {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856"}, + {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7"}, + {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854"}, + {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da"}, + {file = "fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a"}, + {file = "fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217"}, + {file = "fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb"}, + {file = "fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.45.0)"] +repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] @@ -1959,7 +1959,6 @@ description = "File-system specification" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\"" files = [ {file = "fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d"}, {file = "fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"}, @@ -1993,47 +1992,6 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] tqdm = ["tqdm"] -[[package]] -name = "fsspec" -version = "2026.2.0" -description = "File-system specification" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\"" -files = [ - {file = "fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437"}, - {file = "fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff"}, -] - -[package.extras] -abfs = ["adlfs"] -adl = ["adlfs"] -arrow = ["pyarrow (>=1)"] -dask = ["dask", "distributed"] -dev = ["pre-commit", "ruff (>=0.5)"] -doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] -dropbox = ["dropbox", "dropboxdrivefs", "requests"] -full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs (>2024.2.0)", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs (>2024.2.0)", "smbprotocol", "tqdm"] -fuse = ["fusepy"] -gcs = ["gcsfs (>2024.2.0)"] -git = ["pygit2"] -github = ["requests"] -gs = ["gcsfs"] -gui = ["panel"] -hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] -libarchive = ["libarchive-c"] -oci = ["ocifs"] -s3 = ["s3fs (>2024.2.0)"] -sftp = ["paramiko"] -smb = ["smbprotocol"] -ssh = ["paramiko"] -test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] -test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] -test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "backports-zstd ; python_version < \"3.14\"", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas (<3.0.0)", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] -tqdm = ["tqdm"] - [[package]] name = "gitdb" version = "4.0.12" @@ -2052,15 +2010,15 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.46" +version = "3.1.45" description = "GitPython is a Python library used to interact with Git repositories" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058"}, - {file = "gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f"}, + {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, + {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, ] [package.dependencies] @@ -2068,7 +2026,7 @@ gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy (==1.18.2) ; python_version >= \"3.9\"", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "google-api-core" @@ -2100,27 +2058,27 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] [[package]] name = "google-api-core" -version = "2.29.0" +version = "2.28.1" description = "Google API client core library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version < \"3.14\" and (extra == \"extra-proxy\" or extra == \"google\")" +markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\"" files = [ - {file = "google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9"}, - {file = "google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7"}, + {file = "google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c"}, + {file = "google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.0" googleapis-common-protos = ">=1.56.2,<2.0.0" grpcio = [ - {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, ] proto-plus = [ {version = ">=1.22.3,<2.0.0"}, @@ -2137,92 +2095,89 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] [[package]] name = "google-auth" -version = "2.48.0" +version = "2.43.0" description = "Google Authentication Library" optional = true -python-versions = ">=3.8" +python-versions = ">=3.7" groups = ["main"] markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f"}, - {file = "google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce"}, + {file = "google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16"}, + {file = "google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483"}, ] [package.dependencies] -cryptography = ">=38.0.3" +cachetools = ">=2.0.0,<7.0" pyasn1-modules = ">=0.2.1" requests = {version = ">=2.20.0,<3.0.0", optional = true, markers = "extra == \"requests\""} rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"] -cryptography = ["cryptography (>=38.0.3)"] -enterprise-cert = ["pyopenssl"] -pyjwt = ["pyjwt (>=2.0)"] -pyopenssl = ["pyopenssl (>=20.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"] +pyopenssl = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0)"] -testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "flask", "freezegun", "grpcio", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] +testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] urllib3 = ["packaging", "urllib3"] [[package]] name = "google-cloud-aiplatform" -version = "1.136.0" +version = "1.130.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"google\"" files = [ - {file = "google_cloud_aiplatform-1.136.0-py2.py3-none-any.whl", hash = "sha256:5c829f002b7b673dcd0e718f55cc0557b571bd10eb5cdb7882d72916cfbf8c0e"}, - {file = "google_cloud_aiplatform-1.136.0.tar.gz", hash = "sha256:01e64a0d0861486e842bf7e904077c847bcc1b654a29883509d57476de915b7d"}, + {file = "google_cloud_aiplatform-1.130.0-py2.py3-none-any.whl", hash = "sha256:f578ccee55655dd9e2300cfcafb178e47c3dfdcf746ad465234b875d3e955929"}, + {file = "google_cloud_aiplatform-1.130.0.tar.gz", hash = "sha256:f66aeb23f0a6848fc2d5bbdf1b5777c3cf8e06056f73ef815317abf89d5a0262"}, ] [package.dependencies] docstring_parser = "<1" google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0", extras = ["grpc"]} -google-auth = ">=2.47.0,<3.0.0" +google-auth = ">=2.14.1,<3.0.0" google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0" google-cloud-resource-manager = ">=1.3.3,<3.0.0" google-cloud-storage = [ {version = ">=1.32.0,<4.0.0", markers = "python_version < \"3.13\""}, {version = ">=2.10.0,<4.0.0", markers = "python_version >= \"3.13\""}, ] -google-genai = [ - {version = ">=1.37.0,<2.0.0", markers = "python_version < \"3.10\""}, - {version = ">=1.59.0,<2.0.0", markers = "python_version >= \"3.10\""}, -] +google-genai = ">=1.37.0,<2.0.0" packaging = ">=14.3" proto-plus = ">=1.22.3,<2.0.0" protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" pydantic = "<3" +shapely = "<3.0.0" typing_extensions = "*" [package.extras] -adk = ["google-adk (>=1.0.0,<2.0.0)"] +adk = ["google-adk (>=1.0.0,<2.0.0)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)"] ag2 = ["ag2[gemini]", "openinference-instrumentation-autogen (>=0.1.6,<0.2)"] -ag2-testing = ["absl-py", "ag2[gemini]", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "openinference-instrumentation-autogen (>=0.1.6,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] -agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-iam", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "packaging (>=24.0)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +ag2-testing = ["absl-py", "ag2[gemini]", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "openinference-instrumentation-autogen (>=0.1.6,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "packaging (>=24.0)", "pydantic (>=2.11.1,<3)", "typing_extensions"] autologging = ["mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\""] cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] datasets = ["pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\""] endpoint = ["requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)"] evaluation = ["jsonschema", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "pandas (>=1.0.0)", "pyyaml", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "tqdm (>=4.23.0)"] -full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.124.4)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "jsonschema", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "jsonschema", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)"] langchain = ["langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] -langchain-testing = ["absl-py", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] -lit = ["explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] +langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +lit = ["explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] llama-index = ["llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)"] -llama-index-testing = ["absl-py", "aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +llama-index-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] pipelines = ["pyyaml (>=5.3.1,<7)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.124.4)", "httpx (>=0.23.0,<=0.28.1)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.114.0)", "httpx (>=0.23.0,<=0.28.1)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\""] ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "ray[train]", "scikit-learn (<1.6.0)", "tensorflow ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost_ray"] -reasoningengine = ["aiohttp", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +reasoningengine = ["cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "typing_extensions"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] -testing = ["Pillow", "aiohttp", "bigframes ; python_version >= \"3.10\" and python_version < \"3.14\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.124.4)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-iam", "google-vizier (>=0.1.6)", "google-vizier (>=0.1.6)", "grpcio-testing", "grpcio-tools (>=1.63.0) ; python_version >= \"3.13\"", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "immutabledict", "ipython", "jsonschema", "kfp (>=2.6.0,<3.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.13\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "mock", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "protobuf (<=5.29.4)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-cov", "pytest-xdist", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.14.1) ; python_version <= \"3.11\"", "tensorflow (==2.19.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)", "werkzeug (>=2.0.0,<4.0.0)", "xgboost"] +testing = ["Pillow", "aiohttp", "bigframes ; python_version >= \"3.10\" and python_version < \"3.14\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "google-vizier (>=0.1.6)", "grpcio-testing", "grpcio-tools (>=1.63.0) ; python_version >= \"3.13\"", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "immutabledict", "ipython", "jsonschema", "kfp (>=2.6.0,<3.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "mock", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "protobuf (<=5.29.4)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-cov", "pytest-xdist", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.14.1) ; python_version <= \"3.11\"", "tensorflow (==2.19.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)", "werkzeug (>=2.0.0,<4.0.0)", "xgboost"] tokenization = ["sentencepiece (>=0.2.0)"] vizier = ["google-vizier (>=0.1.6)"] xai = ["tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] @@ -2283,15 +2238,15 @@ grpc = ["grpcio (>=1.38.0,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75. [[package]] name = "google-cloud-iam" -version = "2.21.0" +version = "2.20.0" description = "Google Cloud Iam API client library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"extra-proxy\"" files = [ - {file = "google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4"}, - {file = "google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3"}, + {file = "google_cloud_iam-2.20.0-py3-none-any.whl", hash = "sha256:643fcf6db3100772f222c7173bc1af15541a05ec1c43785191e835146ed150b8"}, + {file = "google_cloud_iam-2.20.0.tar.gz", hash = "sha256:06568ed8313f59fac46d21a5aae4c54eb1dda9f6bcecf2736c58ab1065dc9173"}, ] [package.dependencies] @@ -2382,15 +2337,15 @@ tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] [[package]] name = "google-cloud-storage" -version = "3.9.0" +version = "3.8.0" description = "Google Cloud Storage API client library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"google\" and python_version < \"3.14\"" files = [ - {file = "google_cloud_storage-3.9.0-py3-none-any.whl", hash = "sha256:2dce75a9e8b3387078cbbdad44757d410ecdb916101f8ba308abf202b6968066"}, - {file = "google_cloud_storage-3.9.0.tar.gz", hash = "sha256:f2d8ca7db2f652be757e92573b2196e10fbc09649b5c016f8b422ad593c641cc"}, + {file = "google_cloud_storage-3.8.0-py3-none-any.whl", hash = "sha256:78cfeae7cac2ca9441d0d0271c2eb4ebfa21aa4c6944dd0ccac0389e81d955a7"}, + {file = "google_cloud_storage-3.8.0.tar.gz", hash = "sha256:cc67952dce84ebc9d44970e24647a58260630b7b64d72360cedaf422d6727f28"}, ] [package.dependencies] @@ -2404,7 +2359,6 @@ requests = ">=2.22.0,<3.0.0" [package.extras] grpc = ["google-api-core[grpc] (>=2.27.0,<3.0.0)", "grpc-google-iam-v1 (>=0.14.0,<1.0.0)", "grpcio (>=1.33.2,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.76.0,<2.0.0)", "proto-plus (>=1.22.3,<2.0.0) ; python_version < \"3.13\"", "proto-plus (>=1.25.0,<2.0.0) ; python_version >= \"3.13\"", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0)"] protobuf = ["protobuf (>=3.20.2,<7.0.0)"] -testing = ["PyYAML", "black", "brotli", "coverage", "flake8", "google-cloud-iam", "google-cloud-kms", "google-cloud-pubsub", "google-cloud-testutils", "google-cloud-testutils", "mock", "numpy", "opentelemetry-sdk", "psutil", "py-cpuinfo", "pyopenssl", "pytest", "pytest-asyncio", "pytest-benchmark", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"] tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] [[package]] @@ -2458,7 +2412,7 @@ description = "GenAI Python SDK" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"google\" and python_version == \"3.9\"" +markers = "python_version == \"3.9\" and extra == \"google\"" files = [ {file = "google_genai-1.47.0-py3-none-any.whl", hash = "sha256:e3851237556cbdec96007d8028b4b1f2425cdc5c099a8dc36b72a57e42821b60"}, {file = "google_genai-1.47.0.tar.gz", hash = "sha256:ecece00d0a04e6739ea76cc8dad82ec9593d9380aaabef078990e60574e5bf59"}, @@ -2480,21 +2434,21 @@ local-tokenizer = ["protobuf", "sentencepiece (>=0.2.0)"] [[package]] name = "google-genai" -version = "1.62.0" +version = "1.55.0" description = "GenAI Python SDK" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"google\"" files = [ - {file = "google_genai-1.62.0-py3-none-any.whl", hash = "sha256:4c3daeff3d05fafee4b9a1a31f9c07f01bc22051081aa58b4d61f58d16d1bcc0"}, - {file = "google_genai-1.62.0.tar.gz", hash = "sha256:709468a14c739a080bc240a4f3191df597bf64485b1ca3728e0fb67517774c18"}, + {file = "google_genai-1.55.0-py3-none-any.whl", hash = "sha256:98c422762b5ff6e16b8d9a1e4938e8e0ad910392a5422e47f5301498d7f373a1"}, + {file = "google_genai-1.55.0.tar.gz", hash = "sha256:ae9f1318fedb05c7c1b671a4148724751201e8908a87568364a309804064d986"}, ] [package.dependencies] anyio = ">=4.8.0,<5.0.0" distro = ">=1.7.0,<2" -google-auth = {version = ">=2.47.0,<3.0.0", extras = ["requests"]} +google-auth = {version = ">=2.14.1,<3.0.0", extras = ["requests"]} httpx = ">=0.28.1,<1.0.0" pydantic = ">=2.9.0,<3.0.0" requests = ">=2.28.1,<3.0.0" @@ -2601,66 +2555,79 @@ graphql-core = ">=3.2,<3.3" [[package]] name = "greenlet" -version = "3.3.1" +version = "3.2.4" description = "Lightweight in-process concurrent programming" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version >= \"3.10\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") and extra == \"mlflow\"" +markers = "python_version >= \"3.10\" and extra == \"mlflow\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" files = [ - {file = "greenlet-3.3.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13"}, - {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4"}, - {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5"}, - {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1108b61b06b5224656121c3c8ee8876161c491cbe74e5c519e0634c837cf93d5"}, - {file = "greenlet-3.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe"}, - {file = "greenlet-3.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729"}, - {file = "greenlet-3.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4"}, - {file = "greenlet-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:7932f5f57609b6a3b82cc11877709aa7a98e3308983ed93552a1c377069b20c8"}, - {file = "greenlet-3.3.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c"}, - {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd"}, - {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5"}, - {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f"}, - {file = "greenlet-3.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2"}, - {file = "greenlet-3.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9"}, - {file = "greenlet-3.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f"}, - {file = "greenlet-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:32e4ca9777c5addcbf42ff3915d99030d8e00173a56f80001fb3875998fe410b"}, - {file = "greenlet-3.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:da19609432f353fed186cc1b85e9440db93d489f198b4bdf42ae19cc9d9ac9b4"}, - {file = "greenlet-3.3.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975"}, - {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36"}, - {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba"}, - {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c620051669fd04ac6b60ebc70478210119c56e2d5d5df848baec4312e260e4ca"}, - {file = "greenlet-3.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336"}, - {file = "greenlet-3.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1"}, - {file = "greenlet-3.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149"}, - {file = "greenlet-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cc98b9c4e4870fa983436afa999d4eb16b12872fab7071423d5262fa7120d57a"}, - {file = "greenlet-3.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bfb2d1763d777de5ee495c85309460f6fd8146e50ec9d0ae0183dbf6f0a829d1"}, - {file = "greenlet-3.3.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3"}, - {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac"}, - {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd"}, - {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e"}, - {file = "greenlet-3.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3"}, - {file = "greenlet-3.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951"}, - {file = "greenlet-3.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2"}, - {file = "greenlet-3.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:27289986f4e5b0edec7b5a91063c109f0276abb09a7e9bdab08437525977c946"}, - {file = "greenlet-3.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:2f080e028001c5273e0b42690eaf359aeef9cb1389da0f171ea51a5dc3c7608d"}, - {file = "greenlet-3.3.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5"}, - {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b"}, - {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e"}, - {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d"}, - {file = "greenlet-3.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f"}, - {file = "greenlet-3.3.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683"}, - {file = "greenlet-3.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1"}, - {file = "greenlet-3.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:96aff77af063b607f2489473484e39a0bbae730f2ea90c9e5606c9b73c44174a"}, - {file = "greenlet-3.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:b066e8b50e28b503f604fa538adc764a638b38cf8e81e025011d26e8a627fa79"}, - {file = "greenlet-3.3.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242"}, - {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774"}, - {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97"}, - {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab"}, - {file = "greenlet-3.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2"}, - {file = "greenlet-3.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53"}, - {file = "greenlet-3.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249"}, - {file = "greenlet-3.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:301860987846c24cb8964bdec0e31a96ad4a2a801b41b4ef40963c1b44f33451"}, - {file = "greenlet-3.3.1.tar.gz", hash = "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98"}, + {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8"}, + {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, + {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5"}, + {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, + {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d"}, + {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, + {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929"}, + {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, + {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681"}, + {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, + {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be"}, + {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, + {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, + {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, ] [package.extras] @@ -2687,73 +2654,73 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [[package]] name = "grpcio" -version = "1.78.0" +version = "1.76.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "grpcio-1.78.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:7cc47943d524ee0096f973e1081cb8f4f17a4615f2116882a5f1416e4cfe92b5"}, - {file = "grpcio-1.78.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c3f293fdc675ccba4db5a561048cca627b5e7bd1c8a6973ffedabe7d116e22e2"}, - {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10a9a644b5dd5aec3b82b5b0b90d41c0fa94c85ef42cb42cf78a23291ddb5e7d"}, - {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c5533d03a6cbd7f56acfc9cfb44ea64f63d29091e40e44010d34178d392d7eb"}, - {file = "grpcio-1.78.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff870aebe9a93a85283837801d35cd5f8814fe2ad01e606861a7fb47c762a2b7"}, - {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:391e93548644e6b2726f1bb84ed60048d4bcc424ce5e4af0843d28ca0b754fec"}, - {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:df2c8f3141f7cbd112a6ebbd760290b5849cda01884554f7c67acc14e7b1758a"}, - {file = "grpcio-1.78.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd8cb8026e5f5b50498a3c4f196f57f9db344dad829ffae16b82e4fdbaea2813"}, - {file = "grpcio-1.78.0-cp310-cp310-win32.whl", hash = "sha256:f8dff3d9777e5d2703a962ee5c286c239bf0ba173877cc68dc02c17d042e29de"}, - {file = "grpcio-1.78.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f95cf5d532d0e717eed4fc1810e8e6eded04621342ec54c89a7c2f14b581bf"}, - {file = "grpcio-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2777b783f6c13b92bd7b716667452c329eefd646bfb3f2e9dabea2e05dbd34f6"}, - {file = "grpcio-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9dca934f24c732750389ce49d638069c3892ad065df86cb465b3fa3012b70c9e"}, - {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:459ab414b35f4496138d0ecd735fed26f1318af5e52cb1efbc82a09f0d5aa911"}, - {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:082653eecbdf290e6e3e2c276ab2c54b9e7c299e07f4221872380312d8cf395e"}, - {file = "grpcio-1.78.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85f93781028ec63f383f6bc90db785a016319c561cc11151fbb7b34e0d012303"}, - {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f12857d24d98441af6a1d5c87442d624411db486f7ba12550b07788f74b67b04"}, - {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5397fff416b79e4b284959642a4e95ac4b0f1ece82c9993658e0e477d40551ec"}, - {file = "grpcio-1.78.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbe6e89c7ffb48518384068321621b2a69cab509f58e40e4399fdd378fa6d074"}, - {file = "grpcio-1.78.0-cp311-cp311-win32.whl", hash = "sha256:6092beabe1966a3229f599d7088b38dfc8ffa1608b5b5cdda31e591e6500f856"}, - {file = "grpcio-1.78.0-cp311-cp311-win_amd64.whl", hash = "sha256:1afa62af6e23f88629f2b29ec9e52ec7c65a7176c1e0a83292b93c76ca882558"}, - {file = "grpcio-1.78.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f9ab915a267fc47c7e88c387a3a28325b58c898e23d4995f765728f4e3dedb97"}, - {file = "grpcio-1.78.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3f8904a8165ab21e07e58bf3e30a73f4dffc7a1e0dbc32d51c61b5360d26f43e"}, - {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:859b13906ce098c0b493af92142ad051bf64c7870fa58a123911c88606714996"}, - {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b2342d87af32790f934a79c3112641e7b27d63c261b8b4395350dad43eff1dc7"}, - {file = "grpcio-1.78.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12a771591ae40bc65ba67048fa52ef4f0e6db8279e595fd349f9dfddeef571f9"}, - {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:185dea0d5260cbb2d224c507bf2a5444d5abbb1fa3594c1ed7e4c709d5eb8383"}, - {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51b13f9aed9d59ee389ad666b8c2214cc87b5de258fa712f9ab05f922e3896c6"}, - {file = "grpcio-1.78.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd5f135b1bd58ab088930b3c613455796dfa0393626a6972663ccdda5b4ac6ce"}, - {file = "grpcio-1.78.0-cp312-cp312-win32.whl", hash = "sha256:94309f498bcc07e5a7d16089ab984d42ad96af1d94b5a4eb966a266d9fcabf68"}, - {file = "grpcio-1.78.0-cp312-cp312-win_amd64.whl", hash = "sha256:9566fe4ababbb2610c39190791e5b829869351d14369603702e890ef3ad2d06e"}, - {file = "grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b"}, - {file = "grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a"}, - {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84"}, - {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb"}, - {file = "grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5"}, - {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9"}, - {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702"}, - {file = "grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20"}, - {file = "grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670"}, - {file = "grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4"}, - {file = "grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e"}, - {file = "grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f"}, - {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724"}, - {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b"}, - {file = "grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7"}, - {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452"}, - {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127"}, - {file = "grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65"}, - {file = "grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c"}, - {file = "grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb"}, - {file = "grpcio-1.78.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:86f85dd7c947baa707078a236288a289044836d4b640962018ceb9cd1f899af5"}, - {file = "grpcio-1.78.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:de8cb00d1483a412a06394b8303feec5dcb3b55f81d83aa216dbb6a0b86a94f5"}, - {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e888474dee2f59ff68130f8a397792d8cb8e17e6b3434339657ba4ee90845a8c"}, - {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:86ce2371bfd7f212cf60d8517e5e854475c2c43ce14aa910e136ace72c6db6c1"}, - {file = "grpcio-1.78.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0c689c02947d636bc7fab3e30cc3a3445cca99c834dfb77cd4a6cabfc1c5597"}, - {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ce7599575eeb25c0f4dc1be59cada6219f3b56176f799627f44088b21381a28a"}, - {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:684083fd383e9dc04c794adb838d4faea08b291ce81f64ecd08e4577c7398adf"}, - {file = "grpcio-1.78.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ab399ef5e3cd2a721b1038a0f3021001f19c5ab279f145e1146bb0b9f1b2b12c"}, - {file = "grpcio-1.78.0-cp39-cp39-win32.whl", hash = "sha256:f3d6379493e18ad4d39537a82371c5281e153e963cecb13f953ebac155756525"}, - {file = "grpcio-1.78.0-cp39-cp39-win_amd64.whl", hash = "sha256:5361a0630a7fdb58a6a97638ab70e1dae2893c4d08d7aba64ded28bb9e7a29df"}, - {file = "grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5"}, + {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"}, + {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"}, + {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3"}, + {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990"}, + {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af"}, + {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2"}, + {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6"}, + {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3"}, + {file = "grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b"}, + {file = "grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b"}, + {file = "grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a"}, + {file = "grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c"}, + {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465"}, + {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48"}, + {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da"}, + {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397"}, + {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749"}, + {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00"}, + {file = "grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054"}, + {file = "grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d"}, + {file = "grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8"}, + {file = "grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280"}, + {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4"}, + {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11"}, + {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6"}, + {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8"}, + {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980"}, + {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882"}, + {file = "grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958"}, + {file = "grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347"}, + {file = "grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2"}, + {file = "grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468"}, + {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3"}, + {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb"}, + {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae"}, + {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77"}, + {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03"}, + {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42"}, + {file = "grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f"}, + {file = "grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8"}, + {file = "grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62"}, + {file = "grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd"}, + {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc"}, + {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a"}, + {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba"}, + {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09"}, + {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc"}, + {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc"}, + {file = "grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e"}, + {file = "grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e"}, + {file = "grpcio-1.76.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:8ebe63ee5f8fa4296b1b8cfc743f870d10e902ca18afc65c68cf46fd39bb0783"}, + {file = "grpcio-1.76.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:3bf0f392c0b806905ed174dcd8bdd5e418a40d5567a05615a030a5aeddea692d"}, + {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b7604868b38c1bfd5cf72d768aedd7db41d78cb6a4a18585e33fb0f9f2363fd"}, + {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e6d1db20594d9daba22f90da738b1a0441a7427552cc6e2e3d1297aeddc00378"}, + {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d099566accf23d21037f18a2a63d323075bebace807742e4b0ac210971d4dd70"}, + {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebea5cc3aa8ea72e04df9913492f9a96d9348db876f9dda3ad729cfedf7ac416"}, + {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0c37db8606c258e2ee0c56b78c62fc9dee0e901b5dbdcf816c2dd4ad652b8b0c"}, + {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ebebf83299b0cb1721a8859ea98f3a77811e35dce7609c5c963b9ad90728f886"}, + {file = "grpcio-1.76.0-cp39-cp39-win32.whl", hash = "sha256:0aaa82d0813fd4c8e589fac9b65d7dd88702555f702fb10417f96e2a2a6d4c0f"}, + {file = "grpcio-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a"}, + {file = "grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73"}, ] markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or extra == \"grpc\""} @@ -2761,25 +2728,25 @@ markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or extra == \ typing-extensions = ">=4.12,<5.0" [package.extras] -protobuf = ["grpcio-tools (>=1.78.0)"] +protobuf = ["grpcio-tools (>=1.76.0)"] [[package]] name = "grpcio-status" -version = "1.71.2" +version = "1.62.3" description = "Status proto mapping for gRPC" optional = true -python-versions = ">=3.9" +python-versions = ">=3.6" groups = ["main"] markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ - {file = "grpcio_status-1.71.2-py3-none-any.whl", hash = "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3"}, - {file = "grpcio_status-1.71.2.tar.gz", hash = "sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50"}, + {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, + {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.71.2" -protobuf = ">=5.26.1,<6.0.dev0" +grpcio = ">=1.62.3" +protobuf = ">=4.21.6" [[package]] name = "gunicorn" @@ -2788,7 +2755,7 @@ description = "WSGI HTTP Server for UNIX" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(python_version <= \"3.13\" or extra == \"mlflow\" or extra == \"proxy\") and (platform_system != \"Windows\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"mlflow\") and (python_version >= \"3.10\" or extra == \"proxy\")" +markers = "extra == \"proxy\" or python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") and platform_system != \"Windows\"" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -2942,30 +2909,31 @@ files = [ [[package]] name = "huey" -version = "2.6.0" -description = "a little task queue" +version = "2.5.4" +description = "huey, a little task queue" optional = true python-versions = "*" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "huey-2.6.0-py3-none-any.whl", hash = "sha256:1b9df9d370b49c6d5721ba8a01ac9a787cf86b3bdc584e4679de27b920395c3f"}, - {file = "huey-2.6.0.tar.gz", hash = "sha256:8d11f8688999d65266af1425b831f6e3773e99415027177b8734b0ffd5e251f6"}, + {file = "huey-2.5.4-py3-none-any.whl", hash = "sha256:0eac1fb2711f6366a1db003629354a0cea470a3db720d5bab0d140c28e993f9c"}, + {file = "huey-2.5.4.tar.gz", hash = "sha256:4b7fb217b640fbb46efc4f4681b446b40726593522f093e8ef27c4a8fcb6cfbb"}, ] [package.extras] backends = ["redis (>=3.0.0)"] +redis = ["redis (>=3.0.0)"] [[package]] name = "huggingface-hub" -version = "1.4.1" +version = "1.1.5" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18"}, - {file = "huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5"}, + {file = "huggingface_hub-1.1.5-py3-none-any.whl", hash = "sha256:e88ecc129011f37b868586bbcfae6c56868cae80cd56a79d61575426a3aa0d7d"}, + {file = "huggingface_hub-1.1.5.tar.gz", hash = "sha256:40ba5c9a08792d888fde6088920a0a71ab3cd9d5e6617c81a797c657f1fd9968"}, ] [package.dependencies] @@ -2978,13 +2946,13 @@ pyyaml = ">=5.1" shellingham = "*" tqdm = ">=4.42.1" typer-slim = "*" -typing-extensions = ">=4.1.0" +typing-extensions = ">=3.7.4.3" [package.extras] all = ["Jinja2", "Pillow", "authlib (>=1.3.2)", "fastapi", "fastapi", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "numpy", "pytest (>=8.4.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures (<16.0)", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "ty", "types-PyYAML", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] dev = ["Jinja2", "Pillow", "authlib (>=1.3.2)", "fastapi", "fastapi", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "numpy", "pytest (>=8.4.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures (<16.0)", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "ty", "types-PyYAML", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -hf-xet = ["hf-xet (>=1.2.0,<2.0.0)"] +hf-xet = ["hf-xet (>=1.1.3,<2.0.0)"] mcp = ["mcp (>=1.8.0)"] oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"] quality = ["libcst (>=1.4.0)", "mypy (==1.15.0)", "ruff (>=0.9.0)", "ty"] @@ -3076,27 +3044,23 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.7.1" +version = "7.1.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, - {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] -zipp = ">=3.20" +zipp = ">=0.5" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=3.4)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -test = ["flufl.flake8", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -3170,140 +3134,140 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.13.0" +version = "0.12.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "jiter-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2ffc63785fd6c7977defe49b9824ae6ce2b2e2b77ce539bdaf006c26da06342e"}, - {file = "jiter-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a638816427006c1e3f0013eb66d391d7a3acda99a7b0cf091eff4497ccea33a"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19928b5d1ce0ff8c1ee1b9bdef3b5bfc19e8304f1b904e436caf30bc15dc6cf5"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:309549b778b949d731a2f0e1594a3f805716be704a73bf3ad9a807eed5eb5721"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcdabaea26cb04e25df3103ce47f97466627999260290349a88c8136ecae0060"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a377af27b236abbf665a69b2bdd680e3b5a0bd2af825cd3b81245279a7606c"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe49d3ff6db74321f144dff9addd4a5874d3105ac5ba7c5b77fac099cfae31ae"}, - {file = "jiter-0.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2113c17c9a67071b0f820733c0893ed1d467b5fcf4414068169e5c2cabddb1e2"}, - {file = "jiter-0.13.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab1185ca5c8b9491b55ebf6c1e8866b8f68258612899693e24a92c5fdb9455d5"}, - {file = "jiter-0.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9621ca242547edc16400981ca3231e0c91c0c4c1ab8573a596cd9bb3575d5c2b"}, - {file = "jiter-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a7637d92b1c9d7a771e8c56f445c7f84396d48f2e756e5978840ecba2fac0894"}, - {file = "jiter-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c1b609e5cbd2f52bb74fb721515745b407df26d7b800458bd97cb3b972c29e7d"}, - {file = "jiter-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ea026e70a9a28ebbdddcbcf0f1323128a8db66898a06eaad3a4e62d2f554d096"}, - {file = "jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec7e287d7fbd02cb6e22f9a00dd9c9cd504c40a61f2c61e7e1f9690a82726b4c"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47455245307e4debf2ce6c6e65a717550a0244231240dcf3b8f7d64e4c2f22f4"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee9da221dca6e0429c2704c1b3655fe7b025204a71d4d9b73390c759d776d165"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24ab43126d5e05f3d53a36a8e11eb2f23304c6c1117844aaaf9a0aa5e40b5018"}, - {file = "jiter-0.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9da38b4fedde4fb528c740c2564628fbab737166a0e73d6d46cb4bb5463ff411"}, - {file = "jiter-0.13.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b34c519e17658ed88d5047999a93547f8889f3c1824120c26ad6be5f27b6cf5"}, - {file = "jiter-0.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2a6394e6af690d462310a86b53c47ad75ac8c21dc79f120714ea449979cb1d3"}, - {file = "jiter-0.13.0-cp311-cp311-win32.whl", hash = "sha256:0f0c065695f616a27c920a56ad0d4fc46415ef8b806bf8fc1cacf25002bd24e1"}, - {file = "jiter-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:0733312953b909688ae3c2d58d043aa040f9f1a6a75693defed7bc2cc4bf2654"}, - {file = "jiter-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:5d9b34ad56761b3bf0fbe8f7e55468704107608512350962d3317ffd7a4382d5"}, - {file = "jiter-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0a2bd69fc1d902e89925fc34d1da51b2128019423d7b339a45d9e99c894e0663"}, - {file = "jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93"}, - {file = "jiter-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b88d649135aca526da172e48083da915ec086b54e8e73a425ba50999468cc08"}, - {file = "jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2"}, - {file = "jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228"}, - {file = "jiter-0.13.0-cp312-cp312-win32.whl", hash = "sha256:0bf670e3b1445fc4d31612199f1744f67f889ee1bbae703c4b54dc097e5dd394"}, - {file = "jiter-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:15db60e121e11fe186c0b15236bd5d18381b9ddacdcf4e659feb96fc6c969c92"}, - {file = "jiter-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:41f92313d17989102f3cb5dd533a02787cdb99454d494344b0361355da52fcb9"}, - {file = "jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf"}, - {file = "jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663"}, - {file = "jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa"}, - {file = "jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820"}, - {file = "jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68"}, - {file = "jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72"}, - {file = "jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc"}, - {file = "jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b"}, - {file = "jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10"}, - {file = "jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef"}, - {file = "jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6"}, - {file = "jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d"}, - {file = "jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d"}, - {file = "jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0"}, - {file = "jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad"}, - {file = "jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d"}, - {file = "jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df"}, - {file = "jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d"}, - {file = "jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6"}, - {file = "jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f"}, - {file = "jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d"}, - {file = "jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59"}, - {file = "jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe"}, - {file = "jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939"}, - {file = "jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9"}, - {file = "jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6"}, - {file = "jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8"}, - {file = "jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024"}, - {file = "jiter-0.13.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4397ee562b9f69d283e5674445551b47a5e8076fdde75e71bfac5891113dc543"}, - {file = "jiter-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f90023f8f672e13ea1819507d2d21b9d2d1c18920a3b3a5f1541955a85b5504"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed0240dd1536a98c3ab55e929c60dfff7c899fecafcb7d01161b21a99fc8c363"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6207fc61c395b26fffdcf637a0b06b4326f35bfa93c6e92fe1a166a21aeb6731"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00203f47c214156df427b5989de74cb340c65c8180d09be1bf9de81d0abad599"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c26ad6967c9dcedf10c995a21539c3aa57d4abad7001b7a84f621a263a6b605"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a576f5dce9ac7de5d350b8e2f552cf364f32975ed84717c35379a51c7cb198bd"}, - {file = "jiter-0.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b22945be8425d161f2e536cdae66da300b6b000f1c0ba3ddf237d1bfd45d21b8"}, - {file = "jiter-0.13.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6eeb7db8bc77dc20476bc2f7407a23dbe3d46d9cc664b166e3d474e1c1de4baa"}, - {file = "jiter-0.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:19cd6f85e1dc090277c3ce90a5b7d96f32127681d825e71c9dce28788e39fc0c"}, - {file = "jiter-0.13.0-cp39-cp39-win32.whl", hash = "sha256:dc3ce84cfd4fa9628fe62c4f85d0d597a4627d4242cfafac32a12cc1455d00f7"}, - {file = "jiter-0.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9ffda299e417dc83362963966c50cb76d42da673ee140de8a8ac762d4bb2378b"}, - {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b1cbfa133241d0e6bdab48dcdc2604e8ba81512f6bbd68ec3e8e1357dd3c316c"}, - {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:db367d8be9fad6e8ebbac4a7578b7af562e506211036cba2c06c3b998603c3d2"}, - {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f6f8efb2f3b0603092401dc2df79fa89ccbc027aaba4174d2d4133ed661434"}, - {file = "jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597245258e6ad085d064780abfb23a284d418d3e61c57362d9449c6c7317ee2d"}, - {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:3d744a6061afba08dd7ae375dcde870cffb14429b7477e10f67e9e6d68772a0a"}, - {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f"}, - {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59"}, - {file = "jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19"}, - {file = "jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4"}, + {file = "jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65"}, + {file = "jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2"}, + {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025"}, + {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca"}, + {file = "jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4"}, + {file = "jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11"}, + {file = "jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9"}, + {file = "jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725"}, + {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6"}, + {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e"}, + {file = "jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c"}, + {file = "jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f"}, + {file = "jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5"}, + {file = "jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37"}, + {file = "jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126"}, + {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9"}, + {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86"}, + {file = "jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44"}, + {file = "jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb"}, + {file = "jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789"}, + {file = "jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e"}, + {file = "jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9"}, + {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626"}, + {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c"}, + {file = "jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de"}, + {file = "jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a"}, + {file = "jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60"}, + {file = "jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6"}, + {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4"}, + {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb"}, + {file = "jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7"}, + {file = "jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3"}, + {file = "jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525"}, + {file = "jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a"}, + {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67"}, + {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b"}, + {file = "jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42"}, + {file = "jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf"}, + {file = "jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451"}, + {file = "jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783"}, + {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b"}, + {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6"}, + {file = "jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183"}, + {file = "jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873"}, + {file = "jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473"}, + {file = "jiter-0.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9d28b218d5f9e5f69a0787a196322a5056540cb378cac8ff542b4fa7219966c"}, + {file = "jiter-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0ee12028daf8cfcf880dd492349a122a64f42c059b6c62a2b0c96a83a8da820"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b135ebe757a82d67ed2821526e72d0acf87dd61f6013e20d3c45b8048af927b"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15d7fafb81af8a9e3039fc305529a61cd933eecee33b4251878a1c89859552a3"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92d1f41211d8a8fe412faad962d424d334764c01dac6691c44691c2e4d3eedaf"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a64a48d7c917b8f32f25c176df8749ecf08cec17c466114727efe7441e17f6d"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122046f3b3710b85de99d9aa2f3f0492a8233a2f54a64902b096efc27ea747b5"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:27ec39225e03c32c6b863ba879deb427882f243ae46f0d82d68b695fa5b48b40"}, + {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26b9e155ddc132225a39b1995b3b9f0fe0f79a6d5cbbeacf103271e7d309b404"}, + {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab05b7c58e29bb9e60b70c2e0094c98df79a1e42e397b9bb6eaa989b7a66dd0"}, + {file = "jiter-0.12.0-cp39-cp39-win32.whl", hash = "sha256:59f9f9df87ed499136db1c2b6c9efb902f964bed42a582ab7af413b6a293e7b0"}, + {file = "jiter-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3719596a1ebe7a48a498e8d5d0c4bf7553321d4c3eee1d620628d51351a3928"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c"}, + {file = "jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b"}, ] [[package]] name = "jmespath" -version = "1.1.0" +version = "1.0.1" description = "JSON Matching Expressions" optional = true -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64"}, - {file = "jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d"}, + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] [[package]] name = "joblib" -version = "1.5.3" +version = "1.5.2" description = "Lightweight pipelining with Python functions" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, - {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, + {file = "joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241"}, + {file = "joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55"}, ] [[package]] @@ -3313,7 +3277,6 @@ description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\"" files = [ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, @@ -3329,29 +3292,6 @@ rpds-py = ">=0.7.1" format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] -[[package]] -name = "jsonschema" -version = "4.26.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\"" -files = [ - {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, - {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.3.6" -referencing = ">=0.28.4" -rpds-py = ">=0.25.0" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] - [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -3506,93 +3446,6 @@ langchain = ["langchain (>=0.0.309)"] llama-index = ["llama-index (>=0.10.12,<2.0.0)"] openai = ["openai (>=0.27.8)"] -[[package]] -name = "librt" -version = "0.7.8" -description = "Mypyc runtime library" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "platform_python_implementation != \"PyPy\"" -files = [ - {file = "librt-0.7.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b45306a1fc5f53c9330fbee134d8b3227fe5da2ab09813b892790400aa49352d"}, - {file = "librt-0.7.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:864c4b7083eeee250ed55135d2127b260d7eb4b5e953a9e5df09c852e327961b"}, - {file = "librt-0.7.8-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6938cc2de153bc927ed8d71c7d2f2ae01b4e96359126c602721340eb7ce1a92d"}, - {file = "librt-0.7.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:66daa6ac5de4288a5bbfbe55b4caa7bf0cd26b3269c7a476ffe8ce45f837f87d"}, - {file = "librt-0.7.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4864045f49dc9c974dadb942ac56a74cd0479a2aafa51ce272c490a82322ea3c"}, - {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a36515b1328dc5b3ffce79fe204985ca8572525452eacabee2166f44bb387b2c"}, - {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b7e7f140c5169798f90b80d6e607ed2ba5059784968a004107c88ad61fb3641d"}, - {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff71447cb778a4f772ddc4ce360e6ba9c95527ed84a52096bd1bbf9fee2ec7c0"}, - {file = "librt-0.7.8-cp310-cp310-win32.whl", hash = "sha256:047164e5f68b7a8ebdf9fae91a3c2161d3192418aadd61ddd3a86a56cbe3dc85"}, - {file = "librt-0.7.8-cp310-cp310-win_amd64.whl", hash = "sha256:d6f254d096d84156a46a84861183c183d30734e52383602443292644d895047c"}, - {file = "librt-0.7.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3e9c11aa260c31493d4b3197d1e28dd07768594a4f92bec4506849d736248f"}, - {file = "librt-0.7.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb52499d0b3ed4aa88746aaf6f36a08314677d5c346234c3987ddc506404eac"}, - {file = "librt-0.7.8-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e9c0afebbe6ce177ae8edba0c7c4d626f2a0fc12c33bb993d163817c41a7a05c"}, - {file = "librt-0.7.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:631599598e2c76ded400c0a8722dec09217c89ff64dc54b060f598ed68e7d2a8"}, - {file = "librt-0.7.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c1ba843ae20db09b9d5c80475376168feb2640ce91cd9906414f23cc267a1ff"}, - {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b5b007bb22ea4b255d3ee39dfd06d12534de2fcc3438567d9f48cdaf67ae1ae3"}, - {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbd79caaf77a3f590cbe32dc2447f718772d6eea59656a7dcb9311161b10fa75"}, - {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:87808a8d1e0bd62a01cafc41f0fd6818b5a5d0ca0d8a55326a81643cdda8f873"}, - {file = "librt-0.7.8-cp311-cp311-win32.whl", hash = "sha256:31724b93baa91512bd0a376e7cf0b59d8b631ee17923b1218a65456fa9bda2e7"}, - {file = "librt-0.7.8-cp311-cp311-win_amd64.whl", hash = "sha256:978e8b5f13e52cf23a9e80f3286d7546baa70bc4ef35b51d97a709d0b28e537c"}, - {file = "librt-0.7.8-cp311-cp311-win_arm64.whl", hash = "sha256:20e3946863d872f7cabf7f77c6c9d370b8b3d74333d3a32471c50d3a86c0a232"}, - {file = "librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63"}, - {file = "librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93"}, - {file = "librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592"}, - {file = "librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850"}, - {file = "librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62"}, - {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b"}, - {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714"}, - {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449"}, - {file = "librt-0.7.8-cp312-cp312-win32.whl", hash = "sha256:0241a6ed65e6666236ea78203a73d800dbed896cf12ae25d026d75dc1fcd1dac"}, - {file = "librt-0.7.8-cp312-cp312-win_amd64.whl", hash = "sha256:6db5faf064b5bab9675c32a873436b31e01d66ca6984c6f7f92621656033a708"}, - {file = "librt-0.7.8-cp312-cp312-win_arm64.whl", hash = "sha256:57175aa93f804d2c08d2edb7213e09276bd49097611aefc37e3fa38d1fb99ad0"}, - {file = "librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc"}, - {file = "librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2"}, - {file = "librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3"}, - {file = "librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6"}, - {file = "librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d"}, - {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e"}, - {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca"}, - {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93"}, - {file = "librt-0.7.8-cp313-cp313-win32.whl", hash = "sha256:b09c52ed43a461994716082ee7d87618096851319bf695d57ec123f2ab708951"}, - {file = "librt-0.7.8-cp313-cp313-win_amd64.whl", hash = "sha256:f8f4a901a3fa28969d6e4519deceab56c55a09d691ea7b12ca830e2fa3461e34"}, - {file = "librt-0.7.8-cp313-cp313-win_arm64.whl", hash = "sha256:43d4e71b50763fcdcf64725ac680d8cfa1706c928b844794a7aa0fa9ac8e5f09"}, - {file = "librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418"}, - {file = "librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611"}, - {file = "librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758"}, - {file = "librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea"}, - {file = "librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac"}, - {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398"}, - {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81"}, - {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83"}, - {file = "librt-0.7.8-cp314-cp314-win32.whl", hash = "sha256:7aa7d5457b6c542ecaed79cec4ad98534373c9757383973e638ccced0f11f46d"}, - {file = "librt-0.7.8-cp314-cp314-win_amd64.whl", hash = "sha256:3d1322800771bee4a91f3b4bd4e49abc7d35e65166821086e5afd1e6c0d9be44"}, - {file = "librt-0.7.8-cp314-cp314-win_arm64.whl", hash = "sha256:5363427bc6a8c3b1719f8f3845ea53553d301382928a86e8fab7984426949bce"}, - {file = "librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f"}, - {file = "librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde"}, - {file = "librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e"}, - {file = "librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b"}, - {file = "librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666"}, - {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581"}, - {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a"}, - {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca"}, - {file = "librt-0.7.8-cp314-cp314t-win32.whl", hash = "sha256:171ca3a0a06c643bd0a2f62a8944e1902c94aa8e5da4db1ea9a8daf872685365"}, - {file = "librt-0.7.8-cp314-cp314t-win_amd64.whl", hash = "sha256:445b7304145e24c60288a2f172b5ce2ca35c0f81605f5299f3fa567e189d2e32"}, - {file = "librt-0.7.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8766ece9de08527deabcd7cb1b4f1a967a385d26e33e536d6d8913db6ef74f06"}, - {file = "librt-0.7.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c7e8f88f79308d86d8f39c491773cbb533d6cb7fa6476f35d711076ee04fceb6"}, - {file = "librt-0.7.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:389bd25a0db916e1d6bcb014f11aa9676cedaa485e9ec3752dfe19f196fd377b"}, - {file = "librt-0.7.8-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73fd300f501a052f2ba52ede721232212f3b06503fa12665408ecfc9d8fd149c"}, - {file = "librt-0.7.8-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d772edc6a5f7835635c7562f6688e031f0b97e31d538412a852c49c9a6c92d5"}, - {file = "librt-0.7.8-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde8a130bd0f239e45503ab39fab239ace094d63ee1d6b67c25a63d741c0f71"}, - {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fdec6e2368ae4f796fc72fad7fd4bd1753715187e6d870932b0904609e7c878e"}, - {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:00105e7d541a8f2ee5be52caacea98a005e0478cfe78c8080fbb7b5d2b340c63"}, - {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c6f8947d3dfd7f91066c5b4385812c18be26c9d5a99ca56667547f2c39149d94"}, - {file = "librt-0.7.8-cp39-cp39-win32.whl", hash = "sha256:41d7bb1e07916aeb12ae4a44e3025db3691c4149ab788d0315781b4d29b86afb"}, - {file = "librt-0.7.8-cp39-cp39-win_amd64.whl", hash = "sha256:e90a8e237753c83b8e484d478d9a996dc5e39fd5bd4c6ce32563bc8123f132be"}, - {file = "librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862"}, -] - [[package]] name = "litellm-enterprise" version = "0.1.27" @@ -3792,68 +3645,68 @@ files = [ [[package]] name = "matplotlib" -version = "3.10.8" +version = "3.10.7" description = "Python plotting package" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, - {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, - {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, - {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, - {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, - {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, - {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, - {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, - {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, - {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, - {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, + {file = "matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380"}, + {file = "matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d"}, + {file = "matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297"}, + {file = "matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42"}, + {file = "matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7"}, + {file = "matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3"}, + {file = "matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a"}, + {file = "matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6"}, + {file = "matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a"}, + {file = "matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1"}, + {file = "matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc"}, + {file = "matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e"}, + {file = "matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9"}, + {file = "matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748"}, + {file = "matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f"}, + {file = "matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0"}, + {file = "matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695"}, + {file = "matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65"}, + {file = "matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee"}, + {file = "matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8"}, + {file = "matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f"}, + {file = "matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c"}, + {file = "matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1"}, + {file = "matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632"}, + {file = "matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84"}, + {file = "matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815"}, + {file = "matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7"}, + {file = "matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355"}, + {file = "matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b"}, + {file = "matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67"}, + {file = "matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67"}, + {file = "matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84"}, + {file = "matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2"}, + {file = "matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf"}, + {file = "matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100"}, + {file = "matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f"}, + {file = "matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715"}, + {file = "matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1"}, + {file = "matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722"}, + {file = "matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866"}, + {file = "matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb"}, + {file = "matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1"}, + {file = "matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4"}, + {file = "matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318"}, + {file = "matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca"}, + {file = "matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc"}, + {file = "matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8"}, + {file = "matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c"}, + {file = "matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537"}, + {file = "matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657"}, + {file = "matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b"}, + {file = "matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0"}, + {file = "matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68"}, + {file = "matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91"}, + {file = "matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7"}, ] [package.dependencies] @@ -3884,15 +3737,15 @@ files = [ [[package]] name = "mcp" -version = "1.26.0" +version = "1.25.0" description = "Model Context Protocol SDK" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca"}, - {file = "mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66"}, + {file = "mcp-1.25.0-py3-none-any.whl", hash = "sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a"}, + {file = "mcp-1.25.0.tar.gz", hash = "sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802"}, ] [package.dependencies] @@ -3959,9 +3812,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">1.20"}, {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">1.20"}, {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, ] @@ -3970,15 +3823,15 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] [[package]] name = "mlflow" -version = "3.9.0" +version = "3.6.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow-3.9.0-py3-none-any.whl", hash = "sha256:280f94854e5ece42fc5538180b276661c62dbfb2c848a98e8873e78915379ac6"}, - {file = "mlflow-3.9.0.tar.gz", hash = "sha256:47a41fa22107b0ceee1f91e2184759ebfaffa31d7913b70318b78fb5369e52ec"}, + {file = "mlflow-3.6.0-py3-none-any.whl", hash = "sha256:04d1691facd412be8e61b963fad859286cfeb2dbcafaea294e6aa0b83a15fc04"}, + {file = "mlflow-3.6.0.tar.gz", hash = "sha256:d945d259b5c6b551a9f26846db8979fd84c78114a027b77ada3298f821a9b0e1"}, ] [package.dependencies] @@ -3989,16 +3842,15 @@ Flask = "<4" Flask-CORS = "<7" graphene = "<4" gunicorn = {version = "<24", markers = "platform_system != \"Windows\""} -huey = ">=2.5.4,<3" +huey = ">=2.5.0,<3" matplotlib = "<4" -mlflow-skinny = "3.9.0" -mlflow-tracing = "3.9.0" +mlflow-skinny = "3.6.0" +mlflow-tracing = "3.6.0" numpy = "<3" pandas = "<3" pyarrow = ">=4.0.0,<23" scikit-learn = "<2" scipy = "<2" -skops = "<1" sqlalchemy = ">=1.4.0,<3" waitress = {version = "<4", markers = "platform_system == \"Windows\""} @@ -4006,27 +3858,26 @@ waitress = {version = "<4", markers = "platform_system == \"Windows\""} aliyun-oss = ["aliyunstoreplugin"] auth = ["Flask-WTF (<2)"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"] -db = ["PyMySQL", "psycopg2-binary", "pymssql"] extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "litellm (>=1.0.0,<2)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.3.15,<=1.2.3)"] -mcp = ["click (!=8.3.0)", "fastmcp (>=2.0.0,<3)"] +langchain = ["langchain (>=0.3.7,<=0.3.27)"] +mcp = ["fastmcp (>=2.0.0,<3)"] mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"] sqlserver = ["mlflow-dbstore"] [[package]] name = "mlflow-skinny" -version = "3.9.0" +version = "3.6.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow_skinny-3.9.0-py3-none-any.whl", hash = "sha256:9b98706cdf9e07a61da7fbcd717c8d35ac89c76e084d25aafdbc150028e832d5"}, - {file = "mlflow_skinny-3.9.0.tar.gz", hash = "sha256:0598e0635dd1af9d195fb429210819aa4b56e9d6014f87134241f2325d57a290"}, + {file = "mlflow_skinny-3.6.0-py3-none-any.whl", hash = "sha256:c83b34fce592acb2cc6bddcb507587a6d9ef3f590d9e7a8658c85e0980596d78"}, + {file = "mlflow_skinny-3.6.0.tar.gz", hash = "sha256:cc04706b5b6faace9faf95302a6e04119485e1bfe98ddc9b85b81984e80944b6"}, ] [package.dependencies] @@ -4054,27 +3905,26 @@ uvicorn = "<1" aliyun-oss = ["aliyunstoreplugin"] auth = ["Flask-WTF (<2)"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"] -db = ["PyMySQL", "psycopg2-binary", "pymssql"] extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "litellm (>=1.0.0,<2)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.3.15,<=1.2.3)"] -mcp = ["click (!=8.3.0)", "fastmcp (>=2.0.0,<3)"] +langchain = ["langchain (>=0.3.7,<=0.3.27)"] +mcp = ["fastmcp (>=2.0.0,<3)"] mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"] sqlserver = ["mlflow-dbstore"] [[package]] name = "mlflow-tracing" -version = "3.9.0" +version = "3.6.0" description = "MLflow Tracing SDK is an open-source, lightweight Python package that only includes the minimum set of dependencies and functionality to instrument your code/models/agents with MLflow Tracing." optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "mlflow_tracing-3.9.0-py3-none-any.whl", hash = "sha256:93df8df0697303ad3135df6228934e5d9d2f264d2683b97a6f06ad865ec418a0"}, - {file = "mlflow_tracing-3.9.0.tar.gz", hash = "sha256:3a0676e6f362712299d191108a5cbcd596f6d84f23f050dfbf80161e245d456c"}, + {file = "mlflow_tracing-3.6.0-py3-none-any.whl", hash = "sha256:a68ff03ba5129c67dc98e6871e0d5ef512dd3ee66d01e1c1a0c946c08a6d4755"}, + {file = "mlflow_tracing-3.6.0.tar.gz", hash = "sha256:ccff80b3aad6caa18233c98ba69922a91a6f914e0a13d12e1977af7523523d4c"}, ] [package.dependencies] @@ -4129,158 +3979,158 @@ portalocker = ["portalocker (>=1.4,<4)"] [[package]] name = "multidict" -version = "6.7.1" +version = "6.7.0" description = "multidict implementation" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"}, - {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"}, - {file = "multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190"}, - {file = "multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962"}, - {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505"}, - {file = "multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122"}, - {file = "multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df"}, - {file = "multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db"}, - {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d"}, - {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e"}, - {file = "multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0"}, - {file = "multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0"}, - {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa"}, - {file = "multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a"}, - {file = "multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b"}, - {file = "multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6"}, - {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172"}, - {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd"}, - {file = "multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a"}, - {file = "multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a"}, - {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba"}, - {file = "multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511"}, - {file = "multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19"}, - {file = "multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf"}, - {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23"}, - {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2"}, - {file = "multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed"}, - {file = "multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d"}, - {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33"}, - {file = "multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3"}, - {file = "multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5"}, - {file = "multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df"}, - {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1"}, - {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963"}, - {file = "multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd"}, - {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52"}, - {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108"}, - {file = "multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32"}, - {file = "multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8"}, - {file = "multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118"}, - {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee"}, - {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2"}, - {file = "multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37"}, - {file = "multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1"}, - {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b"}, - {file = "multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d"}, - {file = "multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f"}, - {file = "multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5"}, - {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581"}, - {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a"}, - {file = "multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d"}, - {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9"}, - {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2"}, - {file = "multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7"}, - {file = "multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5"}, - {file = "multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2"}, - {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65573858d27cdeaca41893185677dc82395159aa28875a8867af66532d413a8f"}, - {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c524c6fb8fc342793708ab111c4dbc90ff9abd568de220432500e47e990c0358"}, - {file = "multidict-6.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa23b001d968faef416ff70dc0f1ab045517b9b42a90edd3e9bcdb06479e31d5"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6704fa2b7453b2fb121740555fa1ee20cd98c4d011120caf4d2b8d4e7c76eec0"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:121a34e5bfa410cdf2c8c49716de160de3b1dbcd86b49656f5681e4543bcd1a8"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:026d264228bcd637d4e060844e39cdc60f86c479e463d49075dedc21b18fbbe0"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e697826df7eb63418ee190fd06ce9f1803593bb4b9517d08c60d9b9a7f69d8f"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb08271280173720e9fea9ede98e5231defcbad90f1624bea26f32ec8a956e2f"}, - {file = "multidict-6.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6b3228e1d80af737b72925ce5fb4daf5a335e49cd7ab77ed7b9fdfbf58c526e"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3943debf0fbb57bdde5901695c11094a9a36723e5c03875f87718ee15ca2f4d2"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:98c5787b0a0d9a41d9311eae44c3b76e6753def8d8870ab501320efe75a6a5f8"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08ccb2a6dc72009093ebe7f3f073e5ec5964cba9a706fa94b1a1484039b87941"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb351f72c26dc9abe338ca7294661aa22969ad8ffe7ef7d5541d19f368dc854a"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ac1c665bad8b5d762f5f85ebe4d94130c26965f11de70c708c75671297c776de"}, - {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fa6609d0364f4f6f58351b4659a1f3e0e898ba2a8c5cac04cb2c7bc556b0bc5"}, - {file = "multidict-6.7.1-cp39-cp39-win32.whl", hash = "sha256:6f77ce314a29263e67adadc7e7c1bc699fcb3a305059ab973d038f87caa42ed0"}, - {file = "multidict-6.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:f537b55778cd3cbee430abe3131255d3a78202e0f9ea7ffc6ada893a4bcaeea4"}, - {file = "multidict-6.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:749aa54f578f2e5f439538706a475aa844bfa8ef75854b1401e6e528e4937cf9"}, - {file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"}, - {file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, + {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, + {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, + {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, + {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, + {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, + {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, + {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, + {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, + {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, + {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, + {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, + {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, + {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, + {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, + {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, + {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, + {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, + {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, + {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, + {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, + {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, + {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, + {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, + {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, + {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, + {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, ] [package.dependencies] @@ -4288,54 +4138,53 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy" -version = "1.19.1" +version = "1.18.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec"}, - {file = "mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b"}, - {file = "mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6"}, - {file = "mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74"}, - {file = "mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1"}, - {file = "mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac"}, - {file = "mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288"}, - {file = "mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab"}, - {file = "mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6"}, - {file = "mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331"}, - {file = "mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925"}, - {file = "mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042"}, - {file = "mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1"}, - {file = "mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e"}, - {file = "mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2"}, - {file = "mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8"}, - {file = "mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a"}, - {file = "mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13"}, - {file = "mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250"}, - {file = "mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b"}, - {file = "mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e"}, - {file = "mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef"}, - {file = "mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75"}, - {file = "mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd"}, - {file = "mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1"}, - {file = "mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718"}, - {file = "mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b"}, - {file = "mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045"}, - {file = "mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957"}, - {file = "mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f"}, - {file = "mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3"}, - {file = "mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a"}, - {file = "mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67"}, - {file = "mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e"}, - {file = "mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376"}, - {file = "mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24"}, - {file = "mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247"}, - {file = "mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, + {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, + {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, + {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, + {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, + {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, + {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, + {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, + {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, + {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, + {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, + {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, + {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, + {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, + {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, ] [package.dependencies] -librt = {version = ">=0.6.2", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=0.9.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -4362,14 +4211,14 @@ files = [ [[package]] name = "nodeenv" -version = "1.10.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["main", "proxy-dev"] files = [ - {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, - {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] markers = {main = "extra == \"extra-proxy\""} @@ -4380,7 +4229,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or python_version >= \"3.10\") and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\")" +markers = "(python_version >= \"3.10\" or extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\") and python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or extra == \"mlflow\")" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -4422,85 +4271,87 @@ files = [ [[package]] name = "numpy" -version = "2.4.2" +version = "2.3.5" description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\")" +markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"google\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\" or extra == \"google\")" files = [ - {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, - {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, - {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, - {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, - {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, - {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, - {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, - {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, - {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, - {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, - {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, - {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, - {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, - {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, - {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, - {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, - {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, - {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, - {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, - {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, + {file = "numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10"}, + {file = "numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218"}, + {file = "numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d"}, + {file = "numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5"}, + {file = "numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7"}, + {file = "numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4"}, + {file = "numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e"}, + {file = "numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748"}, + {file = "numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c"}, + {file = "numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c"}, + {file = "numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa"}, + {file = "numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e"}, + {file = "numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769"}, + {file = "numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5"}, + {file = "numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4"}, + {file = "numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d"}, + {file = "numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28"}, + {file = "numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b"}, + {file = "numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c"}, + {file = "numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952"}, + {file = "numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa"}, + {file = "numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013"}, + {file = "numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff"}, + {file = "numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188"}, + {file = "numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0"}, + {file = "numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903"}, + {file = "numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d"}, + {file = "numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017"}, + {file = "numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf"}, + {file = "numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce"}, + {file = "numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e"}, + {file = "numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b"}, + {file = "numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae"}, + {file = "numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd"}, + {file = "numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f"}, + {file = "numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a"}, + {file = "numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139"}, + {file = "numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e"}, + {file = "numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9"}, + {file = "numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946"}, + {file = "numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1"}, + {file = "numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3"}, + {file = "numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234"}, + {file = "numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7"}, + {file = "numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82"}, + {file = "numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0"}, + {file = "numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63"}, + {file = "numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9"}, + {file = "numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b"}, + {file = "numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520"}, + {file = "numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c"}, + {file = "numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8"}, + {file = "numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248"}, + {file = "numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e"}, + {file = "numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2"}, + {file = "numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41"}, + {file = "numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad"}, + {file = "numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39"}, + {file = "numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20"}, + {file = "numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52"}, + {file = "numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b"}, + {file = "numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3"}, + {file = "numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227"}, + {file = "numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5"}, + {file = "numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf"}, + {file = "numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7"}, + {file = "numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425"}, + {file = "numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0"}, ] [[package]] @@ -4510,7 +4361,7 @@ description = "Sphinx extension to support docstrings in Numpy format" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\" and extra == \"utils\"" +markers = "extra == \"utils\"" files = [ {file = "numpydoc-1.9.0-py3-none-any.whl", hash = "sha256:8a2983b2d62bfd0a8c470c7caa25e7e0c3d163875cdec12a8a1034020a9d1135"}, {file = "numpydoc-1.9.0.tar.gz", hash = "sha256:5fec64908fe041acc4b3afc2a32c49aab1540cf581876f5563d68bb129e27c5b"}, @@ -4520,23 +4371,6 @@ files = [ sphinx = ">=6" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -[[package]] -name = "numpydoc" -version = "1.10.0" -description = "Sphinx extension to support docstrings in Numpy format" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"utils\"" -files = [ - {file = "numpydoc-1.10.0-py3-none-any.whl", hash = "sha256:3149da9874af890bcc2a82ef7aae5484e5aa81cb2778f08e3c307ba6d963721b"}, - {file = "numpydoc-1.10.0.tar.gz", hash = "sha256:3f7970f6eee30912260a6b31ac72bba2432830cd6722569ec17ee8d3ef5ffa01"}, -] - -[package.dependencies] -sphinx = ">=6" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - [[package]] name = "oauthlib" version = "3.3.1" @@ -4557,14 +4391,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "2.17.0" +version = "2.8.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "openai-2.17.0-py3-none-any.whl", hash = "sha256:4f393fd886ca35e113aac7ff239bcd578b81d8f104f5aedc7d3693eb2af1d338"}, - {file = "openai-2.17.0.tar.gz", hash = "sha256:47224b74bd20f30c6b0a6a329505243cb2f26d5cf84d9f8d0825ff8b35e9c999"}, + {file = "openai-2.8.1-py3-none-any.whl", hash = "sha256:c6c3b5a04994734386e8dad3c00a393f56d3b68a27cd2e8acae91a59e4122463"}, + {file = "openai-2.8.1.tar.gz", hash = "sha256:cb1b79eef6e809f6da326a7ef6038719e35aa944c42d081807bfa1be8060f15f"}, ] [package.dependencies] @@ -4735,185 +4569,100 @@ typing-extensions = ">=4.5.0" [[package]] name = "orjson" -version = "3.11.5" +version = "3.11.4" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\" and extra == \"proxy\"" +markers = "extra == \"proxy\"" files = [ - {file = "orjson-3.11.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:df9eadb2a6386d5ea2bfd81309c505e125cfc9ba2b1b99a97e60985b0b3665d1"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc70da619744467d8f1f49a8cadae5ec7bbe054e5232d95f92ed8737f8c5870"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:073aab025294c2f6fc0807201c76fdaed86f8fc4be52c440fb78fbb759a1ac09"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:835f26fa24ba0bb8c53ae2a9328d1706135b74ec653ed933869b74b6909e63fd"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667c132f1f3651c14522a119e4dd631fad98761fa960c55e8e7430bb2a1ba4ac"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42e8961196af655bb5e63ce6c60d25e8798cd4dfbc04f4203457fa3869322c2e"}, - {file = "orjson-3.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75412ca06e20904c19170f8a24486c4e6c7887dea591ba18a1ab572f1300ee9f"}, - {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6af8680328c69e15324b5af3ae38abbfcf9cbec37b5346ebfd52339c3d7e8a18"}, - {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a86fe4ff4ea523eac8f4b57fdac319faf037d3c1be12405e6a7e86b3fbc4756a"}, - {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e607b49b1a106ee2086633167033afbd63f76f2999e9236f638b06b112b24ea7"}, - {file = "orjson-3.11.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7339f41c244d0eea251637727f016b3d20050636695bc78345cce9029b189401"}, - {file = "orjson-3.11.5-cp310-cp310-win32.whl", hash = "sha256:8be318da8413cdbbce77b8c5fac8d13f6eb0f0db41b30bb598631412619572e8"}, - {file = "orjson-3.11.5-cp310-cp310-win_amd64.whl", hash = "sha256:b9f86d69ae822cabc2a0f6c099b43e8733dda788405cba2665595b7e8dd8d167"}, - {file = "orjson-3.11.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9c8494625ad60a923af6b2b0bd74107146efe9b55099e20d7740d995f338fcd8"}, - {file = "orjson-3.11.5-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:7bb2ce0b82bc9fd1168a513ddae7a857994b780b2945a8c51db4ab1c4b751ebc"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67394d3becd50b954c4ecd24ac90b5051ee7c903d167459f93e77fc6f5b4c968"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:298d2451f375e5f17b897794bcc3e7b821c0f32b4788b9bcae47ada24d7f3cf7"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa5e4244063db8e1d87e0f54c3f7522f14b2dc937e65d5241ef0076a096409fd"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1db2088b490761976c1b2e956d5d4e6409f3732e9d79cfa69f876c5248d1baf9"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2ed66358f32c24e10ceea518e16eb3549e34f33a9d51f99ce23b0251776a1ef"}, - {file = "orjson-3.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2021afda46c1ed64d74b555065dbd4c2558d510d8cec5ea6a53001b3e5e82a9"}, - {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b42ffbed9128e547a1647a3e50bc88ab28ae9daa61713962e0d3dd35e820c125"}, - {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8d5f16195bb671a5dd3d1dbea758918bada8f6cc27de72bd64adfbd748770814"}, - {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c0e5d9f7a0227df2927d343a6e3859bebf9208b427c79bd31949abcc2fa32fa5"}, - {file = "orjson-3.11.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:23d04c4543e78f724c4dfe656b3791b5f98e4c9253e13b2636f1af5d90e4a880"}, - {file = "orjson-3.11.5-cp311-cp311-win32.whl", hash = "sha256:c404603df4865f8e0afe981aa3c4b62b406e6d06049564d58934860b62b7f91d"}, - {file = "orjson-3.11.5-cp311-cp311-win_amd64.whl", hash = "sha256:9645ef655735a74da4990c24ffbd6894828fbfa117bc97c1edd98c282ecb52e1"}, - {file = "orjson-3.11.5-cp311-cp311-win_arm64.whl", hash = "sha256:1cbf2735722623fcdee8e712cbaaab9e372bbcb0c7924ad711b261c2eccf4a5c"}, - {file = "orjson-3.11.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:334e5b4bff9ad101237c2d799d9fd45737752929753bf4faf4b207335a416b7d"}, - {file = "orjson-3.11.5-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:ff770589960a86eae279f5d8aa536196ebda8273a2a07db2a54e82b93bc86626"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed24250e55efbcb0b35bed7caaec8cedf858ab2f9f2201f17b8938c618c8ca6f"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a66d7769e98a08a12a139049aac2f0ca3adae989817f8c43337455fbc7669b85"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86cfc555bfd5794d24c6a1903e558b50644e5e68e6471d66502ce5cb5fdef3f9"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a230065027bc2a025e944f9d4714976a81e7ecfa940923283bca7bbc1f10f626"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b29d36b60e606df01959c4b982729c8845c69d1963f88686608be9ced96dbfaa"}, - {file = "orjson-3.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74099c6b230d4261fdc3169d50efc09abf38ace1a42ea2f9994b1d79153d477"}, - {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e697d06ad57dd0c7a737771d470eedc18e68dfdefcdd3b7de7f33dfda5b6212e"}, - {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e08ca8a6c851e95aaecc32bc44a5aa75d0ad26af8cdac7c77e4ed93acf3d5b69"}, - {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e8b5f96c05fce7d0218df3fdfeb962d6b8cfff7e3e20264306b46dd8b217c0f3"}, - {file = "orjson-3.11.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ddbfdb5099b3e6ba6d6ea818f61997bb66de14b411357d24c4612cf1ebad08ca"}, - {file = "orjson-3.11.5-cp312-cp312-win32.whl", hash = "sha256:9172578c4eb09dbfcf1657d43198de59b6cef4054de385365060ed50c458ac98"}, - {file = "orjson-3.11.5-cp312-cp312-win_amd64.whl", hash = "sha256:2b91126e7b470ff2e75746f6f6ee32b9ab67b7a93c8ba1d15d3a0caaf16ec875"}, - {file = "orjson-3.11.5-cp312-cp312-win_arm64.whl", hash = "sha256:acbc5fac7e06777555b0722b8ad5f574739e99ffe99467ed63da98f97f9ca0fe"}, - {file = "orjson-3.11.5-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3b01799262081a4c47c035dd77c1301d40f568f77cc7ec1bb7db5d63b0a01629"}, - {file = "orjson-3.11.5-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:61de247948108484779f57a9f406e4c84d636fa5a59e411e6352484985e8a7c3"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:894aea2e63d4f24a7f04a1908307c738d0dce992e9249e744b8f4e8dd9197f39"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ddc21521598dbe369d83d4d40338e23d4101dad21dae0e79fa20465dbace019f"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cce16ae2f5fb2c53c3eafdd1706cb7b6530a67cc1c17abe8ec747f5cd7c0c51"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e46c762d9f0e1cfb4ccc8515de7f349abbc95b59cb5a2bd68df5973fdef913f8"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7345c759276b798ccd6d77a87136029e71e66a8bbf2d2755cbdde1d82e78706"}, - {file = "orjson-3.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75bc2e59e6a2ac1dd28901d07115abdebc4563b5b07dd612bf64260a201b1c7f"}, - {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:54aae9b654554c3b4edd61896b978568c6daa16af96fa4681c9b5babd469f863"}, - {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4bdd8d164a871c4ec773f9de0f6fe8769c2d6727879c37a9666ba4183b7f8228"}, - {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a261fef929bcf98a60713bf5e95ad067cea16ae345d9a35034e73c3990e927d2"}, - {file = "orjson-3.11.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c028a394c766693c5c9909dec76b24f37e6a1b91999e8d0c0d5feecbe93c3e05"}, - {file = "orjson-3.11.5-cp313-cp313-win32.whl", hash = "sha256:2cc79aaad1dfabe1bd2d50ee09814a1253164b3da4c00a78c458d82d04b3bdef"}, - {file = "orjson-3.11.5-cp313-cp313-win_amd64.whl", hash = "sha256:ff7877d376add4e16b274e35a3f58b7f37b362abf4aa31863dadacdd20e3a583"}, - {file = "orjson-3.11.5-cp313-cp313-win_arm64.whl", hash = "sha256:59ac72ea775c88b163ba8d21b0177628bd015c5dd060647bbab6e22da3aad287"}, - {file = "orjson-3.11.5-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e446a8ea0a4c366ceafc7d97067bfd55292969143b57e3c846d87fc701e797a0"}, - {file = "orjson-3.11.5-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:53deb5addae9c22bbe3739298f5f2196afa881ea75944e7720681c7080909a81"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd00d49d6063d2b8791da5d4f9d20539c5951f965e45ccf4e96d33505ce68f"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3fd15f9fc8c203aeceff4fda211157fad114dde66e92e24097b3647a08f4ee9e"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df95000fbe6777bf9820ae82ab7578e8662051bb5f83d71a28992f539d2cda7"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a8d676748fca47ade5bc3da7430ed7767afe51b2f8100e3cd65e151c0eaceb"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa0f513be38b40234c77975e68805506cad5d57b3dfd8fe3baa7f4f4051e15b4"}, - {file = "orjson-3.11.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1863e75b92891f553b7922ce4ee10ed06db061e104f2b7815de80cdcb135ad"}, - {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4be86b58e9ea262617b8ca6251a2f0d63cc132a6da4b5fcc8e0a4128782c829"}, - {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b923c1c13fa02084eb38c9c065afd860a5cff58026813319a06949c3af5732ac"}, - {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1b6bd351202b2cd987f35a13b5e16471cf4d952b42a73c391cc537974c43ef6d"}, - {file = "orjson-3.11.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb150d529637d541e6af06bbe3d02f5498d628b7f98267ff87647584293ab439"}, - {file = "orjson-3.11.5-cp314-cp314-win32.whl", hash = "sha256:9cc1e55c884921434a84a0c3dd2699eb9f92e7b441d7f53f3941079ec6ce7499"}, - {file = "orjson-3.11.5-cp314-cp314-win_amd64.whl", hash = "sha256:a4f3cb2d874e03bc7767c8f88adaa1a9a05cecea3712649c3b58589ec7317310"}, - {file = "orjson-3.11.5-cp314-cp314-win_arm64.whl", hash = "sha256:38b22f476c351f9a1c43e5b07d8b5a02eb24a6ab8e75f700f7d479d4568346a5"}, - {file = "orjson-3.11.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1b280e2d2d284a6713b0cfec7b08918ebe57df23e3f76b27586197afca3cb1e9"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d8a112b274fae8c5f0f01954cb0480137072c271f3f4958127b010dfefaec"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0a2ae6f09ac7bd47d2d5a5305c1d9ed08ac057cda55bb0a49fa506f0d2da00"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d87bd1896faac0d10b4f849016db81a63e4ec5df38757ffae84d45ab38aa71"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:801a821e8e6099b8c459ac7540b3c32dba6013437c57fdcaec205b169754f38c"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a0f6ac618c98c74b7fbc8c0172ba86f9e01dbf9f62aa0b1776c2231a7bffe5"}, - {file = "orjson-3.11.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea7339bdd22e6f1060c55ac31b6a755d86a5b2ad3657f2669ec243f8e3b2bdb"}, - {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4dad582bc93cef8f26513e12771e76385a7e6187fd713157e971c784112aad56"}, - {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:0522003e9f7fba91982e83a97fec0708f5a714c96c4209db7104e6b9d132f111"}, - {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7403851e430a478440ecc1258bcbacbfbd8175f9ac1e39031a7121dd0de05ff8"}, - {file = "orjson-3.11.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5f691263425d3177977c8d1dd896cde7b98d93cbf390b2544a090675e83a6a0a"}, - {file = "orjson-3.11.5-cp39-cp39-win32.whl", hash = "sha256:61026196a1c4b968e1b1e540563e277843082e9e97d78afa03eb89315af531f1"}, - {file = "orjson-3.11.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b94b947ac08586af635ef922d69dc9bc63321527a3a04647f4986a73f4bd30"}, - {file = "orjson-3.11.5.tar.gz", hash = "sha256:82393ab47b4fe44ffd0a7659fa9cfaacc717eb617c93cde83795f14af5c2e9d5"}, -] - -[[package]] -name = "orjson" -version = "3.11.7" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"proxy\"" -files = [ - {file = "orjson-3.11.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a02c833f38f36546ba65a452127633afce4cf0dd7296b753d3bb54e55e5c0174"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63c6e6738d7c3470ad01601e23376aa511e50e1f3931395b9f9c722406d1a67"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043d3006b7d32c7e233b8cfb1f01c651013ea079e08dcef7189a29abd8befe11"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57036b27ac8a25d81112eb0cc9835cd4833c5b16e1467816adc0015f59e870dc"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:733ae23ada68b804b222c44affed76b39e30806d38660bf1eb200520d259cc16"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fdfad2093bdd08245f2e204d977facd5f871c88c4a71230d5bcbd0e43bf6222"}, - {file = "orjson-3.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cededd6738e1c153530793998e31c05086582b08315db48ab66649768f326baa"}, - {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:14f440c7268c8f8633d1b3d443a434bd70cb15686117ea6beff8fdc8f5917a1e"}, - {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3a2479753bbb95b0ebcf7969f562cdb9668e6d12416a35b0dda79febf89cdea2"}, - {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:71924496986275a737f38e3f22b4e0878882b3f7a310d2ff4dc96e812789120c"}, - {file = "orjson-3.11.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4a9eefdc70bf8bf9857f0290f973dec534ac84c35cd6a7f4083be43e7170a8f"}, - {file = "orjson-3.11.7-cp310-cp310-win32.whl", hash = "sha256:ae9e0b37a834cef7ce8f99de6498f8fad4a2c0bf6bfc3d02abd8ed56aa15b2de"}, - {file = "orjson-3.11.7-cp310-cp310-win_amd64.whl", hash = "sha256:d772afdb22555f0c58cfc741bdae44180122b3616faa1ecadb595cd526e4c993"}, - {file = "orjson-3.11.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9487abc2c2086e7c8eb9a211d2ce8855bae0e92586279d0d27b341d5ad76c85c"}, - {file = "orjson-3.11.7-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:79cacb0b52f6004caf92405a7e1f11e6e2de8bdf9019e4f76b44ba045125cd6b"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e85fe4698b6a56d5e2ebf7ae87544d668eb6bde1ad1226c13f44663f20ec9e"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8d14b71c0b12963fe8a62aac87119f1afdf4cb88a400f61ca5ae581449efcb5"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91c81ef070c8f3220054115e1ef468b1c9ce8497b4e526cb9f68ab4dc0a7ac62"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:411ebaf34d735e25e358a6d9e7978954a9c9d58cfb47bc6683cdc3964cd2f910"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a16bcd08ab0bcdfc7e8801d9c4a9cc17e58418e4d48ddc6ded4e9e4b1a94062b"}, - {file = "orjson-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0b51672e466fd7e56230ffbae7f1639e18d0ce023351fb75da21b71bc2c960"}, - {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:136dcd6a2e796dfd9ffca9fc027d778567b0b7c9968d092842d3c323cef88aa8"}, - {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ba61079379b0ae29e117db13bda5f28d939766e410d321ec1624afc6a0b0504"}, - {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0527a4510c300e3b406591b0ba69b5dc50031895b0a93743526a3fc45f59d26e"}, - {file = "orjson-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a709e881723c9b18acddcfb8ba357322491ad553e277cf467e1e7e20e2d90561"}, - {file = "orjson-3.11.7-cp311-cp311-win32.whl", hash = "sha256:c43b8b5bab288b6b90dac410cca7e986a4fa747a2e8f94615aea407da706980d"}, - {file = "orjson-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:6543001328aa857187f905308a028935864aefe9968af3848401b6fe80dbb471"}, - {file = "orjson-3.11.7-cp311-cp311-win_arm64.whl", hash = "sha256:1ee5cc7160a821dfe14f130bc8e63e7611051f964b463d9e2a3a573204446a4d"}, - {file = "orjson-3.11.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd03ea7606833655048dab1a00734a2875e3e86c276e1d772b2a02556f0d895f"}, - {file = "orjson-3.11.7-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:89e440ebc74ce8ab5c7bc4ce6757b4a6b1041becb127df818f6997b5c71aa60b"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ede977b5fe5ac91b1dffc0a517ca4542d2ec8a6a4ff7b2652d94f640796342a"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b1dae39230a393df353827c855a5f176271c23434cfd2db74e0e424e693e10"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed46f17096e28fb28d2975834836a639af7278aa87c84f68ab08fbe5b8bd75fa"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3726be79e36e526e3d9c1aceaadbfb4a04ee80a72ab47b3f3c17fefb9812e7b8"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0724e265bc548af1dedebd9cb3d24b4e1c1e685a343be43e87ba922a5c5fff2f"}, - {file = "orjson-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7745312efa9e11c17fbd3cb3097262d079da26930ae9ae7ba28fb738367cbad"}, - {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f904c24bdeabd4298f7a977ef14ca2a022ca921ed670b92ecd16ab6f3d01f867"}, - {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b9fc4d0f81f394689e0814617aadc4f2ea0e8025f38c226cbf22d3b5ddbf025d"}, - {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:849e38203e5be40b776ed2718e587faf204d184fc9a008ae441f9442320c0cab"}, - {file = "orjson-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4682d1db3bcebd2b64757e0ddf9e87ae5f00d29d16c5cdf3a62f561d08cc3dd2"}, - {file = "orjson-3.11.7-cp312-cp312-win32.whl", hash = "sha256:f4f7c956b5215d949a1f65334cf9d7612dde38f20a95f2315deef167def91a6f"}, - {file = "orjson-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:bf742e149121dc5648ba0a08ea0871e87b660467ef168a3a5e53bc1fbd64bb74"}, - {file = "orjson-3.11.7-cp312-cp312-win_arm64.whl", hash = "sha256:26c3b9132f783b7d7903bf1efb095fed8d4a3a85ec0d334ee8beff3d7a4749d5"}, - {file = "orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733"}, - {file = "orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705"}, - {file = "orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace"}, - {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b"}, - {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157"}, - {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3"}, - {file = "orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223"}, - {file = "orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3"}, - {file = "orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757"}, - {file = "orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539"}, - {file = "orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0"}, - {file = "orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e"}, - {file = "orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1"}, - {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183"}, - {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650"}, - {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141"}, - {file = "orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2"}, - {file = "orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576"}, - {file = "orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1"}, - {file = "orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d"}, - {file = "orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49"}, + {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b"}, + {file = "orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3"}, + {file = "orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907"}, + {file = "orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c"}, + {file = "orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a"}, + {file = "orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9"}, + {file = "orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa"}, + {file = "orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140"}, + {file = "orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6"}, + {file = "orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839"}, + {file = "orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a"}, + {file = "orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155"}, + {file = "orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394"}, + {file = "orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1"}, + {file = "orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d"}, + {file = "orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9"}, + {file = "orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1"}, + {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, + {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, ] [[package]] @@ -5031,122 +4780,116 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pathspec" -version = "1.0.4" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, - {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[package.extras] -hyperscan = ["hyperscan (>=0.7)"] -optional = ["typing-extensions (>=4)"] -re2 = ["google-re2 (>=1.1)"] -tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] - [[package]] name = "pillow" -version = "12.1.0" +version = "12.0.0" description = "Python Imaging Library (fork)" optional = true python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd"}, - {file = "pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0"}, - {file = "pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8"}, - {file = "pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1"}, - {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda"}, - {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7"}, - {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a"}, - {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef"}, - {file = "pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09"}, - {file = "pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91"}, - {file = "pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea"}, - {file = "pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3"}, - {file = "pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0"}, - {file = "pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451"}, - {file = "pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e"}, - {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84"}, - {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0"}, - {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b"}, - {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18"}, - {file = "pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64"}, - {file = "pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75"}, - {file = "pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304"}, - {file = "pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b"}, - {file = "pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551"}, - {file = "pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208"}, - {file = "pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5"}, - {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661"}, - {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17"}, - {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670"}, - {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616"}, - {file = "pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7"}, - {file = "pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d"}, - {file = "pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c"}, - {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1"}, - {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179"}, - {file = "pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0"}, - {file = "pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587"}, - {file = "pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac"}, - {file = "pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b"}, - {file = "pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea"}, - {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c"}, - {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc"}, - {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644"}, - {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c"}, - {file = "pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171"}, - {file = "pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a"}, - {file = "pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45"}, - {file = "pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d"}, - {file = "pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0"}, - {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554"}, - {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e"}, - {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82"}, - {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4"}, - {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0"}, - {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b"}, - {file = "pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65"}, - {file = "pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0"}, - {file = "pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8"}, - {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91"}, - {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796"}, - {file = "pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd"}, - {file = "pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13"}, - {file = "pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e"}, - {file = "pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643"}, - {file = "pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5"}, - {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de"}, - {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9"}, - {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a"}, - {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a"}, - {file = "pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030"}, - {file = "pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94"}, - {file = "pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4"}, - {file = "pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2"}, - {file = "pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61"}, - {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51"}, - {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc"}, - {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14"}, - {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8"}, - {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924"}, - {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef"}, - {file = "pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988"}, - {file = "pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6"}, - {file = "pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a"}, - {file = "pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19"}, - {file = "pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9"}, + {file = "pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b"}, + {file = "pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782"}, + {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10"}, + {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa"}, + {file = "pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275"}, + {file = "pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d"}, + {file = "pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7"}, + {file = "pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc"}, + {file = "pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227"}, + {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b"}, + {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e"}, + {file = "pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739"}, + {file = "pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e"}, + {file = "pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d"}, + {file = "pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371"}, + {file = "pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8"}, + {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79"}, + {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba"}, + {file = "pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0"}, + {file = "pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a"}, + {file = "pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399"}, + {file = "pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5"}, + {file = "pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344"}, + {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27"}, + {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79"}, + {file = "pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098"}, + {file = "pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905"}, + {file = "pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a"}, + {file = "pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3"}, + {file = "pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe"}, + {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee"}, + {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef"}, + {file = "pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9"}, + {file = "pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b"}, + {file = "pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a"}, + {file = "pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b"}, + {file = "pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e"}, + {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9"}, + {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab"}, + {file = "pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b"}, + {file = "pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b"}, + {file = "pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0"}, + {file = "pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6"}, + {file = "pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925"}, + {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8"}, + {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4"}, + {file = "pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52"}, + {file = "pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a"}, + {file = "pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5"}, + {file = "pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353"}, ] [package.extras] @@ -5177,15 +4920,15 @@ type = ["mypy (>=1.14.1)"] [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, - {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, + {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, + {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, ] [package.extras] @@ -5211,19 +4954,19 @@ testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "1.38.0" +version = "1.35.2" description = "Blazingly fast DataFrame library" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "polars-1.38.0-py3-none-any.whl", hash = "sha256:d7a31b47da8c9522aa38908c46ac72eab8eaf0c992e024f9c95fedba4cbe7759"}, - {file = "polars-1.38.0.tar.gz", hash = "sha256:4dee569944c613d8c621eb709e452354e1570bd3d47ccb2d3d36681fb1bd2cf6"}, + {file = "polars-1.35.2-py3-none-any.whl", hash = "sha256:5e8057c8289ac148c793478323b726faea933d9776bd6b8a554b0ab7c03db87e"}, + {file = "polars-1.35.2.tar.gz", hash = "sha256:ae458b05ca6e7ca2c089342c70793f92f1103c502dc1b14b56f0a04f2cc1d205"}, ] [package.dependencies] -polars-runtime-32 = "1.38.0" +polars-runtime-32 = "1.35.2" [package.extras] adbc = ["adbc-driver-manager[dbapi]", "adbc-driver-sqlite[dbapi]"] @@ -5243,11 +4986,11 @@ numpy = ["numpy (>=1.16.0)"] openpyxl = ["openpyxl (>=3.0.0)"] pandas = ["pandas", "polars[pyarrow]"] plot = ["altair (>=5.4.0)"] -polars-cloud = ["polars_cloud (>=0.4.0)"] +polars-cloud = ["polars_cloud (>=0.0.1a1)"] pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] -rt64 = ["polars-runtime-64 (==1.38.0)"] -rtcompat = ["polars-runtime-compat (==1.38.0)"] +rt64 = ["polars-runtime-64 (==1.35.2)"] +rtcompat = ["polars-runtime-compat (==1.35.2)"] sqlalchemy = ["polars[pandas]", "sqlalchemy"] style = ["great-tables (>=0.8.0)"] timezone = ["tzdata ; platform_system == \"Windows\""] @@ -5256,43 +4999,22 @@ xlsxwriter = ["xlsxwriter"] [[package]] name = "polars-runtime-32" -version = "1.38.0" +version = "1.35.2" description = "Blazingly fast DataFrame library" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "polars_runtime_32-1.38.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:03f43c10a419837b89a493e946090cdaee08ce50a8d1933f2e8ac3a6874d7db4"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d664e53cba734e9fbed87d1c33078a13b5fc39b3e8790318fc65fa78954ea2d0"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c073c7b7e6e559769e10cdadbafce86d32b0709d5790de920081c6129acae507"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8806ddb684b17ae8b0bcb91d8d5ba361b04b0a31d77ce7f861d16b47734b3012"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c7b41163189bd3305fe2307e66fe478b35c4faa467777d74c32b70b52292039b"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e944f924a99750909299fa701edb07a63a5988e5ee58d673993f3d9147a22276"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-win_amd64.whl", hash = "sha256:46fbfb4ee6f8e1914dc0babfb6a138ead552db05a2d9e531c1fb19411b1a6744"}, - {file = "polars_runtime_32-1.38.0-cp310-abi3-win_arm64.whl", hash = "sha256:ed0e6d7a546de9179e5715bffe9d3b94ba658d5655bbbf44943e138e061dcc90"}, - {file = "polars_runtime_32-1.38.0.tar.gz", hash = "sha256:69ba986bff34f70d7eab931005e5d81dd4dc6c5c12e3532a4bd0fc7022671692"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e465d12a29e8df06ea78947e50bd361cdf77535cd904fd562666a8a9374e7e3a"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ef2b029b78f64fb53f126654c0bfa654045c7546bd0de3009d08bd52d660e8cc"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85dda0994b5dff7f456bb2f4bbd22be9a9e5c5e28670e23fedb13601ec99a46d"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:3b9006902fc51b768ff747c0f74bd4ce04005ee8aeb290ce9c07ce1cbe1b58a9"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-win_amd64.whl", hash = "sha256:ddc015fac39735592e2e7c834c02193ba4d257bb4c8c7478b9ebe440b0756b84"}, + {file = "polars_runtime_32-1.35.2-cp39-abi3-win_arm64.whl", hash = "sha256:6861145aa321a44eda7cc6694fb7751cb7aa0f21026df51b5faa52e64f9dc39b"}, + {file = "polars_runtime_32-1.35.2.tar.gz", hash = "sha256:6e6e35733ec52abe54b7d30d245e6586b027d433315d20edfb4a5d162c79fe90"}, ] -[[package]] -name = "prettytable" -version = "3.17.0" -description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\"" -files = [ - {file = "prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287"}, - {file = "prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0"}, -] - -[package.dependencies] -wcwidth = "*" - -[package.extras] -tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] - [[package]] name = "priority" version = "2.0.0" @@ -5481,15 +5203,15 @@ files = [ [[package]] name = "proto-plus" -version = "1.27.1" +version = "1.26.1" description = "Beautiful, Pythonic protocol buffers" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"google\" or extra == \"extra-proxy\"" +markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ - {file = "proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc"}, - {file = "proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147"}, + {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, + {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, ] [package.dependencies] @@ -5500,23 +5222,23 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.29.6" +version = "5.29.5" description = "" optional = false python-versions = ">=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1"}, - {file = "protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda"}, - {file = "protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269"}, - {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6"}, - {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9"}, - {file = "protobuf-5.29.6-cp38-cp38-win32.whl", hash = "sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05"}, - {file = "protobuf-5.29.6-cp38-cp38-win_amd64.whl", hash = "sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6"}, - {file = "protobuf-5.29.6-cp39-cp39-win32.whl", hash = "sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49"}, - {file = "protobuf-5.29.6-cp39-cp39-win_amd64.whl", hash = "sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18"}, - {file = "protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86"}, - {file = "protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723"}, + {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, + {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, + {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, + {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, + {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, + {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, + {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, + {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, + {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, ] markers = {main = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\""} @@ -5583,15 +5305,15 @@ files = [ [[package]] name = "pyasn1" -version = "0.6.2" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = true python-versions = ">=3.8" groups = ["main"] markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ - {file = "pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf"}, - {file = "pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] @@ -5633,31 +5355,18 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "python_version == \"3.9\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and implementation_name != \"PyPy\" and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\")", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\" and python_version == \"3.9\"", proxy-dev = "python_version == \"3.9\" and platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} - -[[package]] -name = "pycparser" -version = "3.0" -description = "C parser in Python" -optional = false -python-versions = ">=3.10" -groups = ["main", "dev", "proxy-dev"] -files = [ - {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, - {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, -] -markers = {main = "python_version >= \"3.10\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and implementation_name != \"PyPy\"", dev = "python_version >= \"3.10\" and implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "python_version >= \"3.10\" and implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\" or extra == \"extra-proxy\") and (extra == \"proxy\" or extra == \"extra-proxy\" or extra == \"mlflow\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" -version = "2.12.5" +version = "2.12.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d"}, - {file = "pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49"}, + {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, + {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, ] [package.dependencies] @@ -5860,14 +5569,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.11.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["main", "proxy-dev"] files = [ - {file = "pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469"}, - {file = "pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] markers = {main = "extra == \"extra-proxy\" or extra == \"proxy\""} @@ -5876,44 +5585,46 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==7.10.7)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=8.4.2,<9.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==7.10.7)", "pytest (>=8.4.2,<9.0.0)"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pynacl" -version = "1.6.2" +version = "1.6.1" description = "Python binding to the Networking and Cryptography (NaCl) library" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "pynacl-1.6.2-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:622d7b07cc5c02c666795792931b50c91f3ce3c2649762efb1ef0d5684c81594"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d071c6a9a4c94d79eb665db4ce5cedc537faf74f2355e4d502591d850d3913c0"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04316d1fc625d860b6c162fff704eb8426b1a8bcd3abacea11142cbd99a6b574"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44081faff368d6c5553ccf55322ef2819abb40e25afaec7e740f159f74813634"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:a9f9932d8d2811ce1a8ffa79dcbdf3970e7355b5c8eb0c1a881a57e7f7d96e88"}, - {file = "pynacl-1.6.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:bc4a36b28dd72fb4845e5d8f9760610588a96d5a51f01d84d8c6ff9849968c14"}, - {file = "pynacl-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bffb6d0f6becacb6526f8f42adfb5efb26337056ee0831fb9a7044d1a964444"}, - {file = "pynacl-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fef529ef3ee487ad8113d287a593fa26f48ee3620d92ecc6f1d09ea38e0709b"}, - {file = "pynacl-1.6.2-cp314-cp314t-win32.whl", hash = "sha256:a84bf1c20339d06dc0c85d9aea9637a24f718f375d861b2668b2f9f96fa51145"}, - {file = "pynacl-1.6.2-cp314-cp314t-win_amd64.whl", hash = "sha256:320ef68a41c87547c91a8b58903c9caa641ab01e8512ce291085b5fe2fcb7590"}, - {file = "pynacl-1.6.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2"}, - {file = "pynacl-1.6.2-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130"}, - {file = "pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6"}, - {file = "pynacl-1.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e"}, - {file = "pynacl-1.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577"}, - {file = "pynacl-1.6.2-cp38-abi3-win32.whl", hash = "sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa"}, - {file = "pynacl-1.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0"}, - {file = "pynacl-1.6.2-cp38-abi3-win_arm64.whl", hash = "sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c"}, - {file = "pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c"}, + {file = "pynacl-1.6.1-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:7d7c09749450c385301a3c20dca967a525152ae4608c0a096fe8464bfc3df93d"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc734c1696ffd49b40f7c1779c89ba908157c57345cf626be2e0719488a076d3"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cd787ec1f5c155dc8ecf39b1333cfef41415dc96d392f1ce288b4fe970df489"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b35d93ab2df03ecb3aa506be0d3c73609a51449ae0855c2e89c7ed44abde40b"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dece79aecbb8f4640a1adbb81e4aa3bfb0e98e99834884a80eb3f33c7c30e708"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c2228054f04bf32d558fb89bb99f163a8197d5a9bf4efa13069a7fa8d4b93fc3"}, + {file = "pynacl-1.6.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:2b12f1b97346f177affcdfdc78875ff42637cb40dcf79484a97dae3448083a78"}, + {file = "pynacl-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e735c3a1bdfde3834503baf1a6d74d4a143920281cb724ba29fb84c9f49b9c48"}, + {file = "pynacl-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3384a454adf5d716a9fadcb5eb2e3e72cd49302d1374a60edc531c9957a9b014"}, + {file = "pynacl-1.6.1-cp314-cp314t-win32.whl", hash = "sha256:d8615ee34d01c8e0ab3f302dcdd7b32e2bcf698ba5f4809e7cc407c8cdea7717"}, + {file = "pynacl-1.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5f5b35c1a266f8a9ad22525049280a600b19edd1f785bccd01ae838437dcf935"}, + {file = "pynacl-1.6.1-cp314-cp314t-win_arm64.whl", hash = "sha256:d984c91fe3494793b2a1fb1e91429539c6c28e9ec8209d26d25041ec599ccf63"}, + {file = "pynacl-1.6.1-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:a6f9fd6d6639b1e81115c7f8ff16b8dedba1e8098d2756275d63d208b0e32021"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e49a3f3d0da9f79c1bec2aa013261ab9fa651c7da045d376bd306cf7c1792993"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7713f8977b5d25f54a811ec9efa2738ac592e846dd6e8a4d3f7578346a841078"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a3becafc1ee2e5ea7f9abc642f56b82dcf5be69b961e782a96ea52b55d8a9fc"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ce50d19f1566c391fedc8dc2f2f5be265ae214112ebe55315e41d1f36a7f0a9"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:543f869140f67d42b9b8d47f922552d7a967e6c116aad028c9bfc5f3f3b3a7b7"}, + {file = "pynacl-1.6.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a2bb472458c7ca959aeeff8401b8efef329b0fc44a89d3775cffe8fad3398ad8"}, + {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3206fa98737fdc66d59b8782cecc3d37d30aeec4593d1c8c145825a345bba0f0"}, + {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:53543b4f3d8acb344f75fd4d49f75e6572fce139f4bfb4815a9282296ff9f4c0"}, + {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:319de653ef84c4f04e045eb250e6101d23132372b0a61a7acf91bac0fda8e58c"}, + {file = "pynacl-1.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:262a8de6bba4aee8a66f5edf62c214b06647461c9b6b641f8cd0cb1e3b3196fe"}, + {file = "pynacl-1.6.1-cp38-abi3-win32.whl", hash = "sha256:9fd1a4eb03caf8a2fe27b515a998d26923adb9ddb68db78e35ca2875a3830dde"}, + {file = "pynacl-1.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:a569a4069a7855f963940040f35e87d8bc084cb2d6347428d5ad20550a0a1a21"}, + {file = "pynacl-1.6.1-cp38-abi3-win_arm64.whl", hash = "sha256:5953e8b8cfadb10889a6e7bd0f53041a745d1b3d30111386a1bb37af171e6daf"}, + {file = "pynacl-1.6.1.tar.gz", hash = "sha256:8d361dac0309f2b6ad33b349a56cd163c98430d409fa503b10b70b3ad66eaa1d"}, ] [package.dependencies] @@ -5925,15 +5636,15 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=7.4.0)", "pytest-cov (>=2.10.1)", " [[package]] name = "pyparsing" -version = "3.3.2" +version = "3.2.5" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, - {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, + {file = "pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"}, + {file = "pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6"}, ] [package.extras] @@ -6113,7 +5824,7 @@ description = "Python for Window Extensions" optional = true python-versions = "*" groups = ["main"] -markers = "python_version >= \"3.10\" and sys_platform == \"win32\" and (extra == \"proxy\" or extra == \"mlflow\")" +markers = "python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") and sys_platform == \"win32\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -6334,143 +6045,127 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" -version = "2026.1.15" +version = "2025.11.3" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e"}, - {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f"}, - {file = "regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618"}, - {file = "regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4"}, - {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79"}, - {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9"}, - {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220"}, - {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13"}, - {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3"}, - {file = "regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218"}, - {file = "regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a"}, - {file = "regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3"}, - {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a"}, - {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f"}, - {file = "regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1"}, - {file = "regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b"}, - {file = "regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8"}, - {file = "regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413"}, - {file = "regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026"}, - {file = "regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785"}, - {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e"}, - {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763"}, - {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb"}, - {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2"}, - {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1"}, - {file = "regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569"}, - {file = "regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7"}, - {file = "regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec"}, - {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1"}, - {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681"}, - {file = "regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f"}, - {file = "regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa"}, - {file = "regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804"}, - {file = "regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c"}, - {file = "regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5"}, - {file = "regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3"}, - {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb"}, - {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410"}, - {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4"}, - {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d"}, - {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22"}, - {file = "regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913"}, - {file = "regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a"}, - {file = "regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056"}, - {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e"}, - {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10"}, - {file = "regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc"}, - {file = "regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599"}, - {file = "regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae"}, - {file = "regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5"}, - {file = "regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6"}, - {file = "regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788"}, - {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714"}, - {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d"}, - {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3"}, - {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31"}, - {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3"}, - {file = "regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f"}, - {file = "regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e"}, - {file = "regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337"}, - {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be"}, - {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8"}, - {file = "regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd"}, - {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a"}, - {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93"}, - {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af"}, - {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09"}, - {file = "regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5"}, - {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794"}, - {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a"}, - {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80"}, - {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2"}, - {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60"}, - {file = "regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952"}, - {file = "regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10"}, - {file = "regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829"}, - {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac"}, - {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6"}, - {file = "regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2"}, - {file = "regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846"}, - {file = "regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b"}, - {file = "regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e"}, - {file = "regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde"}, - {file = "regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5"}, - {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34"}, - {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75"}, - {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e"}, - {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160"}, - {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1"}, - {file = "regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1"}, - {file = "regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903"}, - {file = "regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705"}, - {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8"}, - {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf"}, - {file = "regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d"}, - {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84"}, - {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df"}, - {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434"}, - {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a"}, - {file = "regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10"}, - {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac"}, - {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea"}, - {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e"}, - {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521"}, - {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db"}, - {file = "regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e"}, - {file = "regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf"}, - {file = "regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70"}, - {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55b4ea996a8e4458dd7b584a2f89863b1655dd3d17b88b46cbb9becc495a0ec5"}, - {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e1e28be779884189cdd57735e997f282b64fd7ccf6e2eef3e16e57d7a34a815"}, - {file = "regex-2026.1.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0057de9eaef45783ff69fa94ae9f0fd906d629d0bd4c3217048f46d1daa32e9b"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7cd0b2be0f0269283a45c0d8b2c35e149d1319dcb4a43c9c3689fa935c1ee6"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8db052bbd981e1666f09e957f3790ed74080c2229007c1dd67afdbf0b469c48b"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:343db82cb3712c31ddf720f097ef17c11dab2f67f7a3e7be976c4f82eba4e6df"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55e9d0118d97794367309635df398bdfd7c33b93e2fdfa0b239661cd74b4c14e"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:008b185f235acd1e53787333e5690082e4f156c44c87d894f880056089e9bc7c"}, - {file = "regex-2026.1.15-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fd65af65e2aaf9474e468f9e571bd7b189e1df3a61caa59dcbabd0000e4ea839"}, - {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f42e68301ff4afee63e365a5fc302b81bb8ba31af625a671d7acb19d10168a8c"}, - {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f7792f27d3ee6e0244ea4697d92b825f9a329ab5230a78c1a68bd274e64b5077"}, - {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dbaf3c3c37ef190439981648ccbf0c02ed99ae066087dd117fcb616d80b010a4"}, - {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:adc97a9077c2696501443d8ad3fa1b4fc6d131fc8fd7dfefd1a723f89071cf0a"}, - {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:069f56a7bf71d286a6ff932a9e6fb878f151c998ebb2519a9f6d1cee4bffdba3"}, - {file = "regex-2026.1.15-cp39-cp39-win32.whl", hash = "sha256:ea4e6b3566127fda5e007e90a8fd5a4169f0cf0619506ed426db647f19c8454a"}, - {file = "regex-2026.1.15-cp39-cp39-win_amd64.whl", hash = "sha256:cda1ed70d2b264952e88adaa52eea653a33a1b98ac907ae2f86508eb44f65cdc"}, - {file = "regex-2026.1.15-cp39-cp39-win_arm64.whl", hash = "sha256:b325d4714c3c48277bfea1accd94e193ad6ed42b4bad79ad64f3b8f8a31260a5"}, - {file = "regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"}, + {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"}, + {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"}, + {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"}, + {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"}, + {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"}, + {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"}, + {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"}, + {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"}, + {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"}, + {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"}, + {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"}, + {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"}, + {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"}, + {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"}, + {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"}, + {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"}, + {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"}, + {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"}, + {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"}, + {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"}, + {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"}, + {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"}, + {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"}, + {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"}, + {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"}, ] [[package]] @@ -6531,15 +6226,15 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "resend" -version = "2.21.0" +version = "2.19.0" description = "Resend Python SDK" optional = true python-versions = ">=3.7" groups = ["main"] markers = "extra == \"extra-proxy\"" files = [ - {file = "resend-2.21.0-py2.py3-none-any.whl", hash = "sha256:906d1916298e7b6b9a0f2a8e81a123f12cda5fd07683ecbfa53b54e8ec58f5f4"}, - {file = "resend-2.21.0.tar.gz", hash = "sha256:765288c2015c2c4dd0fb3c8596af4007709b790336eda2966593194377546d11"}, + {file = "resend-2.19.0-py2.py3-none-any.whl", hash = "sha256:1a8b9fcacbe058876ebce757ac2542103ed7227caec10e5c58613ee58615acaa"}, + {file = "resend-2.19.0.tar.gz", hash = "sha256:b11191561cdb0ed7aa193212b7c8865bf635013c4d11bd81caf471d1b362be02"}, ] [package.dependencies] @@ -6602,18 +6297,22 @@ pygments = ">=2.13.0,<3.0.0" jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "roman-numerals" -version = "4.1.0" +name = "roman-numerals-py" +version = "3.1.0" description = "Manipulate well-formed Roman numerals" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.11\" and extra == \"utils\"" files = [ - {file = "roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7"}, - {file = "roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2"}, + {file = "roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c"}, + {file = "roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"}, ] +[package.extras] +lint = ["mypy (==1.15.0)", "pyright (==1.1.394)", "ruff (==0.9.7)"] +test = ["pytest (>=8)"] + [[package]] name = "rpds-py" version = "0.27.1" @@ -6782,141 +6481,141 @@ files = [ [[package]] name = "rpds-py" -version = "0.30.0" +version = "0.29.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.10" groups = ["main"] markers = "python_version >= \"3.10\"" files = [ - {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, - {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, - {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, - {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, - {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, - {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, - {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, - {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, - {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, - {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, - {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, - {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, - {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, - {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, - {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, - {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, - {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, - {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, - {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, - {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, - {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, - {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, - {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, - {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, - {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, - {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, - {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, - {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, - {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, - {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, - {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, - {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, - {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, - {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, - {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, - {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, - {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, - {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, - {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, - {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, - {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, - {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, - {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, - {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, - {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, - {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, - {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, - {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, + {file = "rpds_py-0.29.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4ae4b88c6617e1b9e5038ab3fccd7bac0842fdda2b703117b2aa99bc85379113"}, + {file = "rpds_py-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d9128ec9d8cecda6f044001fde4fb71ea7c24325336612ef8179091eb9596b9"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37812c3da8e06f2bb35b3cf10e4a7b68e776a706c13058997238762b4e07f4f"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66786c3fb1d8de416a7fa8e1cb1ec6ba0a745b2b0eee42f9b7daa26f1a495545"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58f5c77f1af888b5fd1876c9a0d9858f6f88a39c9dd7c073a88e57e577da66d"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:799156ef1f3529ed82c36eb012b5d7a4cf4b6ef556dd7cc192148991d07206ae"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:453783477aa4f2d9104c4b59b08c871431647cb7af51b549bbf2d9eb9c827756"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:24a7231493e3c4a4b30138b50cca089a598e52c34cf60b2f35cebf62f274fdea"}, + {file = "rpds_py-0.29.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7033c1010b1f57bb44d8067e8c25aa6fa2e944dbf46ccc8c92b25043839c3fd2"}, + {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0248b19405422573621172ab8e3a1f29141362d13d9f72bafa2e28ea0cdca5a2"}, + {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f9f436aee28d13b9ad2c764fc273e0457e37c2e61529a07b928346b219fcde3b"}, + {file = "rpds_py-0.29.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24a16cb7163933906c62c272de20ea3c228e4542c8c45c1d7dc2b9913e17369a"}, + {file = "rpds_py-0.29.0-cp310-cp310-win32.whl", hash = "sha256:1a409b0310a566bfd1be82119891fefbdce615ccc8aa558aff7835c27988cbef"}, + {file = "rpds_py-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5523b0009e7c3c1263471b69d8da1c7d41b3ecb4cb62ef72be206b92040a950"}, + {file = "rpds_py-0.29.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9b9c764a11fd637e0322a488560533112837f5334ffeb48b1be20f6d98a7b437"}, + {file = "rpds_py-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fd2164d73812026ce970d44c3ebd51e019d2a26a4425a5dcbdfa93a34abc383"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a097b7f7f7274164566ae90a221fd725363c0e9d243e2e9ed43d195ccc5495c"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cdc0490374e31cedefefaa1520d5fe38e82fde8748cbc926e7284574c714d6b"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89ca2e673ddd5bde9b386da9a0aac0cab0e76f40c8f0aaf0d6311b6bbf2aa311"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5d9da3ff5af1ca1249b1adb8ef0573b94c76e6ae880ba1852f033bf429d4588"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8238d1d310283e87376c12f658b61e1ee23a14c0e54c7c0ce953efdbdc72deed"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2d6fb2ad1c36f91c4646989811e84b1ea5e0c3cf9690b826b6e32b7965853a63"}, + {file = "rpds_py-0.29.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:534dc9df211387547267ccdb42253aa30527482acb38dd9b21c5c115d66a96d2"}, + {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d456e64724a075441e4ed648d7f154dc62e9aabff29bcdf723d0c00e9e1d352f"}, + {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a738f2da2f565989401bd6fd0b15990a4d1523c6d7fe83f300b7e7d17212feca"}, + {file = "rpds_py-0.29.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a110e14508fd26fd2e472bb541f37c209409876ba601cf57e739e87d8a53cf95"}, + {file = "rpds_py-0.29.0-cp311-cp311-win32.whl", hash = "sha256:923248a56dd8d158389a28934f6f69ebf89f218ef96a6b216a9be6861804d3f4"}, + {file = "rpds_py-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:539eb77eb043afcc45314d1be09ea6d6cafb3addc73e0547c171c6d636957f60"}, + {file = "rpds_py-0.29.0-cp311-cp311-win_arm64.whl", hash = "sha256:bdb67151ea81fcf02d8f494703fb728d4d34d24556cbff5f417d74f6f5792e7c"}, + {file = "rpds_py-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954"}, + {file = "rpds_py-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181"}, + {file = "rpds_py-0.29.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c"}, + {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7"}, + {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19"}, + {file = "rpds_py-0.29.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0"}, + {file = "rpds_py-0.29.0-cp312-cp312-win32.whl", hash = "sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7"}, + {file = "rpds_py-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977"}, + {file = "rpds_py-0.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7"}, + {file = "rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61"}, + {file = "rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b"}, + {file = "rpds_py-0.29.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55"}, + {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd"}, + {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea"}, + {file = "rpds_py-0.29.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22"}, + {file = "rpds_py-0.29.0-cp313-cp313-win32.whl", hash = "sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7"}, + {file = "rpds_py-0.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e"}, + {file = "rpds_py-0.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2"}, + {file = "rpds_py-0.29.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c"}, + {file = "rpds_py-0.29.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e"}, + {file = "rpds_py-0.29.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb"}, + {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967"}, + {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e"}, + {file = "rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a"}, + {file = "rpds_py-0.29.0-cp313-cp313t-win32.whl", hash = "sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb"}, + {file = "rpds_py-0.29.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352"}, + {file = "rpds_py-0.29.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1"}, + {file = "rpds_py-0.29.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c"}, + {file = "rpds_py-0.29.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318"}, + {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212"}, + {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94"}, + {file = "rpds_py-0.29.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d"}, + {file = "rpds_py-0.29.0-cp314-cp314-win32.whl", hash = "sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1"}, + {file = "rpds_py-0.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b"}, + {file = "rpds_py-0.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9"}, + {file = "rpds_py-0.29.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10"}, + {file = "rpds_py-0.29.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761"}, + {file = "rpds_py-0.29.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3"}, + {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9"}, + {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8"}, + {file = "rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a"}, + {file = "rpds_py-0.29.0-cp314-cp314t-win32.whl", hash = "sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5"}, + {file = "rpds_py-0.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:acd82a9e39082dc5f4492d15a6b6c8599aa21db5c35aaf7d6889aea16502c07d"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:715b67eac317bf1c7657508170a3e011a1ea6ccb1c9d5f296e20ba14196be6b3"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3b1b87a237cb2dba4db18bcfaaa44ba4cd5936b91121b62292ff21df577fc43"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c3c3e8101bb06e337c88eb0c0ede3187131f19d97d43ea0e1c5407ea74c0cbf"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8e54d6e61f3ecd3abe032065ce83ea63417a24f437e4a3d73d2f85ce7b7cfe"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fbd4e9aebf110473a420dea85a238b254cf8a15acb04b22a5a6b5ce8925b760"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fdf53d36e6c72819993e35d1ebeeb8e8fc688d0c6c2b391b55e335b3afba5a"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:ea7173df5d86f625f8dde6d5929629ad811ed8decda3b60ae603903839ac9ac0"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:76054d540061eda273274f3d13a21a4abdde90e13eaefdc205db37c05230efce"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9f84c549746a5be3bc7415830747a3a0312573afc9f95785eb35228bb17742ec"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:0ea962671af5cb9a260489e311fa22b2e97103e3f9f0caaea6f81390af96a9ed"}, + {file = "rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f7728653900035fb7b8d06e1e5900545d8088efc9d5d4545782da7df03ec803f"}, + {file = "rpds_py-0.29.0.tar.gz", hash = "sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359"}, ] [[package]] name = "rq" -version = "2.6.1" +version = "2.6.0" description = "RQ is a simple, lightweight, library for creating background jobs, and processing them." optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "rq-2.6.1-py3-none-any.whl", hash = "sha256:5cc88d3bb5263a407fb2ba2dc6fe8dc710dae94b6f74396cdfe1b32beded9408"}, - {file = "rq-2.6.1.tar.gz", hash = "sha256:db5c0d125ac9dbd4438f9a5225ea3e64050542b416fd791d424e2ab5b2853289"}, + {file = "rq-2.6.0-py3-none-any.whl", hash = "sha256:be5ccc0f0fc5f32da0999648340e31476368f08067f0c3fce6768d00064edbb5"}, + {file = "rq-2.6.0.tar.gz", hash = "sha256:92ad55676cda14512c4eea5782f398a102dc3af108bea197c868c4c50c5d3e81"}, ] [package.dependencies] @@ -6993,7 +6692,7 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.10" groups = ["main"] -markers = "python_version == \"3.10\" and extra == \"mlflow\"" +markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, @@ -7043,69 +6742,6 @@ install = ["joblib (>=1.2.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)", "threadpoo maintenance = ["conda-lock (==3.0.1)"] tests = ["matplotlib (>=3.5.0)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.2.1)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)", "scikit-image (>=0.19.0)"] -[[package]] -name = "scikit-learn" -version = "1.8.0" -description = "A set of python modules for machine learning and data mining" -optional = true -python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.11\" and extra == \"mlflow\"" -files = [ - {file = "scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da"}, - {file = "scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1"}, - {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b"}, - {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1"}, - {file = "scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b"}, - {file = "scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961"}, - {file = "scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e"}, - {file = "scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76"}, - {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4"}, - {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a"}, - {file = "scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809"}, - {file = "scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb"}, - {file = "scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a"}, - {file = "scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e"}, - {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57"}, - {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e"}, - {file = "scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271"}, - {file = "scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702"}, - {file = "scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde"}, - {file = "scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3"}, - {file = "scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7"}, - {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6"}, - {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4"}, - {file = "scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6"}, - {file = "scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2"}, - {file = "scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c"}, - {file = "scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd"}, -] - -[package.dependencies] -joblib = ">=1.3.0" -numpy = ">=1.24.1" -scipy = ">=1.10.0" -threadpoolctl = ">=3.2.0" - -[package.extras] -benchmark = ["matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "pandas (>=1.5.0)"] -build = ["cython (>=3.1.2)", "meson-python (>=0.17.1)", "numpy (>=1.24.1)", "scipy (>=1.10.0)"] -docs = ["Pillow (>=10.1.0)", "matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] -examples = ["matplotlib (>=3.6.1)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "pooch (>=1.8.0)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)"] -install = ["joblib (>=1.3.0)", "numpy (>=1.24.1)", "scipy (>=1.10.0)", "threadpoolctl (>=3.2.0)"] -maintenance = ["conda-lock (==3.0.1)"] -tests = ["matplotlib (>=3.6.1)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pyamg (>=5.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)"] - [[package]] name = "scipy" version = "1.15.3" @@ -7173,82 +6809,82 @@ test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis [[package]] name = "scipy" -version = "1.17.0" +version = "1.16.3" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.11" groups = ["main"] markers = "python_version >= \"3.11\" and extra == \"mlflow\"" files = [ - {file = "scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd"}, - {file = "scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558"}, - {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7"}, - {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6"}, - {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042"}, - {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4"}, - {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0"}, - {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449"}, - {file = "scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea"}, - {file = "scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379"}, - {file = "scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57"}, - {file = "scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e"}, - {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8"}, - {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306"}, - {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742"}, - {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b"}, - {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d"}, - {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e"}, - {file = "scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8"}, - {file = "scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b"}, - {file = "scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6"}, - {file = "scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269"}, - {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72"}, - {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61"}, - {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6"}, - {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752"}, - {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d"}, - {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea"}, - {file = "scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812"}, - {file = "scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2"}, - {file = "scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3"}, - {file = "scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97"}, - {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e"}, - {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07"}, - {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00"}, - {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45"}, - {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209"}, - {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04"}, - {file = "scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0"}, - {file = "scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67"}, - {file = "scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a"}, - {file = "scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2"}, - {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467"}, - {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e"}, - {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67"}, - {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73"}, - {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b"}, - {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b"}, - {file = "scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061"}, - {file = "scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb"}, - {file = "scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1"}, - {file = "scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1"}, - {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232"}, - {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d"}, - {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba"}, - {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db"}, - {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf"}, - {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f"}, - {file = "scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088"}, - {file = "scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff"}, - {file = "scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733"}, + {file = "scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78"}, + {file = "scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70"}, + {file = "scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc"}, + {file = "scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d"}, + {file = "scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304"}, + {file = "scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6"}, + {file = "scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc"}, + {file = "scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc"}, + {file = "scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22"}, + {file = "scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc"}, + {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0"}, + {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800"}, + {file = "scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d"}, + {file = "scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa"}, + {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8"}, + {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353"}, + {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146"}, + {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d"}, + {file = "scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7"}, + {file = "scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562"}, + {file = "scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb"}, ] [package.dependencies] -numpy = ">=1.26.4,<2.7" +numpy = ">=1.25.2,<2.6" [package.extras] -dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] -doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] @@ -7295,6 +6931,141 @@ postgres = ["psycopg[binary] (>=3.1.0,<4)"] qdrant = ["qdrant-client (>=1.11.1,<2)"] vision = ["pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\""] +[[package]] +name = "shapely" +version = "2.0.7" +description = "Manipulation and analysis of geometric objects" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version == \"3.9\" and extra == \"google\"" +files = [ + {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, + {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895"}, + {file = "shapely-2.0.7-cp310-cp310-win32.whl", hash = "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2"}, + {file = "shapely-2.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3"}, + {file = "shapely-2.0.7-cp311-cp311-win32.whl", hash = "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2"}, + {file = "shapely-2.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73"}, + {file = "shapely-2.0.7-cp312-cp312-win32.whl", hash = "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd"}, + {file = "shapely-2.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98"}, + {file = "shapely-2.0.7-cp313-cp313-win32.whl", hash = "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913"}, + {file = "shapely-2.0.7-cp313-cp313-win_amd64.whl", hash = "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e"}, + {file = "shapely-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98"}, + {file = "shapely-2.0.7-cp37-cp37m-win32.whl", hash = "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d"}, + {file = "shapely-2.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24"}, + {file = "shapely-2.0.7-cp38-cp38-win32.whl", hash = "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532"}, + {file = "shapely-2.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27"}, + {file = "shapely-2.0.7-cp39-cp39-win32.whl", hash = "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999"}, + {file = "shapely-2.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5"}, + {file = "shapely-2.0.7.tar.gz", hash = "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "shapely" +version = "2.1.2" +description = "Manipulation and analysis of geometric objects" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"google\"" +files = [ + {file = "shapely-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f"}, + {file = "shapely-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0"}, + {file = "shapely-2.1.2-cp310-cp310-win32.whl", hash = "sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e"}, + {file = "shapely-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2"}, + {file = "shapely-2.1.2-cp311-cp311-win32.whl", hash = "sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6"}, + {file = "shapely-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d"}, + {file = "shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454"}, + {file = "shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd"}, + {file = "shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350"}, + {file = "shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99"}, + {file = "shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf"}, + {file = "shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc"}, + {file = "shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566"}, + {file = "shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0"}, + {file = "shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735"}, + {file = "shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9"}, + {file = "shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9"}, +] + +[package.dependencies] +numpy = ">=1.21" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov", "scipy-doctest"] + [[package]] name = "shellingham" version = "1.5.4" @@ -7320,29 +7091,6 @@ files = [ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[[package]] -name = "skops" -version = "0.13.0" -description = "A set of tools, related to machine learning in production." -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\"" -files = [ - {file = "skops-0.13.0-py3-none-any.whl", hash = "sha256:55e2cccb18c86f5916e4cfe5acf55ed7b0eecddf08a151906414c092fa5926dc"}, - {file = "skops-0.13.0.tar.gz", hash = "sha256:66949fd3c95cbb5c80270fbe40293c0fe1e46cb4a921860e42584dd9c20ebeb1"}, -] - -[package.dependencies] -numpy = ">=1.25.0" -packaging = ">=17.0" -prettytable = ">=3.9" -scikit-learn = ">=1.2" -scipy = ">=1.10.0" - -[package.extras] -rich = ["rich (>=12)"] - [[package]] name = "smmap" version = "5.0.2" @@ -7362,7 +7110,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["main", "dev", "proxy-dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -7483,28 +7231,28 @@ test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools [[package]] name = "sphinx" -version = "9.0.4" +version = "8.2.3" description = "Python documentation generator" optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version == \"3.11\" and extra == \"utils\"" +markers = "python_version >= \"3.11\" and extra == \"utils\"" files = [ - {file = "sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb"}, - {file = "sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3"}, + {file = "sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3"}, + {file = "sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348"}, ] [package.dependencies] alabaster = ">=0.7.14" babel = ">=2.13" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} -docutils = ">=0.20,<0.23" +docutils = ">=0.20,<0.22" imagesize = ">=1.3" Jinja2 = ">=3.1" packaging = ">=23.0" Pygments = ">=2.17" requests = ">=2.30.0" -roman-numerals = ">=1.0.0" +roman-numerals-py = ">=1.0.0" snowballstemmer = ">=2.2" sphinxcontrib-applehelp = ">=1.0.7" sphinxcontrib-devhelp = ">=1.0.6" @@ -7513,37 +7261,10 @@ sphinxcontrib-jsmath = ">=1.0.1" sphinxcontrib-qthelp = ">=1.0.6" sphinxcontrib-serializinghtml = ">=1.1.9" -[[package]] -name = "sphinx" -version = "9.1.0" -description = "Python documentation generator" -optional = true -python-versions = ">=3.12" -groups = ["main"] -markers = "python_version >= \"3.12\" and extra == \"utils\"" -files = [ - {file = "sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978"}, - {file = "sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb"}, -] - -[package.dependencies] -alabaster = ">=0.7.14" -babel = ">=2.13" -colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} -docutils = ">=0.21,<0.23" -imagesize = ">=1.3" -Jinja2 = ">=3.1" -packaging = ">=23.0" -Pygments = ">=2.17" -requests = ">=2.30.0" -roman-numerals = ">=1.0.0" -snowballstemmer = ">=2.2" -sphinxcontrib-applehelp = ">=1.0.7" -sphinxcontrib-devhelp = ">=1.0.6" -sphinxcontrib-htmlhelp = ">=2.0.6" -sphinxcontrib-jsmath = ">=1.0.1" -sphinxcontrib-qthelp = ">=1.0.6" -sphinxcontrib-serializinghtml = ">=1.1.9" +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["betterproto (==2.0.0b6)", "mypy (==1.15.0)", "pypi-attestations (==0.0.21)", "pyright (==1.1.395)", "pytest (>=8.0)", "ruff (==0.9.9)", "sphinx-lint (>=0.9)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.19.0.20250219)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241128)", "types-requests (==2.32.0.20241016)", "types-urllib3 (==1.26.25.14)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "pytest-xdist[psutil] (>=3.4)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinxcontrib-applehelp" @@ -7653,72 +7374,70 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.46" +version = "2.0.44" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "sqlalchemy-2.0.46-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-win32.whl", hash = "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047"}, - {file = "sqlalchemy-2.0.46-cp310-cp310-win_amd64.whl", hash = "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-win32.whl", hash = "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d"}, - {file = "sqlalchemy-2.0.46-cp311-cp311-win_amd64.whl", hash = "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-win32.whl", hash = "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb"}, - {file = "sqlalchemy-2.0.46-cp312-cp312-win_amd64.whl", hash = "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-win32.whl", hash = "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f"}, - {file = "sqlalchemy-2.0.46-cp313-cp313-win_amd64.whl", hash = "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef"}, - {file = "sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10"}, - {file = "sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764"}, - {file = "sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b"}, - {file = "sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-win32.whl", hash = "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908"}, - {file = "sqlalchemy-2.0.46-cp314-cp314-win_amd64.whl", hash = "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b"}, - {file = "sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa"}, - {file = "sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863"}, - {file = "sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede"}, - {file = "sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e6199143d51e3e1168bedd98cc698397404a8f7508831b81b6a29b18b051069"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6f827fd687fa1ba7f51699e1132129eac8db8003695513fcf13fc587e1bd47a5"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c805fa6e5d461329fa02f53f88c914d189ea771b6821083937e79550bf31fc19"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-win32.whl", hash = "sha256:3aac08f7546179889c62b53b18ebf1148b10244b3405569c93984b0388d016a7"}, - {file = "sqlalchemy-2.0.46-cp38-cp38-win_amd64.whl", hash = "sha256:0cc3117db526cad3e61074100bd2867b533e2c7dc1569e95c14089735d6fb4fe"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90bde6c6b1827565a95fde597da001212ab436f1b2e0c2dcc7246e14db26e2a3"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94b1e5f3a5f1ff4f42d5daab047428cd45a3380e51e191360a35cef71c9a7a2a"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93bb0aae40b52c57fd74ef9c6933c08c040ba98daf23ad33c3f9893494b8d3ce"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4e2cc868b7b5208aec6c960950b7bb821f82c2fe66446c92ee0a571765e91a5"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:965c62be8256d10c11f8907e7a8d3e18127a4c527a5919d85fa87fd9ecc2cfdc"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-win32.whl", hash = "sha256:9397b381dcee8a2d6b99447ae85ea2530dcac82ca494d1db877087a13e38926d"}, - {file = "sqlalchemy-2.0.46-cp39-cp39-win_amd64.whl", hash = "sha256:4396c948d8217e83e2c202fbdcc0389cf8c93d2c1c5e60fa5c5a955eae0e64be"}, - {file = "sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e"}, - {file = "sqlalchemy-2.0.46.tar.gz", hash = "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-win32.whl", hash = "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-win_amd64.whl", hash = "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-win32.whl", hash = "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-win_amd64.whl", hash = "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-win32.whl", hash = "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-win_amd64.whl", hash = "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-win32.whl", hash = "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-win_amd64.whl", hash = "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6"}, + {file = "sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05"}, + {file = "sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22"}, ] [package.dependencies] @@ -7752,76 +7471,55 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlparse" -version = "0.5.5" +version = "0.5.3" description = "A non-validating SQL parser." optional = true python-versions = ">=3.8" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, - {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, + {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, + {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, ] [package.extras] -dev = ["build"] +dev = ["build", "hatch"] doc = ["sphinx"] [[package]] name = "sse-starlette" -version = "3.2.0" +version = "3.0.3" description = "SSE plugin for Starlette" optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"proxy\"" files = [ - {file = "sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf"}, - {file = "sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422"}, + {file = "sse_starlette-3.0.3-py3-none-any.whl", hash = "sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431"}, + {file = "sse_starlette-3.0.3.tar.gz", hash = "sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971"}, ] [package.dependencies] anyio = ">=4.7.0" -starlette = ">=0.49.1" [package.extras] daphne = ["daphne (>=4.2.0)"] -examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "uvicorn (>=0.34.0)"] +examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.49.1)", "uvicorn (>=0.34.0)"] granian = ["granian (>=2.3.1)"] uvicorn = ["uvicorn (>=0.34.0)"] [[package]] name = "starlette" -version = "0.49.3" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.9" -groups = ["main", "dev"] -files = [ - {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, - {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, -] -markers = {main = "python_version == \"3.9\" and extra == \"proxy\"", dev = "python_version == \"3.9\""} - -[package.dependencies] -anyio = ">=3.6.2,<5" -typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} - -[package.extras] -full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] - -[[package]] -name = "starlette" -version = "0.52.1" +version = "0.50.0" description = "The little ASGI library that shines." optional = false python-versions = ">=3.10" groups = ["main", "dev"] files = [ - {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, - {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, + {file = "starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca"}, + {file = "starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\")", dev = "python_version >= \"3.10\""} +markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [package.dependencies] anyio = ">=3.6.2,<5" @@ -7870,7 +7568,7 @@ description = "Retry code until it succeeds" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\")" +markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\" or extra == \"google\"" files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -7880,23 +7578,6 @@ files = [ doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] -[[package]] -name = "tenacity" -version = "9.1.3" -description = "Retry code until it succeeds" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"google\" or extra == \"extra-proxy\") and (python_version < \"3.14\" or extra == \"google\")" -files = [ - {file = "tenacity-9.1.3-py3-none-any.whl", hash = "sha256:51171cfc6b8a7826551e2f029426b10a6af189c5ac6986adcd7eb36d42f17954"}, - {file = "tenacity-9.1.3.tar.gz", hash = "sha256:a6724c947aa717087e2531f883bde5c9188f603f6669a9b8d54eb998e604c12a"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - [[package]] name = "threadpoolctl" version = "3.6.0" @@ -7986,36 +7667,27 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.22.2" +version = "0.22.1" description = "" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c"}, - {file = "tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b"}, - {file = "tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67"}, - {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4"}, - {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a"}, - {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a"}, - {file = "tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5"}, - {file = "tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92"}, - {file = "tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48"}, - {file = "tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc"}, - {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4"}, - {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c"}, - {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195"}, - {file = "tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5"}, - {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319f659ee992222f04e58f84cbf407cfa66a65fe3a8de44e8ad2bc53e7d99012"}, - {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e50f8554d504f617d9e9d6e4c2c2884a12b388a97c5c77f0bc6cf4cd032feee"}, - {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a62ba2c5faa2dd175aaeed7b15abf18d20266189fb3406c5d0550dd34dd5f37"}, - {file = "tokenizers-0.22.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143b999bdc46d10febb15cbffb4207ddd1f410e2c755857b5a0797961bbdc113"}, - {file = "tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917"}, + {file = "tokenizers-0.22.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59fdb013df17455e5f950b4b834a7b3ee2e0271e6378ccb33aa74d178b513c73"}, + {file = "tokenizers-0.22.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8d4e484f7b0827021ac5f9f71d4794aaef62b979ab7608593da22b1d2e3c4edc"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d2962dd28bc67c1f205ab180578a78eef89ac60ca7ef7cbe9635a46a56422a"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38201f15cdb1f8a6843e6563e6e79f4abd053394992b9bbdf5213ea3469b4ae7"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1cbe5454c9a15df1b3443c726063d930c16f047a3cc724b9e6e1a91140e5a21"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7d094ae6312d69cc2a872b54b91b309f4f6fbce871ef28eb27b52a98e4d0214"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd7594a56656ace95cdd6df4cca2e4059d294c5cfb1679c57824b605556cb2f"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ef6063d7a84994129732b47e7915e8710f27f99f3a3260b8a38fc7ccd083f4"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ba0a64f450b9ef412c98f6bcd2a50c6df6e2443b560024a09fa6a03189726879"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:331d6d149fa9c7d632cde4490fb8bbb12337fa3a0232e77892be656464f4b446"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:607989f2ea68a46cb1dfbaf3e3aabdf3f21d8748312dbeb6263d1b3b66c5010a"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a0f307d490295717726598ef6fa4f24af9d484809223bbc253b201c740a06390"}, + {file = "tokenizers-0.22.1-cp39-abi3-win32.whl", hash = "sha256:b5120eed1442765cd90b903bb6cfef781fd8fe64e34ccaecbae4c619b7b12a82"}, + {file = "tokenizers-0.22.1-cp39-abi3-win_amd64.whl", hash = "sha256:65fd6e3fb11ca1e78a6a93602490f134d1fdeb13bcef99389d5102ea318ed138"}, + {file = "tokenizers-0.22.1.tar.gz", hash = "sha256:61de6522785310a309b3407bac22d99c4db5dba349935e99e4d15ea2226af2d9"}, ] [package.dependencies] @@ -8024,112 +7696,107 @@ huggingface-hub = ">=0.16.4,<2.0" [package.extras] dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff", "ty"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff"] [[package]] name = "tomli" -version = "2.4.0" +version = "2.3.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, - {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, - {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, - {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, - {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, - {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, - {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, - {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, - {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, - {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, - {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, - {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, - {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, - {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, - {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, - {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, - {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, - {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, - {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, + {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, + {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, + {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, + {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, + {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, + {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, + {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, + {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, + {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, + {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, + {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, + {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, ] markers = {main = "extra == \"utils\" and python_version == \"3.9\" or python_version == \"3.10\" and (extra == \"utils\" or extra == \"mlflow\")", dev = "python_version < \"3.11\"", proxy-dev = "python_version < \"3.11\""} [[package]] name = "tomlkit" -version = "0.14.0" +version = "0.13.3" description = "Style preserving TOML library" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main", "proxy-dev"] files = [ - {file = "tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680"}, - {file = "tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064"}, + {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, + {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, ] markers = {main = "extra == \"extra-proxy\""} [[package]] name = "tornado" -version = "6.5.4" +version = "6.5.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"semantic-router\" and python_version < \"3.14\"" files = [ - {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, - {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, - {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, - {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, - {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, - {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6"}, + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04"}, + {file = "tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0"}, + {file = "tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f"}, + {file = "tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af"}, + {file = "tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0"}, ] [[package]] name = "tqdm" -version = "4.67.3" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, - {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] @@ -8144,14 +7811,14 @@ telegram = ["requests"] [[package]] name = "typer-slim" -version = "0.21.1" +version = "0.20.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d"}, - {file = "typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd"}, + {file = "typer_slim-0.20.0-py3-none-any.whl", hash = "sha256:f42a9b7571a12b97dddf364745d29f12221865acef7a2680065f9bb29c7dc89d"}, + {file = "typer_slim-0.20.0.tar.gz", hash = "sha256:9fc6607b3c6c20f5c33ea9590cbeb17848667c51feee27d9e314a579ab07d1a3"}, ] [package.dependencies] @@ -8238,15 +7905,15 @@ types-urllib3 = "*" [[package]] name = "types-requests" -version = "2.32.4.20260107" +version = "2.32.4.20250913" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "types_requests-2.32.4.20260107-py3-none-any.whl", hash = "sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d"}, - {file = "types_requests-2.32.4.20260107.tar.gz", hash = "sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f"}, + {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, + {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, ] [package.dependencies] @@ -8254,14 +7921,14 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "80.10.0.20260124" +version = "80.9.0.20250822" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types_setuptools-80.10.0.20260124-py3-none-any.whl", hash = "sha256:efed7e044f01adb9c2806c7a8e1b6aa3656b8e382379b53d5f26ee3db24d4c01"}, - {file = "types_setuptools-80.10.0.20260124.tar.gz", hash = "sha256:1b86d9f0368858663276a0cbe5fe5a9722caf94b5acde8aba0399a6e90680f20"}, + {file = "types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3"}, + {file = "types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965"}, ] [[package]] @@ -8306,15 +7973,15 @@ typing-extensions = ">=4.12.0" [[package]] name = "tzdata" -version = "2025.3" +version = "2025.2" description = "Provider of IANA time zone data" optional = true python-versions = ">=2" groups = ["main"] markers = "platform_system == \"Windows\" and python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") or platform_system == \"Windows\" and extra == \"proxy\" or python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, - {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] @@ -8356,22 +8023,22 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" -version = "2.6.3" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, - {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] -brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" @@ -8454,7 +8121,7 @@ description = "Waitress WSGI server" optional = true python-versions = ">=3.9.0" groups = ["main"] -markers = "python_version >= \"3.10\" and platform_system == \"Windows\" and extra == \"mlflow\"" +markers = "python_version >= \"3.10\" and extra == \"mlflow\" and platform_system == \"Windows\"" files = [ {file = "waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e"}, {file = "waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f"}, @@ -8464,19 +8131,6 @@ files = [ docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] testing = ["coverage (>=7.6.0)", "pytest", "pytest-cov"] -[[package]] -name = "wcwidth" -version = "0.5.3" -description = "Measures the displayed width of unicode strings in a terminal" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version >= \"3.10\" and extra == \"mlflow\"" -files = [ - {file = "wcwidth-0.5.3-py3-none-any.whl", hash = "sha256:d584eff31cd4753e1e5ff6c12e1edfdb324c995713f75d26c29807bb84bf649e"}, - {file = "wcwidth-0.5.3.tar.gz", hash = "sha256:53123b7af053c74e9fe2e92ac810301f6139e64379031f7124574212fb3b4091"}, -] - [[package]] name = "websockets" version = "15.0.1" @@ -8559,19 +8213,19 @@ files = [ [[package]] name = "werkzeug" -version = "3.1.5" +version = "3.1.3" description = "The comprehensive WSGI web application library." optional = true python-versions = ">=3.9" groups = ["main"] markers = "python_version >= \"3.10\" and extra == \"mlflow\"" files = [ - {file = "werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc"}, - {file = "werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67"}, + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, ] [package.dependencies] -markupsafe = ">=2.1.1" +MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] @@ -8877,4 +8531,8 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "b70033cb74265482e16caa7780858ac86e7b4110ffb69e35b01533a30eda8a34" +<<<<<<< litellm_oss_staging_02_04_2026 +content-hash = "797603dcfef0a79781c7d3cba5dfe18f6aea4aa792220f47487ebc7bd04ae2e3" +======= +content-hash = "e5447e14dd37e324ac07a8fc6286d27e9a0d355ed93ebb24fc11e3f5df12fd3e" +>>>>>>> main From 09fb6d0087abf75c9cce81c674eb7d6f1de06b0e Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Fri, 6 Feb 2026 09:24:44 -0800 Subject: [PATCH 062/300] Warn when budget lookup fails; cache won't populate (#20545) * Warn when budget lookup fails; cache won't populate - Add _log_budget_lookup_failure helper in auth_checks.py - Log at WARNING in get_user_object, get_team_object, get_key_object when DB lookups fail (schema mismatch, etc.) - Add schema migration hint for prisma/db errors - Add dry-run test for _log_budget_lookup_failure * fix: skip budget lookup failure log for expected user-not-found case Avoid logging 'cache will not be populated' when the user simply doesn't exist - not caching is correct behavior in that case. Only log for unexpected errors (schema, DB, etc.) where the message is meaningful. --- litellm/proxy/auth/auth_checks.py | 23 +++++++++++++++++++ .../proxy/auth/test_auth_checks.py | 22 ++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 359bb944546..92e98d6446e 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -75,6 +75,28 @@ db_cache_expiry = DEFAULT_IN_MEMORY_TTL # refresh every 5s all_routes = LiteLLMRoutes.openai_routes.value + LiteLLMRoutes.management_routes.value +def _log_budget_lookup_failure(entity: str, error: Exception) -> None: + """ + Log a warning when budget lookup fails; cache will not be populated. + + Skips logging for expected "user not found" cases (bare Exception from + get_user_object when user_id_upsert=False). Adds a schema migration hint + when the error appears schema-related. + """ + # Skip logging for expected "user not found" - not caching is correct + if str(error) == "" and type(error).__name__ == "Exception": + return + err_str = str(error).lower() + hint = "" + if any( + x in err_str + for x in ("column", "schema", "does not exist", "prisma", "migrate") + ): + hint = " Run `prisma db push` or `prisma migrate deploy` to fix schema mismatches." + verbose_proxy_logger.error( + f"Budget lookup failed for {entity}; cache will not be populated. " + f"Each request will hit the database. Error: {error}.{hint}" + ) def _is_model_cost_zero( model: Optional[Union[str, List[str]]], llm_router: Optional[Router] @@ -1208,6 +1230,7 @@ async def get_user_object( return _response except Exception as e: # if user not in db + _log_budget_lookup_failure("user", e) raise ValueError( f"User doesn't exist in db. 'user_id'={user_id}. Create user via `/user/new` call. Got error - {e}" ) diff --git a/tests/test_litellm/proxy/auth/test_auth_checks.py b/tests/test_litellm/proxy/auth/test_auth_checks.py index ebcd9676129..4f8e80c023e 100644 --- a/tests/test_litellm/proxy/auth/test_auth_checks.py +++ b/tests/test_litellm/proxy/auth/test_auth_checks.py @@ -30,6 +30,7 @@ from litellm.proxy.auth.auth_checks import ( _can_object_call_vector_stores, _get_fuzzy_user_object, _get_team_db_check, + _log_budget_lookup_failure, _virtual_key_max_budget_alert_check, _virtual_key_soft_budget_check, get_user_object, @@ -273,6 +274,27 @@ async def test_default_internal_user_params_with_get_user_object(monkeypatch): assert creation_args["user_role"] == "internal_user" +def test_log_budget_lookup_failure_dry_run(): + """Dry run: verify _log_budget_lookup_failure logs for schema/DB errors.""" + with patch("litellm.proxy.auth.auth_checks.verbose_proxy_logger") as mock_logger: + err = Exception("column 'policies' does not exist in prisma schema") + _log_budget_lookup_failure("user", err) + mock_logger.error.assert_called_once() + call_msg = mock_logger.error.call_args[0][0] + assert "user" in call_msg + assert "cache will not be populated" in call_msg + assert "policies" in call_msg or "prisma" in call_msg + assert "prisma db push" in call_msg + + +def test_log_budget_lookup_failure_skips_user_not_found(): + """Verify _log_budget_lookup_failure does NOT log for expected user-not-found.""" + with patch("litellm.proxy.auth.auth_checks.verbose_proxy_logger") as mock_logger: + err = Exception() # bare Exception from get_user_object when user not found + _log_budget_lookup_failure("user", err) + mock_logger.error.assert_not_called() + + @pytest.mark.asyncio @patch("litellm.proxy.management_endpoints.team_endpoints.new_team", new_callable=AsyncMock) async def test_get_team_db_check_calls_new_team_on_upsert(mock_new_team, monkeypatch): From ee70010ef16f66b7537c7907689f6f17b52ab221 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 6 Feb 2026 11:32:35 -0800 Subject: [PATCH 063/300] Adding testing coverage --- .../hooks/useDisableShowNewBadge.test.ts | 180 ++++++++ .../hooks/useDisableShowPrompts.test.ts | 180 ++++++++ .../SearchTools/SearchToolTester.test.tsx | 426 ++++++++++++++++++ .../common_components/chartUtils.test.tsx | 382 ++++++++++++++++ 4 files changed, 1168 insertions(+) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowNewBadge.test.ts create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.test.ts create mode 100644 ui/litellm-dashboard/src/components/SearchTools/SearchToolTester.test.tsx create mode 100644 ui/litellm-dashboard/src/components/common_components/chartUtils.test.tsx diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowNewBadge.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowNewBadge.test.ts new file mode 100644 index 00000000000..e01e2a4cf84 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowNewBadge.test.ts @@ -0,0 +1,180 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; +import { renderHook, waitFor } from "@testing-library/react"; +import { useDisableShowNewBadge } from "./useDisableShowNewBadge"; +import { LOCAL_STORAGE_EVENT } from "@/utils/localStorageUtils"; + +describe("useDisableShowNewBadge", () => { + const STORAGE_KEY = "disableShowNewBadge"; + + beforeEach(() => { + localStorage.clear(); + vi.clearAllMocks(); + }); + + afterEach(() => { + localStorage.clear(); + }); + + it("should return false when localStorage is empty", () => { + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + }); + + it("should return false when localStorage value is not 'true'", () => { + localStorage.setItem(STORAGE_KEY, "false"); + + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + }); + + it("should return true when localStorage value is 'true'", () => { + localStorage.setItem(STORAGE_KEY, "true"); + + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(true); + }); + + it("should return false when localStorage value is an empty string", () => { + localStorage.setItem(STORAGE_KEY, ""); + + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + }); + + it("should update when storage event fires for the correct key", async () => { + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const storageEvent = new StorageEvent("storage", { + key: STORAGE_KEY, + newValue: "true", + }); + window.dispatchEvent(storageEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should not update when storage event fires for a different key", () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + + const storageEvent = new StorageEvent("storage", { + key: "otherKey", + newValue: "true", + }); + window.dispatchEvent(storageEvent); + + expect(result.current).toBe(false); + }); + + it("should update when custom LOCAL_STORAGE_EVENT fires for the correct key", async () => { + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should not update when custom LOCAL_STORAGE_EVENT fires for a different key", () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: "otherKey" }, + }); + window.dispatchEvent(customEvent); + + expect(result.current).toBe(false); + }); + + it("should update when localStorage changes from false to true via custom event", async () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should update when localStorage changes from true to false via storage event", async () => { + localStorage.setItem(STORAGE_KEY, "true"); + const { result } = renderHook(() => useDisableShowNewBadge()); + + expect(result.current).toBe(true); + + localStorage.setItem(STORAGE_KEY, "false"); + const storageEvent = new StorageEvent("storage", { + key: STORAGE_KEY, + newValue: "false", + }); + window.dispatchEvent(storageEvent); + + await waitFor(() => { + expect(result.current).toBe(false); + }); + }); + + it("should cleanup event listeners on unmount", () => { + const addEventListenerSpy = vi.spyOn(window, "addEventListener"); + const removeEventListenerSpy = vi.spyOn(window, "removeEventListener"); + + const { unmount } = renderHook(() => useDisableShowNewBadge()); + + expect(addEventListenerSpy).toHaveBeenCalledTimes(2); + expect(addEventListenerSpy).toHaveBeenCalledWith("storage", expect.any(Function)); + expect(addEventListenerSpy).toHaveBeenCalledWith(LOCAL_STORAGE_EVENT, expect.any(Function)); + + unmount(); + + expect(removeEventListenerSpy).toHaveBeenCalledTimes(2); + expect(removeEventListenerSpy).toHaveBeenCalledWith("storage", expect.any(Function)); + expect(removeEventListenerSpy).toHaveBeenCalledWith(LOCAL_STORAGE_EVENT, expect.any(Function)); + }); + + it("should handle multiple hooks independently", async () => { + const { result: result1 } = renderHook(() => useDisableShowNewBadge()); + const { result: result2 } = renderHook(() => useDisableShowNewBadge()); + + expect(result1.current).toBe(false); + expect(result2.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result1.current).toBe(true); + expect(result2.current).toBe(true); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.test.ts new file mode 100644 index 00000000000..7373f9a3202 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.test.ts @@ -0,0 +1,180 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; +import { renderHook, waitFor } from "@testing-library/react"; +import { useDisableShowPrompts } from "./useDisableShowPrompts"; +import { LOCAL_STORAGE_EVENT } from "@/utils/localStorageUtils"; + +describe("useDisableShowPrompts", () => { + const STORAGE_KEY = "disableShowPrompts"; + + beforeEach(() => { + localStorage.clear(); + vi.clearAllMocks(); + }); + + afterEach(() => { + localStorage.clear(); + }); + + it("should return false when localStorage is empty", () => { + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + }); + + it("should return false when localStorage value is not 'true'", () => { + localStorage.setItem(STORAGE_KEY, "false"); + + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + }); + + it("should return true when localStorage value is 'true'", () => { + localStorage.setItem(STORAGE_KEY, "true"); + + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(true); + }); + + it("should return false when localStorage value is an empty string", () => { + localStorage.setItem(STORAGE_KEY, ""); + + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + }); + + it("should update when storage event fires for the correct key", async () => { + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const storageEvent = new StorageEvent("storage", { + key: STORAGE_KEY, + newValue: "true", + }); + window.dispatchEvent(storageEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should not update when storage event fires for a different key", () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + + const storageEvent = new StorageEvent("storage", { + key: "otherKey", + newValue: "true", + }); + window.dispatchEvent(storageEvent); + + expect(result.current).toBe(false); + }); + + it("should update when custom LOCAL_STORAGE_EVENT fires for the correct key", async () => { + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should not update when custom LOCAL_STORAGE_EVENT fires for a different key", () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: "otherKey" }, + }); + window.dispatchEvent(customEvent); + + expect(result.current).toBe(false); + }); + + it("should update when localStorage changes from false to true via custom event", async () => { + localStorage.setItem(STORAGE_KEY, "false"); + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result.current).toBe(true); + }); + }); + + it("should update when localStorage changes from true to false via storage event", async () => { + localStorage.setItem(STORAGE_KEY, "true"); + const { result } = renderHook(() => useDisableShowPrompts()); + + expect(result.current).toBe(true); + + localStorage.setItem(STORAGE_KEY, "false"); + const storageEvent = new StorageEvent("storage", { + key: STORAGE_KEY, + newValue: "false", + }); + window.dispatchEvent(storageEvent); + + await waitFor(() => { + expect(result.current).toBe(false); + }); + }); + + it("should cleanup event listeners on unmount", () => { + const addEventListenerSpy = vi.spyOn(window, "addEventListener"); + const removeEventListenerSpy = vi.spyOn(window, "removeEventListener"); + + const { unmount } = renderHook(() => useDisableShowPrompts()); + + expect(addEventListenerSpy).toHaveBeenCalledTimes(2); + expect(addEventListenerSpy).toHaveBeenCalledWith("storage", expect.any(Function)); + expect(addEventListenerSpy).toHaveBeenCalledWith(LOCAL_STORAGE_EVENT, expect.any(Function)); + + unmount(); + + expect(removeEventListenerSpy).toHaveBeenCalledTimes(2); + expect(removeEventListenerSpy).toHaveBeenCalledWith("storage", expect.any(Function)); + expect(removeEventListenerSpy).toHaveBeenCalledWith(LOCAL_STORAGE_EVENT, expect.any(Function)); + }); + + it("should handle multiple hooks independently", async () => { + const { result: result1 } = renderHook(() => useDisableShowPrompts()); + const { result: result2 } = renderHook(() => useDisableShowPrompts()); + + expect(result1.current).toBe(false); + expect(result2.current).toBe(false); + + localStorage.setItem(STORAGE_KEY, "true"); + const customEvent = new CustomEvent(LOCAL_STORAGE_EVENT, { + detail: { key: STORAGE_KEY }, + }); + window.dispatchEvent(customEvent); + + await waitFor(() => { + expect(result1.current).toBe(true); + expect(result2.current).toBe(true); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/components/SearchTools/SearchToolTester.test.tsx b/ui/litellm-dashboard/src/components/SearchTools/SearchToolTester.test.tsx new file mode 100644 index 00000000000..254a634e3b3 --- /dev/null +++ b/ui/litellm-dashboard/src/components/SearchTools/SearchToolTester.test.tsx @@ -0,0 +1,426 @@ +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { SearchToolTester } from "./SearchToolTester"; +import * as networking from "../networking"; +import NotificationsManager from "../molecules/notifications_manager"; +import * as antd from "antd"; + +vi.mock("../networking", () => ({ + searchToolQueryCall: vi.fn(), +})); + +vi.mock("antd", async () => { + const actual = await vi.importActual("antd"); + return { + ...actual, + message: { + warning: vi.fn(), + success: vi.fn(), + error: vi.fn(), + }, + }; +}); + +const mockSearchResults = { + results: [ + { + title: "Test Result 1", + url: "https://example.com/result1", + snippet: "This is a short snippet for the first result.", + }, + { + title: "Test Result 2", + url: "https://example.com/result2", + snippet: "This is a longer snippet that exceeds two hundred characters and should be truncated when displayed in the results. It contains more detailed information about the search result that would normally be shown in a search engine result page.", + }, + ], +}; + +const defaultProps = { + searchToolName: "test-search-tool", + accessToken: "test-token", +}; + +describe("SearchToolTester", () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(networking.searchToolQueryCall).mockResolvedValue(mockSearchResults); + vi.spyOn(Date, "now").mockReturnValue(1000000000000); + }); + + it("should render", () => { + render(); + expect(screen.getByText("Test Search Tool")).toBeInTheDocument(); + }); + + it("should display empty state when no search has been performed", () => { + render(); + expect(screen.getByText("Test your search tool")).toBeInTheDocument(); + expect(screen.getByText("Enter a query above to see search results")).toBeInTheDocument(); + }); + + it("should display search input with placeholder", () => { + render(); + expect(screen.getByPlaceholderText("Enter your search query...")).toBeInTheDocument(); + }); + + it("should display search button", () => { + render(); + expect(screen.getByRole("button", { name: /search/i })).toBeInTheDocument(); + }); + + it("should disable search button when input is empty", () => { + render(); + const searchButton = screen.getByRole("button", { name: /search/i }); + expect(searchButton).toBeDisabled(); + }); + + it("should enable search button when input has text", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + expect(searchButton).not.toBeDisabled(); + }); + + it("should call searchToolQueryCall when search button is clicked", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + expect(networking.searchToolQueryCall).toHaveBeenCalledWith("test-token", "test-search-tool", "test query"); + }); + + it("should call searchToolQueryCall when Enter is pressed in input", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query{Enter}"); + expect(networking.searchToolQueryCall).toHaveBeenCalledWith("test-token", "test-search-tool", "test query"); + }); + + it("should not call searchToolQueryCall when Shift+Enter is pressed", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + await user.keyboard("{Shift>}{Enter}{/Shift}"); + expect(networking.searchToolQueryCall).not.toHaveBeenCalled(); + }); + + it("should display loading state while searching", async () => { + vi.mocked(networking.searchToolQueryCall).mockImplementation( + () => new Promise((resolve) => setTimeout(() => resolve(mockSearchResults), 100)), + ); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + expect(screen.getByText("Searching...")).toBeInTheDocument(); + }); + + it("should display search results after successful search", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("Test Result 1")).toBeInTheDocument(); + }); + expect(screen.getByText("Test Result 2")).toBeInTheDocument(); + }); + + it("should display search query in results header", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("test query")).toBeInTheDocument(); + }); + }); + + it("should display result count in results header", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("2 results")).toBeInTheDocument(); + }); + }); + + it("should display singular result count when only one result", async () => { + const singleResult = { + results: [ + { + title: "Single Result", + url: "https://example.com/single", + snippet: "Single result snippet", + }, + ], + }; + vi.mocked(networking.searchToolQueryCall).mockResolvedValue(singleResult); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("1 result")).toBeInTheDocument(); + }); + }); + + it("should display result URLs", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("https://example.com/result1")).toBeInTheDocument(); + }); + expect(screen.getByText("https://example.com/result2")).toBeInTheDocument(); + }); + + it("should display result snippets", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("This is a short snippet for the first result.")).toBeInTheDocument(); + }); + }); + + it("should truncate long snippets and show expand button", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText(/Show more/i)).toBeInTheDocument(); + }); + }); + + it("should expand snippet when Show more is clicked", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText(/Show more/i)).toBeInTheDocument(); + }); + const expandButton = screen.getByText(/Show more/i); + await user.click(expandButton); + expect(screen.getByText(/Show less/i)).toBeInTheDocument(); + }); + + it("should collapse snippet when Show less is clicked", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText(/Show more/i)).toBeInTheDocument(); + }); + const expandButton = screen.getByText(/Show more/i); + await user.click(expandButton); + const collapseButton = screen.getByText(/Show less/i); + await user.click(collapseButton); + expect(screen.getByText(/Show more/i)).toBeInTheDocument(); + }); + + it("should display no results message when search returns empty results", async () => { + vi.mocked(networking.searchToolQueryCall).mockResolvedValue({ results: [] }); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("No results found")).toBeInTheDocument(); + }); + expect(screen.getByText("Try a different search query")).toBeInTheDocument(); + }); + + it("should display no results message when search returns null results", async () => { + vi.mocked(networking.searchToolQueryCall).mockResolvedValue({ results: null }); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("No results found")).toBeInTheDocument(); + }); + }); + + it("should handle search errors and show notification", async () => { + const error = new Error("Search failed"); + vi.mocked(networking.searchToolQueryCall).mockRejectedValue(error); + const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { }); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(NotificationsManager.fromBackend).toHaveBeenCalledWith("Failed to query search tool"); + }); + consoleSpy.mockRestore(); + }); + + it("should maintain search history", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "first query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("first query")).toBeInTheDocument(); + }); + await user.clear(input); + await user.type(input, "second query"); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("second query")).toBeInTheDocument(); + }); + expect(screen.getByText("Previous Searches")).toBeInTheDocument(); + expect(screen.getByText("first query")).toBeInTheDocument(); + }); + + it("should allow clicking previous search to set query", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "first query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("first query")).toBeInTheDocument(); + }); + await user.clear(input); + await user.type(input, "second query"); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("second query")).toBeInTheDocument(); + }); + const historyItems = screen.getAllByText("first query"); + const historyItem = historyItems.find((item) => item.closest('[class*="cursor-pointer"]')); + if (historyItem) { + await user.click(historyItem); + expect(input).toHaveValue("first query"); + } + }); + + it("should clear history when Clear All is clicked", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "first query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("first query")).toBeInTheDocument(); + }); + await user.clear(input); + await user.type(input, "second query"); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("Previous Searches")).toBeInTheDocument(); + }); + const clearButton = screen.getByRole("button", { name: /clear all/i }); + await user.click(clearButton); + expect(NotificationsManager.success).toHaveBeenCalledWith("Search history cleared"); + expect(screen.queryByText("Previous Searches")).not.toBeInTheDocument(); + }); + + it("should limit history display to 5 previous searches", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + for (let i = 1; i <= 7; i++) { + await user.clear(input); + await user.type(input, `query ${i}`); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText(`query ${i}`)).toBeInTheDocument(); + }); + } + const historySection = screen.queryByText("Previous Searches"); + if (historySection) { + const historyItems = historySection.parentElement?.querySelectorAll('[class*="cursor-pointer"]'); + expect(historyItems?.length).toBeLessThanOrEqual(5); + } + }); + + it("should preserve query text after search", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + expect(screen.getByText("test query")).toBeInTheDocument(); + }); + expect(input).toHaveValue("test query"); + }); + + it("should disable input and button while loading", async () => { + vi.mocked(networking.searchToolQueryCall).mockImplementation( + () => new Promise((resolve) => setTimeout(() => resolve(mockSearchResults), 100)), + ); + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + expect(input).toBeDisabled(); + expect(searchButton).toBeDisabled(); + }); + + it("should display result links that open in new tab", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText("Enter your search query..."); + await user.type(input, "test query"); + const searchButton = screen.getByRole("button", { name: /search/i }); + await user.click(searchButton); + await waitFor(() => { + const link = screen.getByRole("link", { name: "Test Result 1" }); + expect(link).toHaveAttribute("href", "https://example.com/result1"); + expect(link).toHaveAttribute("target", "_blank"); + expect(link).toHaveAttribute("rel", "noopener noreferrer"); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/components/common_components/chartUtils.test.tsx b/ui/litellm-dashboard/src/components/common_components/chartUtils.test.tsx new file mode 100644 index 00000000000..b924021863a --- /dev/null +++ b/ui/litellm-dashboard/src/components/common_components/chartUtils.test.tsx @@ -0,0 +1,382 @@ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { CustomLegend, CustomTooltip } from "./chartUtils"; +import type { CustomTooltipProps } from "@tremor/react"; +import { SpendMetrics } from "../UsagePage/types"; + +describe("CustomTooltip", () => { + const mockPayload = [ + { + dataKey: "metrics.total_tokens", + value: 1000, + color: "blue", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + + it("should render", () => { + const props: CustomTooltipProps = { + active: true, + payload: mockPayload, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("2024-01-15")).toBeInTheDocument(); + }); + + it("should return null when not active", () => { + const props: CustomTooltipProps = { + active: false, + payload: mockPayload, + label: "2024-01-15", + }; + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it("should return null when payload is empty", () => { + const props: CustomTooltipProps = { + active: true, + payload: [], + label: "2024-01-15", + }; + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it("should display formatted category names", () => { + const props: CustomTooltipProps = { + active: true, + payload: mockPayload, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("Total Tokens")).toBeInTheDocument(); + }); + + it("should format category names by removing metrics prefix and replacing underscores", () => { + const payloadWithUnderscores = [ + { + dataKey: "metrics.prompt_tokens", + value: 600, + color: "green", + payload: { + date: "2024-01-15", + metrics: { + prompt_tokens: 600, + total_tokens: 1000, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: payloadWithUnderscores, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("Prompt Tokens")).toBeInTheDocument(); + }); + + it("should format spend values with dollar sign and two decimal places", () => { + const spendPayload = [ + { + dataKey: "metrics.spend", + value: 1234.567, + color: "red", + payload: { + date: "2024-01-15", + metrics: { + spend: 1234.567, + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: spendPayload, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("$1,234.57")).toBeInTheDocument(); + }); + + it("should format non-spend numeric values with locale string", () => { + const props: CustomTooltipProps = { + active: true, + payload: mockPayload, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("1,000")).toBeInTheDocument(); + }); + + it("should display N/A when value is undefined", () => { + const payloadWithUndefined = [ + { + dataKey: "metrics.nonexistent", + value: undefined, + color: "blue", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: payloadWithUndefined, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("N/A")).toBeInTheDocument(); + }); + + it("should handle multiple payload items", () => { + const multiplePayload = [ + { + dataKey: "metrics.total_tokens", + value: 1000, + color: "blue", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + { + dataKey: "metrics.spend", + value: 0.05, + color: "green", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: multiplePayload, + label: "2024-01-15", + }; + render(); + expect(screen.getByText("Total Tokens")).toBeInTheDocument(); + expect(screen.getByText("Spend")).toBeInTheDocument(); + }); + + it("should convert color names to hex values", () => { + const props: CustomTooltipProps = { + active: true, + payload: mockPayload, + label: "2024-01-15", + }; + const { container } = render(); + const colorIndicator = container.querySelector('span[style*="background-color"]'); + expect(colorIndicator).toHaveStyle({ backgroundColor: "#3b82f6" }); + }); + + it("should use hex color directly when color is not a known color name", () => { + const payloadWithHexColor = [ + { + dataKey: "metrics.total_tokens", + value: 1000, + color: "#ff0000", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: payloadWithHexColor, + label: "2024-01-15", + }; + const { container } = render(); + const colorIndicator = container.querySelector('span[style*="background-color"]'); + expect(colorIndicator).toHaveStyle({ backgroundColor: "#ff0000" }); + }); + + it("should skip items without dataKey", () => { + const payloadWithoutDataKey = [ + { + dataKey: undefined, + value: 1000, + color: "blue", + payload: { + date: "2024-01-15", + metrics: { + total_tokens: 1000, + prompt_tokens: 600, + completion_tokens: 400, + spend: 0.05, + api_requests: 10, + successful_requests: 9, + failed_requests: 1, + cache_read_input_tokens: 0, + cache_creation_input_tokens: 0, + } as SpendMetrics, + }, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: payloadWithoutDataKey as any, + label: "2024-01-15", + }; + render(); + expect(screen.queryByText("Total Tokens")).not.toBeInTheDocument(); + }); + + it("should skip items without payload", () => { + const payloadWithoutPayload = [ + { + dataKey: "metrics.total_tokens", + value: 1000, + color: "blue", + payload: undefined, + }, + ]; + const props: CustomTooltipProps = { + active: true, + payload: payloadWithoutPayload as any, + label: "2024-01-15", + }; + render(); + expect(screen.queryByText("Total Tokens")).not.toBeInTheDocument(); + }); +}); + +describe("CustomLegend", () => { + it("should render", () => { + render(); + expect(screen.getByText("Total Tokens")).toBeInTheDocument(); + }); + + it("should display multiple categories", () => { + render( + , + ); + expect(screen.getByText("Total Tokens")).toBeInTheDocument(); + expect(screen.getByText("Spend")).toBeInTheDocument(); + expect(screen.getByText("Prompt Tokens")).toBeInTheDocument(); + }); + + it("should format category names by removing metrics prefix and replacing underscores", () => { + render(); + expect(screen.getByText("Api Requests")).toBeInTheDocument(); + }); + + it("should capitalize first letter of each word", () => { + render(); + expect(screen.getByText("Successful Requests")).toBeInTheDocument(); + }); + + it("should convert color names to hex values", () => { + const { container } = render(); + const colorIndicator = container.querySelector('span[style*="background-color"]'); + expect(colorIndicator).toHaveStyle({ backgroundColor: "#06b6d4" }); + }); + + it("should use hex color directly when color is not a known color name", () => { + const { container } = render(); + const colorIndicator = container.querySelector('span[style*="background-color"]'); + expect(colorIndicator).toHaveStyle({ backgroundColor: "#ff00ff" }); + }); + + it("should handle all supported color names", () => { + const colors = ["blue", "cyan", "indigo", "green", "red", "purple", "emerald"]; + const categories = colors.map((_, idx) => `metrics.category_${idx}`); + render(); + expect(screen.getByText("Category 0")).toBeInTheDocument(); + }); + + it("should match categories and colors by index", () => { + render( + , + ); + const { container } = render( + , + ); + const colorIndicators = container.querySelectorAll('span[style*="background-color"]'); + expect(colorIndicators[0]).toHaveStyle({ backgroundColor: "#3b82f6" }); + expect(colorIndicators[1]).toHaveStyle({ backgroundColor: "#22c55e" }); + expect(colorIndicators[2]).toHaveStyle({ backgroundColor: "#ef4444" }); + }); +}); From 5733f6213b5ef8509646d1f2a24e9b38d72c04fa Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Fri, 6 Feb 2026 11:36:33 -0800 Subject: [PATCH 064/300] Add INFO-level session reuse logging per request (#20597) - Log when shared aiohttp session is attached to each request - Log when no shared session is available - Visible at INFO level (production-safe) --- litellm/proxy/route_llm_request.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/litellm/proxy/route_llm_request.py b/litellm/proxy/route_llm_request.py index 92fb88f7147..6baa2047d73 100644 --- a/litellm/proxy/route_llm_request.py +++ b/litellm/proxy/route_llm_request.py @@ -97,10 +97,18 @@ def add_shared_session_to_data(data: dict) -> None: data: Dictionary to add the shared session to """ try: + from litellm._logging import verbose_proxy_logger from litellm.proxy.proxy_server import shared_aiohttp_session if shared_aiohttp_session is not None and not shared_aiohttp_session.closed: data["shared_session"] = shared_aiohttp_session + verbose_proxy_logger.info( + f"SESSION REUSE: Attached shared aiohttp session to request (ID: {id(shared_aiohttp_session)})" + ) + else: + verbose_proxy_logger.info( + "SESSION REUSE: No shared session available for this request" + ) except Exception: # Silently continue without session reuse if import fails or session unavailable pass From 8df6cfe9d86e147d0ac22ce014797c39dddfe7b6 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 6 Feb 2026 12:27:03 -0800 Subject: [PATCH 065/300] fix model page col resize --- .../model_dashboard/all_models_table.tsx | 11 +- .../src/components/model_dashboard/table.tsx | 11 +- .../molecules/models/columns.test.tsx | 808 ++++++++++++++++++ .../components/molecules/models/columns.tsx | 134 ++- 4 files changed, 922 insertions(+), 42 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/molecules/models/columns.test.tsx diff --git a/ui/litellm-dashboard/src/components/model_dashboard/all_models_table.tsx b/ui/litellm-dashboard/src/components/model_dashboard/all_models_table.tsx index 1ae3335a823..964bb5658fe 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard/all_models_table.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard/all_models_table.tsx @@ -95,7 +95,14 @@ export function AllModelsDataTable({

- +
{tableInstance.getHeaderGroups().map((headerGroup) => ( @@ -171,7 +178,7 @@ export function AllModelsDataTable({ {row.getVisibleCells().map((cell) => ( ({
-
+
{tableInstance.getHeaderGroups().map((headerGroup) => ( @@ -161,7 +168,7 @@ export function ModelDataTable({ {row.getVisibleCells().map((cell) => ( { + const React = await import("react"); + const actual = await importOriginal(); + return { + ...actual, + Icon: React.forwardRef(({ icon: IconComponent, onClick, className, ...props }, ref) => { + const ariaLabel = className?.includes("cursor-not-allowed") + ? "Config model cannot be deleted on the dashboard. Please delete it from the config file." + : "Delete model"; + return React.createElement( + "button", + { ...props, onClick, className, ref, "aria-label": ariaLabel }, + IconComponent && React.createElement(IconComponent, { className: "w-4 h-4" }), + ); + }), + }; +}); + +const createMockModel = (overrides: Partial = {}): ModelData => ({ + model_info: { + id: "test-model-id", + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-02T00:00:00Z", + created_by: "test-user", + team_id: "test-team-id", + db_model: true, + access_groups: ["group1"], + }, + model_name: "test-model", + provider: "openai", + litellm_model_name: "gpt-4", + input_cost: 0.01, + output_cost: 0.03, + max_tokens: 4096, + max_input_tokens: 8192, + litellm_params: { + model: "gpt-4", + litellm_credential_name: "test-credential", + }, + cleanedLitellmParams: {}, + ...overrides, +}); + +const TestTable = ({ + data, + columns: cols, +}: { + data: ModelData[]; + columns: ReturnType; +}) => { + const table = useReactTable({ + data, + columns: cols, + getCoreRowModel: getCoreRowModel(), + }); + + return ( +
+ + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender(header.column.columnDef.header, header.getContext())} + + ))} + + ))} + + + {table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ))} + +
+ ); +}; + +describe("columns", () => { + beforeEach(() => { + vi.mocked(providerInfoHelpers.getProviderLogoAndName).mockImplementation((provider: string) => { + const providerMap: Record = { + openai: { displayName: "OpenAI", logo: "/openai-logo.png" }, + anthropic: { displayName: "Anthropic", logo: "/anthropic-logo.png" }, + }; + return providerMap[provider] || { displayName: provider || "Unknown provider", logo: "" }; + }); + }); + + const defaultProps = { + userRole: "Admin", + userID: "test-user", + premiumUser: false, + setSelectedModelId: vi.fn(), + setSelectedTeamId: vi.fn(), + getDisplayModelName: vi.fn((model: ModelData) => model.model_name || "-"), + handleEditClick: vi.fn(), + handleRefreshClick: vi.fn(), + expandedRows: new Set(), + setExpandedRows: vi.fn(), + }; + + it("should render columns with table structure", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel(); + render(); + + expect(screen.getByText("Model ID")).toBeInTheDocument(); + expect(screen.getByText("Model Information")).toBeInTheDocument(); + expect(screen.getByText("Credentials")).toBeInTheDocument(); + expect(screen.getByText("Created By")).toBeInTheDocument(); + expect(screen.getByText("Updated At")).toBeInTheDocument(); + expect(screen.getByText("Costs")).toBeInTheDocument(); + expect(screen.getByText("Team ID")).toBeInTheDocument(); + expect(screen.getByText("Model Access Group")).toBeInTheDocument(); + expect(screen.getByText("Status")).toBeInTheDocument(); + expect(screen.getByText("Actions")).toBeInTheDocument(); + }); + + it("should display model information with provider logo", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_name: "GPT-4", + provider: "openai", + litellm_model_name: "gpt-4", + }); + render(); + + expect(screen.getByText("GPT-4")).toBeInTheDocument(); + expect(screen.getByText("gpt-4")).toBeInTheDocument(); + }); + + it("should display credential name when available", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + litellm_params: { + model: "gpt-4", + litellm_credential_name: "my-credential", + }, + }); + render(); + + expect(screen.getByText("my-credential")).toBeInTheDocument(); + }); + + it("should display 'No credentials' when credential name is missing", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + litellm_params: { + model: "gpt-4", + }, + }); + render(); + + expect(screen.getByText("No credentials")).toBeInTheDocument(); + }); + + it("should display created by information for DB models", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: true, + created_by: "admin-user", + created_at: "2024-01-15T10:30:00Z", + }, + }); + render(); + + expect(screen.getByText("admin-user")).toBeInTheDocument(); + }); + + it("should display 'Defined in config' for config models", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: false, + }, + }); + render(); + + expect(screen.getByText("Defined in config")).toBeInTheDocument(); + }); + + it("should display costs when available", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + input_cost: 0.01, + output_cost: 0.03, + }); + render(); + + expect(screen.getByText("In: $0.01")).toBeInTheDocument(); + expect(screen.getByText("Out: $0.03")).toBeInTheDocument(); + }); + + it("should display '-' when costs are missing", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + input_cost: undefined as any, + output_cost: undefined as any, + }); + render(); + + const costCells = screen.getAllByText("-"); + expect(costCells.length).toBeGreaterThan(0); + }); + + it("should display '-' when team ID is missing", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + team_id: "", + }, + }); + render(); + + const teamIdCells = screen.getAllByText("-"); + expect(teamIdCells.length).toBeGreaterThan(0); + }); + + it("should display access groups", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + access_groups: ["group1", "group2"], + }, + }); + render(); + + expect(screen.getByText("group1")).toBeInTheDocument(); + expect(screen.getByText("+1")).toBeInTheDocument(); + }); + + it("should expand access groups when expand button is clicked", async () => { + const user = userEvent.setup(); + const setExpandedRows = vi.fn(); + const expandedRows = new Set(); + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + expandedRows, + setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + id: "model-with-groups", + access_groups: ["group1", "group2", "group3"], + }, + }); + render(); + + const expandButton = screen.getByText("+2"); + expect(expandButton).toBeInTheDocument(); + + await user.click(expandButton); + expect(setExpandedRows).toHaveBeenCalled(); + }); + + it("should display '-' when access groups are empty", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + access_groups: null, + }, + }); + render(); + + const emptyCells = screen.getAllByText("-"); + expect(emptyCells.length).toBeGreaterThan(0); + }); + + it("should display 'DB Model' status for DB models", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: true, + }, + }); + render(); + + expect(screen.getByText("DB Model")).toBeInTheDocument(); + }); + + it("should display 'Config Model' status for config models", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: false, + }, + }); + render(); + + expect(screen.getByText("Config Model")).toBeInTheDocument(); + }); + + it("should allow Admin to delete DB models", async () => { + const user = userEvent.setup(); + const setSelectedModelId = vi.fn(); + const cols = columns( + "Admin", + "admin-user", + defaultProps.premiumUser, + setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: true, + id: "deletable-model", + }, + }); + render(); + + const deleteButton = screen.getByRole("button", { name: "Delete model" }); + expect(deleteButton).toBeInTheDocument(); + + await user.click(deleteButton); + expect(setSelectedModelId).toHaveBeenCalledWith("deletable-model"); + }); + + it("should allow model creator to delete their own DB models", async () => { + const user = userEvent.setup(); + const setSelectedModelId = vi.fn(); + const cols = columns( + "User", + "model-creator", + defaultProps.premiumUser, + setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: true, + created_by: "model-creator", + id: "user-model", + }, + }); + render(); + + const deleteButton = screen.getByRole("button", { name: "Delete model" }); + expect(deleteButton).toBeInTheDocument(); + + await user.click(deleteButton); + expect(setSelectedModelId).toHaveBeenCalledWith("user-model"); + }); + + + it("should disable delete for config models", () => { + const cols = columns( + "Admin", + "admin-user", + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: false, + }, + }); + render(); + + const deleteButton = screen.getByRole("button", { name: /config model cannot be deleted/i }); + expect(deleteButton).toBeInTheDocument(); + expect(deleteButton).toHaveClass("cursor-not-allowed"); + }); + + it("should display collapsed access groups with expand button", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + new Set(), + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + access_groups: ["group1", "group2", "group3"], + }, + }); + render(); + + expect(screen.getByText("group1")).toBeInTheDocument(); + expect(screen.getByText("+2")).toBeInTheDocument(); + expect(screen.queryByText("group2")).not.toBeInTheDocument(); + expect(screen.queryByText("group3")).not.toBeInTheDocument(); + }); + + it("should display expanded access groups when expanded", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + new Set(["test-model-id"]), + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + id: "test-model-id", + access_groups: ["group1", "group2", "group3"], + }, + }); + render(); + + expect(screen.getByText("group1")).toBeInTheDocument(); + expect(screen.getByText("group2")).toBeInTheDocument(); + expect(screen.getByText("group3")).toBeInTheDocument(); + expect(screen.getByText("−")).toBeInTheDocument(); + }); + + it("should display single access group without expand button", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + access_groups: ["group1"], + }, + }); + render(); + + expect(screen.getByText("group1")).toBeInTheDocument(); + expect(screen.queryByText(/\+/)).not.toBeInTheDocument(); + }); + + + it("should handle missing display name gracefully", () => { + const getDisplayModelName = vi.fn(() => ""); + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel(); + render(); + + expect(screen.getByText("-")).toBeInTheDocument(); + }); + + it("should handle missing created_at date", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + created_at: "", + }, + }); + render(); + + expect(screen.getByText("Unknown date")).toBeInTheDocument(); + }); + + it("should handle missing updated_at date", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + updated_at: "", + }, + }); + render(); + + const updatedAtCells = screen.getAllByText("-"); + expect(updatedAtCells.length).toBeGreaterThan(0); + }); + + it("should handle missing created_by for DB models", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + model_info: { + ...createMockModel().model_info, + db_model: true, + created_by: "", + }, + }); + render(); + + expect(screen.getByText("Unknown")).toBeInTheDocument(); + }); + + it("should display only input cost when output cost is missing", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + input_cost: 0.01, + output_cost: undefined as any, + }); + render(); + + expect(screen.getByText("In: $0.01")).toBeInTheDocument(); + expect(screen.queryByText(/Out:/)).not.toBeInTheDocument(); + }); + + it("should display only output cost when input cost is missing", () => { + const cols = columns( + defaultProps.userRole, + defaultProps.userID, + defaultProps.premiumUser, + defaultProps.setSelectedModelId, + defaultProps.setSelectedTeamId, + defaultProps.getDisplayModelName, + defaultProps.handleEditClick, + defaultProps.handleRefreshClick, + defaultProps.expandedRows, + defaultProps.setExpandedRows, + ); + + const model = createMockModel({ + input_cost: undefined as any, + output_cost: 0.03, + }); + render(); + + expect(screen.getByText("Out: $0.03")).toBeInTheDocument(); + expect(screen.queryByText(/In:/)).not.toBeInTheDocument(); + }); +}); diff --git a/ui/litellm-dashboard/src/components/molecules/models/columns.tsx b/ui/litellm-dashboard/src/components/molecules/models/columns.tsx index 1fc08e502ac..958b6ac86a7 100644 --- a/ui/litellm-dashboard/src/components/molecules/models/columns.tsx +++ b/ui/litellm-dashboard/src/components/molecules/models/columns.tsx @@ -1,10 +1,12 @@ import { KeyIcon, TrashIcon } from "@heroicons/react/outline"; import { ColumnDef } from "@tanstack/react-table"; import { Badge, Button, Icon } from "@tremor/react"; -import { Tooltip } from "antd"; +import { Popover, Tooltip, Typography, Space, Flex } from "antd"; import { ModelData } from "../../model_dashboard/types"; import { ProviderLogo } from "./ProviderLogo"; +const { Text } = Typography; + export const columns = ( userRole: string, userID: string, @@ -21,16 +23,20 @@ export const columns = ( header: () => Model ID, accessorKey: "model_info.id", enableSorting: false, + size: 130, + minSize: 80, cell: ({ row }) => { const model = row.original; return ( -
setSelectedModelId(model.model_info.id)} > {model.model_info.id} -
+
); }, @@ -38,28 +44,67 @@ export const columns = ( { header: () => Model Information, accessorKey: "model_name", - size: 250, // Fixed column width + size: 250, + minSize: 120, cell: ({ row }) => { const model = row.original; const displayName = getDisplayModelName(row.original) || "-"; - const tooltipContent = ( -
-
- Provider: {model.provider || "-"} -
-
- Public Model Name: {displayName} -
-
- LiteLLM Model Name: {model.litellm_model_name || "-"} -
-
+ const popoverContent = ( + + + + + {model.provider || "Unknown provider"} + + + + + + + Public Model Name + + + {displayName} + + + + + + LiteLLM Model Name + + + {model.litellm_model_name || "-"} + + + + ); return ( - -
- {/* Provider Icon */} + +
{model.provider ? ( @@ -68,17 +113,16 @@ export const columns = ( )}
- {/* Model Names Container */}
- {/* Public Model Name */} -
{displayName}
- {/* LiteLLM Model Name */} -
+ + {displayName} + + {model.litellm_model_name || "-"} -
+
- +
); }, }, @@ -86,14 +130,15 @@ export const columns = ( header: () => Credentials, accessorKey: "litellm_credential_name", enableSorting: false, - size: 180, // Fixed column width + size: 180, + minSize: 100, cell: ({ row }) => { const model = row.original; const credentialName = model.litellm_params?.litellm_credential_name; return credentialName ? ( -
+
{credentialName} @@ -101,7 +146,7 @@ export const columns = (
) : ( -
+
No credentials
@@ -112,7 +157,8 @@ export const columns = ( header: () => Created By, accessorKey: "model_info.created_by", sortingFn: "datetime", - size: 160, // Fixed column width + size: 160, + minSize: 100, cell: ({ row }) => { const model = row.original; const isConfigModel = !model.model_info?.db_model; @@ -120,7 +166,7 @@ export const columns = ( const createdAt = model.model_info.created_at ? new Date(model.model_info.created_at).toLocaleDateString() : null; return ( -
+
{/* Created By - Primary */}
Updated At, accessorKey: "model_info.updated_at", sortingFn: "datetime", + size: 120, + minSize: 80, cell: ({ row }) => { const model = row.original; return ( @@ -155,7 +203,8 @@ export const columns = ( { header: () => Costs, accessorKey: "input_cost", - size: 120, // Fixed column width + size: 120, + minSize: 80, cell: ({ row }) => { const model = row.original; const inputCost = model.input_cost; @@ -164,7 +213,7 @@ export const columns = ( // If both costs are missing or undefined, show "-" if (!inputCost && !outputCost) { return ( -
+
-
); @@ -172,7 +221,7 @@ export const columns = ( return ( -
+
{/* Input Cost - Primary */} {inputCost &&
In: ${inputCost}
} {/* Output Cost - Secondary */} @@ -186,15 +235,17 @@ export const columns = ( header: () => Team ID, accessorKey: "model_info.team_id", enableSorting: false, + size: 130, + minSize: 80, cell: ({ row }) => { const model = row.original; return model.model_info.team_id ? ( -
+