From e04e4e0670a6a7e3cba8122b9b1a9977a71f441a Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 14 Feb 2025 10:36:21 -0700 Subject: [PATCH 01/20] changes prior to deploying and testing on H100 TEE machine repaired nilql pip import updating to nilrag that pins to nilql@alpha10 added support for git branches in pyproject requirements removed gpu affinity for api service --- docker-compose.yml | 7 - docker/api.Dockerfile | 2 +- nilai-api/pyproject.toml | 11 +- nilai-api/src/nilai_api/routers/private.py | 44 +++++ nilai-api/src/nilai_api/vault.py | 153 ++++++++++++++++++ .../src/nilai_common/api_model.py | 1 + 6 files changed, 208 insertions(+), 10 deletions(-) create mode 100644 nilai-api/src/nilai_api/vault.py diff --git a/docker-compose.yml b/docker-compose.yml index 3aff51c8..b76879e0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -113,13 +113,6 @@ services: condition: service_healthy postgres: condition: service_healthy - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: all - capabilities: [gpu] restart: unless-stopped networks: - frontend_net diff --git a/docker/api.Dockerfile b/docker/api.Dockerfile index ea3f55b4..579783ea 100644 --- a/docker/api.Dockerfile +++ b/docker/api.Dockerfile @@ -14,7 +14,7 @@ COPY --from=sev /app/sev/libsevguest.h /app/nilai-api/src/nilai_api/sev/libsevgu WORKDIR /app/nilai-api/ RUN apt-get update && \ -apt-get install build-essential curl -y && \ +apt-get install build-essential curl git -y && \ apt-get clean && \ apt-get autoremove && \ rm -rf /var/lib/apt/lists/* && \ diff --git a/nilai-api/pyproject.toml b/nilai-api/pyproject.toml index 4c0c65db..1dd25f14 100644 --- a/nilai-api/pyproject.toml +++ b/nilai-api/pyproject.toml @@ -21,8 +21,7 @@ dependencies = [ "sqlalchemy>=2.0.36", "uvicorn>=0.32.1", "httpx>=0.27.2", - "nilrag>=0.1.2", - "nilql>=0.0.0a3", + "nilrag @ git+https://github.com/wwwehr/nilrag.git@patch-1", "openai>=1.59.9", "pg8000>=1.31.2", "prometheus_fastapi_instrumentator>=7.0.2", @@ -32,6 +31,11 @@ dependencies = [ "authlib>=1.4.1", "verifier", "web3>=7.8.0", + "pyjwt>=2.10.1", + "jsonschema>=4.23.0", + "requests>=2.32.3", + "nilql>=0.0.0a10", + "ecdsa>=0.19.0", ] @@ -42,3 +46,6 @@ build-backend = "hatchling.build" [tool.uv.sources] nilai-common = { workspace = true } verifier = { workspace = true } + +[tool.hatch.metadata] +allow-direct-references = true diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index 1bf04739..a6341519 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -5,6 +5,7 @@ from base64 import b64encode from typing import AsyncGenerator, Union, List, Tuple import numpy as np +import uuid import nilql import nilrag @@ -18,6 +19,7 @@ from nilai_api.rate_limiting import RateLimit from nilai_api.state import state from openai import OpenAI, AsyncOpenAI +from nilai_api.vault import SecretVaultHelper # Internal libraries from nilai_common import ( @@ -201,6 +203,21 @@ async def chat_completion( f"Chat completion request for model {model_name} from user {user.userid} on url: {model_url}" ) + if req.secret_vault: + """ + Endpoint activated with SecretVault support + 1. Test connectivity and pull schema definition + 2. If instruction is to store: + 2a. ... if schema includes encrypted values, inference result will mutate to encrypt fields + 2b. ... then inference result will be posted to db + 4. If instruction is to inject: + 4a. ... query records + 4b. ... if schema includes encrypted values, mutate payload to decrypt fields + 4c. ... append payload to LLM query + """ + # TODO: implement record injection to query + pass + if req.nilrag: """ Endpoint to process a client query. @@ -393,6 +410,30 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: tools=req.tools, # type: ignore ) # type: ignore + if req.secret_vault: + try: + vault = SecretVaultHelper( + org_did=req.secret_vault.get("org_did"), + secret_key=req.secret_vault.get("secret_key"), + schema_uuid=req.secret_vault.get("schema"), + ) + remux_res = client.chat.completions.create( + model=model_name, + messages=[ + {"role": "system", "content": f"Please provide responses in the following JSON schema: {vault.schema_definition}"}, + {"role": "user", "content": response.content} + ], + response_format={ "type": "json_object" } + ) + vault_res = vault.post( + [remux_res], + ) + except Exception as e: + logger.error("An error occurred within nilrag: %s", str(e)) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) + ) + model_response = SignedChatCompletion( **response.model_dump(), signature="", @@ -421,4 +462,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: signature = sign_message(state.private_key, response_json) model_response.signature = b64encode(signature).decode() + if req.secret_vault: + # TODO: redact the model output + model_response["secret_vault"] = vault_res return model_response diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py new file mode 100644 index 00000000..ec0f4011 --- /dev/null +++ b/nilai-api/src/nilai_api/vault.py @@ -0,0 +1,153 @@ +from pdb import set_trace as bp +from ecdsa import SigningKey, SECP256k1 +import jwt +import nilql +import os +import requests +from jsonschema import validators, Draft7Validator +import uuid +import time + + +class SecretVaultHelper: + def __init__(self, org_did: str, secret_key: str, schema_uuid: str): + """Initialize config with JWTs signed with ES256K for multiple node_ids; Add cluster key.""" + self.org_did = org_did + response = requests.post( + "https://sv-sda-registration.replit.app/api/config", + headers={ + "Content-Type": "application/json", + }, + json={"org_did": org_did}, + ) + self.nodes = response.json()["nodes"] + + # Convert the secret key from hex to bytes + private_key = bytes.fromhex(secret_key) + signer = SigningKey.from_string(private_key, curve=SECP256k1) + + for node in self.nodes: + # Create payload for each node_id + payload = { + "iss": org_did, + "aud": node["did"], + "exp": int(time.time()) + 3600, + } + + # Create and sign the JWT + node["bearer"] = jwt.encode(payload, signer.to_pem(), algorithm="ES256K") + + self.key = nilql.ClusterKey.generate( + {"nodes": [{}] * len(self.nodes)}, {"store": True} + ) + + self.schema_list = self.fetch_schemas() + self.schema_definition = self.find_schema(schema_uuid) + self.schema_uuid = schema_uuid + + def fetch_schemas(self) -> list: + """Get all my schemas from the first server.""" + headers = { + "Authorization": f'Bearer {self.nodes[0]["bearer"]}', + "Content-Type": "application/json", + } + + response = requests.get( + f"{self.nodes[0]['url']}/api/v1/schemas", headers=headers + ) + + assert ( + response.status_code == 200 and response.json().get("errors", []) == [] + ), response.content.decode("utf8") + + schema_list = response.json()["data"] + assert len(schema_list) > 0, "failed to fetch schemas from nildb" + return schema_list + + def find_schema(self, schema_uuid: str) -> dict: + """Filter a list of schemas by single desired schema id.""" + my_schema = None + for this_schema in self.schema_list: + if this_schema["_id"] == schema_uuid: + my_schema = this_schema["schema"] + break + assert my_schema is not None, "failed to lookup schema" + return my_schema + + def _mutate_secret_attributes(self, entry: dict) -> None: + """Apply encrypotion or secret sharing to all fields in schema that are indicated w/ $share keyname.""" + keys = list(entry.keys()) + for key in keys: + value = entry[key] + if key == "_id": + entry[key] = str(uuid.uuid4()) + elif key == "$share": + del entry["$share"] + entry["$allot"] = nilql.encrypt(self.key, value) + elif isinstance(value, dict): + self._mutate_secret_attributes(value) + + def _validator_builder(self): + """Build a validator to validate the candidate document against loaded schema.""" + return validators.extend(Draft7Validator) + + def post(self, data_to_store: list) -> list: + """Create/upload records in the specified node and schema.""" + print(f"fn:data_upload [{self.schema_uuid}] [{data_to_store}]") + try: + + builder = self._validator_builder() + validator = builder(self.schema_definition) + + for entry in data_to_store: + self._mutate_secret_attributes(entry) + + record_uuids = [x["_id"] for x in data_to_store] + payloads = nilql.allot(data_to_store) + + for idx, shard in enumerate(payloads): + + validator.validate(shard) + + node = self.nodes[idx] + headers = { + "Authorization": f'Bearer {node["bearer"]}', + "Content-Type": "application/json", + } + + body = {"schema": self.schema_uuid, "data": shard} + + response = requests.post( + f"{node['url']}/api/v1/data/create", + headers=headers, + json=body, + ) + + assert ( + response.status_code == 200 + and response.json().get("errors", []) == [] + ), f"upload (host-{idx}) failed: " + response.content.decode("utf8") + print(f"fn:data_upload COMPLETED: {record_uuids}") + return record_uuids + except Exception as e: + print(f"Error creating records in node: {e!r}") + return [] + + +if __name__ == "__main__": + vault = SecretVaultHelper( + org_did=os.environ["NILLION_ORG_ID"], + secret_key=os.environ["NILLION_SECRET_KEY"], + schema_uuid="87cf9ea0-c26c-4776-bf81-3553b8aa3c30", + ) + vault.post( + [ + { + "_id": str(uuid.uuid4()), + "patient_name": {"$share": "Nick Test"}, + "doctor_name": {"$share": "Dr. Niko Nik"}, + "medical_diagnosis": {"$share": "Dementia or MS"}, + "reasoning_summary": {"$share": "This is just a test."}, + } + ], + ) diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index 57748aab..dd8b59f9 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -38,6 +38,7 @@ class ChatRequest(BaseModel): stream: Optional[bool] = False tools: Optional[Iterable[ChatCompletionToolParam]] = None nilrag: Optional[dict] = {} + secret_vault: Optional[dict] = {} class SignedChatCompletion(ChatCompletion): From fc009f199ea1e25812bd4a21a66cf681d099b441 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 21 Feb 2025 18:37:31 +0000 Subject: [PATCH 02/20] added tool support; added model "role" concept for filtering model metadata based on arbitary values; TODO: add retry mechanism to the llm transform so that it retries until getting the schema format right --- caddy/Caddyfile | 2 +- docker-compose.dev.yml | 3 + docker/compose/docker-compose.npw.llama32.yml | 55 ++++++++++++++++++ docker/compose/docker-compose.npw.watt.yml | 55 ++++++++++++++++++ nilai-api/src/nilai_api/.vault.py.swp | Bin 0 -> 20480 bytes nilai-api/src/nilai_api/config/mainnet.py | 2 + .../src/nilai_api/routers/.private.py.swp | Bin 0 -> 32768 bytes nilai-api/src/nilai_api/routers/private.py | 42 ++++++++++--- nilai-api/src/nilai_api/vault.py | 15 +++-- nilai-models/src/nilai_models/daemon.py | 1 + .../src/nilai_common/api_model.py | 3 +- .../nilai-common/src/nilai_common/config.py | 1 + 12 files changed, 164 insertions(+), 15 deletions(-) create mode 100644 docker/compose/docker-compose.npw.llama32.yml create mode 100644 docker/compose/docker-compose.npw.watt.yml create mode 100644 nilai-api/src/nilai_api/.vault.py.swp create mode 100644 nilai-api/src/nilai_api/routers/.private.py.swp diff --git a/caddy/Caddyfile b/caddy/Caddyfile index 28108d27..4d195558 100644 --- a/caddy/Caddyfile +++ b/caddy/Caddyfile @@ -4,7 +4,7 @@ } } - https://nilai.sandbox.nilogy.xyz { + https://npw.nilai.sandbox.nilogy.xyz { import ssl_config reverse_proxy api:8443 } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index b8d2e3bb..b59c9133 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,6 +3,9 @@ services: privileged: true volumes: - /dev/sev-guest:/dev/sev-guest # for AMD SEV + - $PWD/packages:/app/packages:ro + - $PWD/nilai-models:/app/nilai-models:ro + - $PWD/nilai-api:/app/nilai-api # this will drop a lockfile networks: - proxy_net redis: diff --git a/docker/compose/docker-compose.npw.llama32.yml b/docker/compose/docker-compose.npw.llama32.yml new file mode 100644 index 00000000..d5e33e6e --- /dev/null +++ b/docker/compose/docker-compose.npw.llama32.yml @@ -0,0 +1,55 @@ +services: + llama_32_tool_gpu: + build: + context: . + dockerfile: docker/vllm.Dockerfile + deploy: + resources: + reservations: + devices: + - capabilities: + - gpu + driver: nvidia + device_ids: + - "1" + ipc: host + command: + - --model + - meta-llama/Llama-3.2-1B-Instruct + - --max-model-len + - "65536" + - --device + - cuda + - --gpu-memory-utilization + - "0.95" + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + - --chat-template + - /tmp/tool_chat_template.jinja + env_file: + - .env + environment: + SVC_HOST: "llama_32_tool_gpu" + SVC_PORT: "8000" + ETCD_HOST: "etcd" + ETCD_PORT: "2379" + TOOL_SUPPORT: true + MODEL_ROLE: "reasoning" + networks: + - backend_net + volumes: + - type: volume + source: hugging_face_models + target: /root/.cache/huggingface + volume: {} + - type: bind + source: /home/niko/tool_chat_template_llama3.2_json.jinja + target: /tmp/tool_chat_template.jinja + bind: + create_host_path: true +volumes: + hugging_face_models: + +networks: + backend_net: diff --git a/docker/compose/docker-compose.npw.watt.yml b/docker/compose/docker-compose.npw.watt.yml new file mode 100644 index 00000000..b501a1cb --- /dev/null +++ b/docker/compose/docker-compose.npw.watt.yml @@ -0,0 +1,55 @@ +services: + watt_tool_gpu: + build: + context: . + dockerfile: docker/vllm.Dockerfile + deploy: + resources: + reservations: + devices: + - capabilities: + - gpu + driver: nvidia + device_ids: + - "0" + ipc: host + command: + - --model + - watt-ai/watt-tool-8B + - --max-model-len + - "65536" + - --device + - cuda + - --gpu-memory-utilization + - "0.95" + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + - --chat-template + - /tmp/tool_chat_template.jinja + env_file: + - .env + environment: + SVC_HOST: "watt_tool_gpu" + SVC_PORT: "8000" + ETCD_HOST: "etcd" + ETCD_PORT: "2379" + TOOL_SUPPORT: true + MODEL_ROLE: "worker" + networks: + - backend_net + volumes: + - type: volume + source: hugging_face_models + target: /root/.cache/huggingface + volume: {} + - type: bind + source: /home/niko/tool_chat_template_llama3.1_json.jinja + target: /tmp/tool_chat_template.jinja + bind: + create_host_path: true +volumes: + hugging_face_models: + +networks: + backend_net: diff --git a/nilai-api/src/nilai_api/.vault.py.swp b/nilai-api/src/nilai_api/.vault.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..95fdbd1cc668bfa0ce782623a166a8b8e54980e1 GIT binary patch literal 20480 zcmeHOTa4UR8FpKG142t$gv#~AZIzjHW_FV_w=Ely%eGx|ZL$fJVX-{+@vIY%?fTf8 zoi3a5P(&&f3Did9si0OxDu_Oo3LYpAAQb@$7Xht!;8O8~`cMQs0D|v7_VHzQa(gN$ z9_bs8?Q{9h|NrMd|Noyey~*RV2iT6zMh%}^HSNF;U+#bSn%lJvci*b{?#X~2U+U8j zleQn&ypxEw#r-%ky^U?BV|83##HJs&#ex~xZS6EQIN`hAu37pv-L@IJ6C$$GJA>{P z&BTj4;qX#@*6(W$)Eu}14kWSD-o8fLylLYk)w)w($8KAD>dIZ$(;=0MGX zngcZlY7W#Ks5$We&Ve|*PJ0Z4xHcQehU|LH$n_oB{d9J1jl91uyWf#r`y=nO+xk*- zpyoi$ftmv~2Wk$~9H==^bD-ux&4HQ&H3w=AybT;MZB4uRotpM4K>PnH{{Q_gn)WjA zZQvQ;E5H|lQ@~zeJJ15|0d4@U2mbONO?wX5349dz_Zm%m3HUnT0rS9Cpat9ny#8)Y zdky#oun0^76TmINAKnF;fER!-0LOp_fcpUk{5Yfeaa=zG9048z)&YOKS<}7;d>1$i z%mcH)jlgei(zKrfKLNf4aG(op1GWNp13$kJGy%^8r+_xF7I-i4yBjp^9Pk)$1Yp3M z*K68ufpfrPz-i#)zkA0ZL*H1HJA13m=& z49S=u0IvYwSBV*=D=hoO(QryrH(t>1^9biJoS@<8jz49av1ufs7nnBdE(`8C9bql- z0Ujog@f9w(8{7ERAZjUW;oz7%uc zZtRUrC*F2kJ+Dx@J8?amnMExY2kM4PaxD-@4RU4&Rx-eW6=wELI;+BnKN!Xs>W!QV zqengPNRFjhB3F?uxoZrP7+n~GTNs96#&P8Kl9-DI8cKLUGS%Xq>o8ZO$7L*@76F@F zD@F&ZU3H}sHp8xdm+5&ytk1J)hQlqZ$A{6W<_y=?t8Gal(L_oSwU-m) z1d*%=J;QTR)T298A;oFPdNf{9?iQN2D-69MnkB9Tu^add&86~SG$_~alWu^G49e@J z`kaa$dSXH=A`TUY6d*{Ootj`NFNhZ39Po;EUs&F$%1bJzQjwCX9}Ik6(w$7z2SXzz zAZLLo1dn2tzkr%xmc_Dui|LN(dY}!%@PgoE5@xEK&N`B%`t&e?PipE;U5jR?F=SU{ zy?6DLiV?kl7%PQHmJmLqUzn0YMkKsaaWWQVyF;=o3YQ5X*5s5zj`zD>%p*)`s=@*% z>rSxVkYUdBJxpXS+$f*840>3$JPw4IjVv=jWr9g}rS+ldwpt`vQR+Jn z+_7PdZQjsvz-N2OXp@NZ_HYa@PJ}@PNnV>KC#99n->3a``aEvvJc?jy^%m>SH>q&9 zn2*`G8wEjm3z6vxZb0T(Kd7%pVF8L?M3bYZ%MUFTqB}X?U7tkW`uUX!dHQeTM9LBB ze}TgoM`Aj=YE+v(s!z$VM-nb#At^7YTG3>|>`UL1a;iNy47onVbQ6YwCN)gL1dUv8 zRm<;6;)Nh`AC)Cg!CAkX!xltrgmS$nAM5ig>x&jLYC+s`-YS&w0SXKF=vIT7VzSdU%bl{OKD$s4H5 zkzzU*vMX1Y6H!&H(AX@5P*f#3EbCI>;AVFj?#2ctClB@P2lSpk7xh}4Ac0@8T&f2B zX|70@LqP8}*+lk5eRXs3fFUPN#k4-sL&K1Q#lk^fSghDRZ1dL1 z$wGJ35Og!aDk+Bs8$eceOc_@QlnJ7~ffCjC*$^u_NNwi>PzA_Fa}zd-7zT5$DGKNX zJV?hVYMMD+_!H>MlJeG*Fbs00JMgB$k}d)^e0c=MrksN+_EtL?RVel8-Kw?Z_>x zd{J8G@&cD_(8z*JFYB2g3X!Z-WioP0jJ{ICqzqzVSY#^;aU6=NiHVdQZFz#a9q~R^ ztVo)$PQ+pG;tuSdw6a(^9JgPxdTP*;L77FB?z%=D&_^;c8zM?&zcl#{Uocv;WKZCc zKgwC!K0Ae}M6*MrGYuXTJxFI3BLy4asJ9zp`6eMi`^0^0mu)l4O9UK4XKlYMf_7ADKOD<)!#8AGPeA*DnKs}peOkiUUqt zY!k@kB1J5nwb9B^haJQ}59w=c)ev4Xnjcs9plh9EbD(={MVZW8o%^gh{)M;RmHu+} z4@b&|%lm@irKo*c-@eUqc5rjDZEf0WweQ`wZEL&dY~R@4yk*Pg-geX6Y;B$_x$uSm zI~^cT?k~Dg;CJhCiy(}&E6Z_~@=5eGb-mSA#SA5%7y>_t1nJq*MgzqNPzt^- zS}BF)e97Wr%x2_;QoQhLkyoXL)hFvVZAxx;2u;1CYn6bJy^=kL4jkS;GdHsrU6)%Z z)1Vqd2Eoy@9g@ZZ|s^uRS^}kX4mnBkP;;6j%ETW`8gp~ftM6rwX6oU zI%d^W5p~TZZ1Y~yU%ef6_|VZgDJb?iwoD@#CtG@so|aW&93kb%9vTwAGFyu`^l#^t zs_qjhs|_eUz0xEA)uE4m;Vh+OW}f{jCnwXYOr=(7M4Ec0u2dT@inK`=T3pIOt8#gG z+sS_Mh8%gbI&up1(EuWJVhiPyxQ|UYWG3=doEY6jyXchsSh}-j?_|qa8cU2yOg+ai z(ycMMRn{Q+7;1;Js?O!PjauEMuAc605cx|)b*1tcc1V6*co#_S|5W>=rsd;R&6o0Q z#O<8Zpsc+4sJ3v6Y;LuKtgI5|m@UkvjQ`JIuli~1V^jP;o%uh%K&<~1@C0xM_!Mvl z@D}3xF9A;ieP9CkAn+RE`xk((0nY#{z&4-_+zilu|347lKL;!Ur+``DKZx_+0R9BL z2%G>O0`3CdLVW)U@J-+ZK>PcLfwjQ1i0wZQ^nnL~dw_o-u74eP37~j?AMiflcHk}K zIL-kMz=3;#H!!2b#dl#6lsXPQlUN!knp3G+pf{nl2ju(;)yHF&Nqndv>)#W*s+?Cb!edoeS+fWy-Jru+3wvpwCt z?{)9)I4+7+K}9g2Wy+xXh$QZpxz4o+QyMep;V~Wqn2N9jYNxnSRV1NmIl|?tF`ed`Ri9l{AP81 z6qd}lqI?S*?N$&*>ziTqklzXl&E;eDKDa-iz<>hBq(Hk>8Tq5fcxP|gxIxMe<<3xR zp0MYb)dmFy6c|uoK!E`T1{4@jU_gNZ1qKutP~f+R0!;iIS9aY09eaJkzTehy-(DWP4Ja_6 zz<>e+3JfSPpum6v0}2c%FrdJI0s{&RC@`Qv4+{7g^t-rzzBmAg|2zBtyN~s}yTRXr zPk^_AI+z2yzy#O|wtzFi-M{O3?*!L^9bgE2|1qBTF>n)TfQ!M?z*E6V;Jc^MKKK}T z8~6+G$KVCv2)Ghl2nyg-@WV%Y-hY7m!1uxDz-Phxz(y;8IWkj{=VX zKgVHm3%DF?1-}PQ0sqE2-U)65mxIf|IJf}F8lMLq)|cWnq{5)p4(q%{?OJPY!#>Y5 z*Vn2_BUC}X+-y|qEmf_nynooQwiJmWWOpo)HByV#77qEfb`a&)?z7dTa@lYBYAmi> zSPELcTq~5TrB;6JaH?qIa6Kp&=a+jH_uH+-Mwlr+e^pRwQ8=gj&!z8`!hnI5xw#>I zxhhxOG?JlI%dU`_IfdqS$ei+ebe1Y}T@`;7s?-__3qeRuO{I~qkG;d zQ8(F+f>5o|k7@&1Gm`*WZSQhScN{f2mmu40DXA zb?ayewu#oQ8&%s_)oP>ehs%8%lo~P)DL&4sl4?{f>D7{}Fc-YG) z)@x1=<0iQ%s0SfCO!*y)mtsB+{bnPy%hSD4QYG~vay+{wHEG9EJ$6f~<@II^$<9f& z&};u3Y{TL~G$tFgV80BD9J_GpvK^CfWHnNiYEUaHKGYj6)$~Js(Cvx*g+TL;@K3AJ z@@vIb<3LciZNbz_&6d5S&QiLA64z>haGkx8Y_+aiW=LI^lNy;GOzF&}%-+<)&F)5b z)VF0OoL9+7udnnu==B_#jnol|E_+rBr1A*IrOZ+jg~lJkk*`OmH33e?Y6+6tmZd$8 z0@G=U6QvDNlTG_DGPo0EdP1BkAqS1^H#=F;BC_(PpJYhLcs#7GY0!hYbt?%!>tcqJ zjnH7_#&=Im>ulLP0>WqqT$K+T-6B-BYmFgaEY|&{pjZ?!VnoOSZ8VFLl^aB;O+}~1 zEZFT{43_4Da+zkL;$mC3SMf`MVXdI9kGEo_*6>?J(E!Z#a?pKUD<7o#hW%IP+zux`2{5vFNuZ;_YPa$hGN!UF=4Z+WhYL81~#y z{A!WiwSfw{R^y^Lm@l1;YPs#o>o1)pmv)R6fS zj=5#HV259aj&_hb^ICGP3zU|f78l>c7h7~V(P=vSFv87s5wR@AC9_anB^&ihH6HYi zUE3zN7bkY@oY*rxJ-KtXI6Xc)S=>IgV`{duqHH$TfzzW*nTijU7&?rrHH~=eGc6SN zC1~VUJX78^7H^qhwY5=R9(LN=u+|eNkCXy^&J62AsT~cY>T167EI|z`r@kGmVOknu zUlpNM*w5{Dwd_9EIlNG2kRweqrq*&ZwU(MYtenM6QG4nfbi-O<99FY!QI|Du&HGVs z&Sqshm_KJT`w&aR^`f=YYQuePMDCM44?JWWw39vv8$ks2gA2g<;4E-5 zI0^g!+x+jrr@)_p17JHi51atLfo*;>h(HcJ5v&2Xt990cpZT95~i1NUH$e-ivDSOm`jzaY2aW8kCUtw2-_ zt88lvq3F2Z+{#`n$d2?et3GWRC8+26wQKZgNz&k||3w9keoEWvqHmmL^yj&`_%cu70Nh)}^40b+oMIccH78 zkytXfjMCP-cBV*DQ};9`^VOe{8*-RiyWd=Xh$d#pFCG#LWM`uu7=BJ>6K~wHTxxLZ);W$f%uy8HcFwYF^Xvv;^G==0GKHCE zC;5K0xjU*ytuP-XGmysmQp5Ex;tQ@0!mttMbK`ZTKdDAZE9+%-xQek>S7zs%BV<(l zL4@XPdP}+sv~As0J$BXb?)3NG#gRNFoLU|s+~Om<$#T4K(<@# z@9c$@OyQ%RYh2!U?U~)ZXLi(_0`A6&9$FzPEe1<|5qDR$j_%p0XRFRkTs*mByt68V z3$UO{fs78__^9$+v+_Q*Q+JoXWS7@EHLW+&703)75`@80`-n7MC@nT{endE$@x^K* zfuj~3zTWa&WqHq%Law;oQ8cc?v6UR!Sdbf4Io(-9dxmpIvx_AaJJwGw=~tF4?y7Tr zx$o|MrHewIyOn;ogz9;3cP&5@l!Ge5sb(zkN~2b59M(!@z1haCiRa8XvXw6$qKNeq zPaA&s7RD0XSF6fV8YzE)(+;&z?0H;t)ezS=Hl;LTIG~VSLO05lT-c~-y2-iCZp&Hv zL&{3u*~gWPZ?&`9<&Cz&BxTHt7*&-vzS$_^{N)i+Gj21oNIiFE*G}b^N{vu#RE~Xa zb4;2Mk1EacRs-q7&3M3jEVAV#T(4cEH$vB(pkhvEIV9#xxU^KOinp=^p;Pi7p4E|s z>=sYh!4X#8i658)qH7l(U#a?B?wN)bITKKE)w=hC-R5GiXpJJRK^ecaZOF!3Tubt9 z%ZiV@=@SN)>Ub}ZKljeoB5^RELXAa?)R;78c`{{&tN4uU3VfIkF}2KQm# z-v!)#LV1^);>2wn%OU@tfgd;z;( zV)!2cF9+9v7lQz722TeMV*h_0w7^wBd;%N58t@bB|F?kGfCz-Z2M=KH-w%Eaz6f3i zUJI@PZ7>c_1>e92a5b0!PY1F#;uCn-Uye66`vp}f6qL3K;UW>N$#&RWP*dm*s0m?P z$7sbQLFQKL5=J*irL?qZ-n1f)a&B5xP?%CYr-!S=TIT~LdM-)^^~>{~8^9(z08U&Z zZ>V3YwIyh1-OW@nNdm)tnqF#4MuD_zYnT8|GL21rrV+I`zmr*PET~yL$)aG@nO^mf z3q>~DOu&vVQH$d#Ou8HgUn(&aW1FNUm5SO;aev2koTAiU(4+-fC8x~})aVO$vBNuM zuG{e0DwCJZPLHRmNGaWaa+p?f;z4J^?yzIYwAWL|WAu@)Ruav}rWAfk;}S@OI6Hz0gv@j#+|(2HNX9AOvi5sywp+ro`i+{g-NjqA)Hoyz zff!cWg=(jjGMA;vv@O4RgU$Mo8+~n4mP>pE@wns66zQwz#v)3%tdSl-%2Mh%p-OJ5 zuC;RG15l!3Iy%bdqr*s~pmabbX##q68roltx$DV@-77sM^Vzs3m|k(~__pHoR~=Fq*Pmw0 zVI6Ta?Iz^R>bk30C^>>QwZ^bIyx7nN$8w{6e(tE}$S3bf^qYFuUI~$gNqh?U55m!&wqyxEJGe`K;IE}QD-GKu` za)si7W>U;96bUXzNU$!#(j z(GiZ31Yu-Qam=O7#i8vy)3ga0MHrO5i=H;tArP?8;zCKJe66+3QYKm=C1hMZoOwIU zv6L6L)>zIuwS>}e(^&3OVH&hv1VyN2^ZA{Q328RlMl3htR#p)jh0gXImv^|L9-8!! zL3POuxXbXC>=)5=$8;<_?Rqf83g+;H==ccRRP6sXEX%8{{qLUN7yJKe5Q6i-$>68h z`2PjI1-=4q0|&q;I2C*Yd;bIAI&d|R9Dr@$8Q_Q5`gem{!F8Yto&%l)euUlsZg3Es z1)c;>1ovR?-wi$ht^@mk0#5*UV(Whx+ypKL&j6=@uVLfA4_pgs-~iYGevV!LGw^N@ zfX9O01z*ONe-+pY#=+yjKVZY(0&3vd;1uvv?Dx-rH-JTO23P~WiM{?A@P2SJD1j#f z58Q|C{$}uMunRl_oB-~D*6#p9^H&MovoF~P?$yG(cL0vqjxri`IOsCY7o*!t591;l`YLduWOhMDMjQJVVx4Ns+J@AG+*E&c9yaI zgRW$mFy@sad2-HQD)q&62es~O4nBK=&8Z}IvOU@(3#ybMN( z(N6rhnM@m5on9Iib&Gs8RjyWCu*oE{p<{JlG}Dy~!>FUT}4jb(LyxgxKW+%OlC zzuif0d7nf%EdIdcNOTRWyHjZ`MYT~9g9^1O*=Gv{T**s`*D&dp3M>k-6_=@(zO~|| zzh#z-RZJ`oDJ5%iHd#+PiOVQ9D0lqiCZyw>C3I)BMAu?Bfx780Iol7J^3}4Qw;zW7 zay}s%&w|WiF$=SFELTz{leowXv-6i3ZW3L;jsZiUOjH_a&SaMcerZubO3zJD-n*B` zGPq`}QKjF6(H+Mj-ZBkHBgtJmzW%QNp2ZEPGM(<^%q&O91UIUSB!x58sTpLXcnD@{ zTV`nX3ECX_`>i0)je|9J z%_W>>*CIQ1tFVaTE1HKm{3NicHP@ZGmwxBo**q{39ZrD~nEf-PHo@t!Zm&zJBy)F^ zb5>GVLZO$ri3W=y)+TaN$gZ2T*vkjhSM|cs*A76_Zl%$#mpdd5PO`XDlfUBGacAD< zu^bNcyklyUvSl>$o&kPoijG_nQQp-U&vj}2J<;@}m^RZ*Q*vIRT)EVNC|l6=D}(l= zrh5s!H;fKX zgd%^;b~{*enQ&anujJ&nnInY9+{)2?YMmk>wTK6zMV2#e#g&|PfOC5`YzIfP%$ofs zb31lx?IqWiCl%Z)Ehc*n({lyoJvBti)`Gem7Mvn_CfPwr@;34pN6QP~b{!TLi=ulk zZ`*3Rm0Wa9?|hHer1Nb1az$Rfugaa&(MC918r2y;CI+6l*=giSZTGT~`0f_s8>`ix z*H5^afO6*$()U(tgOK}}Fnzadb7RzVV}z@h!i}E{VJ^qlUh-1fWKs2MK(efi(>H}{ z3w~1`r_0`ztsIltZD!NfoMm?FfJhHqRNA@D6ZE2>Wu=1ot#Y2IN{0$O*MPiR9eU$v z!g0x?WUgR#?@#-rzmu5KlI_Mr8L2ZewjiaZbAZd|a|&u)Pg*PJXvnzOw0Cy<_8oTX zOEG!j|ICOrYgcDX0Z*6Y4<69|V%#`;q$p0%Oq+c~Wl{m3XzGXy?5Xb#xa4&6q;+}W z7mc^9CSb?$Cc9T_C3=^#zD6-kdYp8jHcn3Kb5%T`rt@x0_eohtSsP+AT#|~$G!clN z9u|M>;^}O(TsqZH?VjE>F*!3Mi6l07GPy0am_wwOY$GT~c79DeAdxQ;L}l<2BNZ)$ zv1-W@cjiVWoo_Cg(5c~eo;F*SRA;Hvz37{5n3WkFJ639=qNxV01>>TlV*g{>d#?~X zl=#2M_3tRtYuouX4`)j~QvGH#OuLLgyli+*U_x}#Q1YQIVf+n~GoC@T5 z{XYjU2QLF{Fbw25fD^%cu=n2tt_05p4`Sv z_WlFli{Oo5KX?}SPi+0SfmeWOAo=~jz|Q|Ga241M&H>+t#&?42fzbOpkbVg#^m-Y0 zkbT0V5Y>X9ncvV~9xdw!7b`hQJ0%z^Z%41FUr|qDs-2xk5l%<#JV@mYo1A$3XA+4o zwt29(H6}_z@2+`}KNUvr?4oxaS4s|<%oCD0dU0fs%#JTUl||R}{G@9j{hmpi&oq>| z(_hR#!9nmu4a}*lZdnTnQ^Mqg{Jk0;pBSz_r zW*?ljE()A7sN!5s-RQ5F&}kJiGun>L*nQ%q9TDd9u^zZ_Q6f6{bv<-qmC1+nxQXX@ zMc%vTS;@`lpB-^74P{alY%WYoK2ODeQ=g>vd*>R_QF|X z`&pz9m}mR4ud-oQ7y=n866UhDb;qXZUcE|gM6Jj^JKJ)Gu3i12aWlwV;VOO_E6YrF^5=}oiOgW7O?IpH1Y~EP z^=HVk356v-rWGC=ijZNYzaJwiwvq&!Is#SVv6ttECFv?}eU90#)@F5}6fwm8k|D?t z{);3QrN@^NGBTI$rRW)$(N%l-n9_4zU4o}eK7>fj7IDDqNQ`bE8-&SBHr)Y~Ky={F zG#9m7AdZR%#STaWHamGC)-eDDNtFEqFVEQ52wbAZrg4CKKH z;M@2C?gd3~AsD;{6c|w8|2qXlSXt-0wgE)}&_9*Y_l7yXvxR?cKiwgt=si9&jGjYJ z37A#x|1ZrTl};$>aEWYmgx0=FgrD3U{P@VR+@={v=-|gkbS^{2foq(#$K#$H{P>8c zj~D(7ete|X`i=SVk<_n;%;j|cBR{f)oo+viJ&-D*#Q&lOKUkt-W)`OYE&Rcf Tuple[int, try: limit = MODEL_CONCURRENT_RATE_LIMIT[chat_request.model] except KeyError: - raise HTTPException(status_code=400, detail="Invalid model name") + raise HTTPException(status_code=400, detail="Invalid model concurrency value") return limit, key @@ -203,6 +204,9 @@ async def chat_completion( f"Chat completion request for model {model_name} from user {user.userid} on url: {model_url}" ) + logger.info(f"EXTRA INFO: {req}") + logger.info(f"VAULT INFO: {req.secret_vault}") + if req.secret_vault: """ Endpoint activated with SecretVault support @@ -216,6 +220,7 @@ async def chat_completion( 4c. ... append payload to LLM query """ # TODO: implement record injection to query + logger.info("SECRET VAULT PROCESSING REQUESTED") pass if req.nilrag: @@ -412,24 +417,42 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: if req.secret_vault: try: + logger.info("GOING TO SAVE RECORDS TO SECRET VAULT") vault = SecretVaultHelper( org_did=req.secret_vault.get("org_did"), secret_key=req.secret_vault.get("secret_key"), schema_uuid=req.secret_vault.get("schema"), ) + inference_result = response.choices[0].message.content + my_schema = vault.schema_definition + if '$schema' in my_schema: + del my_schema["$schema"] remux_res = client.chat.completions.create( model=model_name, messages=[ - {"role": "system", "content": f"Please provide responses in the following JSON schema: {vault.schema_definition}"}, - {"role": "user", "content": response.content} + {"role": "system", "content": f"You are a helpful assistant that outputs JSON according to this jsonschema: {json.dumps(vault.schema_definition)}"}, + {"role": "user", "content": inference_result } ], - response_format={ "type": "json_object" } + response_format={"type": "json_object"}, ) + json_response = remux_res.choices[0].message.content + logger.info(f""" + INPUT: + {inference_result} + + SCHEMA: + {vault.schema_definition} + + OUTPUT: + {json_response} + """) + parsed_data = json.loads(json_response) vault_res = vault.post( - [remux_res], + parsed_data["items"] if "items" in parsed_data else [parsed_data], ) + logger.info("!! POSTED RECORDS TO SECRET VAULT") except Exception as e: - logger.error("An error occurred within nilrag: %s", str(e)) + logger.error("An error occurred within secret vault: %s", str(e)) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) ) @@ -459,10 +482,11 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: # Sign the response response_json = model_response.model_dump_json() + if req.secret_vault: + unpacked = json.loads(response_json) + unpacked["secret_vault"] = vault_res + response_json = json.dumps(unpacked) signature = sign_message(state.private_key, response_json) model_response.signature = b64encode(signature).decode() - if req.secret_vault: - # TODO: redact the model output - model_response["secret_vault"] = vault_res return model_response diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index ec0f4011..693bce29 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -1,6 +1,7 @@ from pdb import set_trace as bp from ecdsa import SigningKey, SECP256k1 import jwt +import logging import nilql import os import requests @@ -8,18 +9,20 @@ import uuid import time +logger = logging.getLogger(__name__) class SecretVaultHelper: def __init__(self, org_did: str, secret_key: str, schema_uuid: str): """Initialize config with JWTs signed with ES256K for multiple node_ids; Add cluster key.""" self.org_did = org_did response = requests.post( - "https://sv-sda-registration.replit.app/api/config", + "https://secret-vault-registration.replit.app/api/config", headers={ "Content-Type": "application/json", }, json={"org_did": org_did}, ) + response.raise_for_status() self.nodes = response.json()["nodes"] # Convert the secret key from hex to bytes @@ -44,6 +47,7 @@ def __init__(self, org_did: str, secret_key: str, schema_uuid: str): self.schema_list = self.fetch_schemas() self.schema_definition = self.find_schema(schema_uuid) self.schema_uuid = schema_uuid + logger.info(f"fn:data_upload init complete: {len(self.nodes)} nodes | schema {schema_uuid}") def fetch_schemas(self) -> list: """Get all my schemas from the first server.""" @@ -55,6 +59,7 @@ def fetch_schemas(self) -> list: response = requests.get( f"{self.nodes[0]['url']}/api/v1/schemas", headers=headers ) + response.raise_for_status() assert ( response.status_code == 200 and response.json().get("errors", []) == [] @@ -93,7 +98,7 @@ def _validator_builder(self): def post(self, data_to_store: list) -> list: """Create/upload records in the specified node and schema.""" - print(f"fn:data_upload [{self.schema_uuid}] [{data_to_store}]") + logger.info(f"fn:data_upload {self.schema_uuid} | {data_to_store}") try: builder = self._validator_builder() @@ -104,6 +109,7 @@ def post(self, data_to_store: list) -> list: record_uuids = [x["_id"] for x in data_to_store] payloads = nilql.allot(data_to_store) + logger.info(f"fn:data_upload {payloads}") for idx, shard in enumerate(payloads): @@ -116,6 +122,7 @@ def post(self, data_to_store: list) -> list: } body = {"schema": self.schema_uuid, "data": shard} + logger.debug(f"fn:data_upload POST{idx} | {body}") response = requests.post( f"{node['url']}/api/v1/data/create", @@ -127,10 +134,10 @@ def post(self, data_to_store: list) -> list: response.status_code == 200 and response.json().get("errors", []) == [] ), f"upload (host-{idx}) failed: " + response.content.decode("utf8") - print(f"fn:data_upload COMPLETED: {record_uuids}") + logger.info(f"fn:data_upload COMPLETED: {record_uuids}") return record_uuids except Exception as e: - print(f"Error creating records in node: {e!r}") + logger.info(f"Error creating records in node: {e!r}") return [] diff --git a/nilai-models/src/nilai_models/daemon.py b/nilai-models/src/nilai_models/daemon.py index 57a54381..bd1fcbe0 100644 --- a/nilai-models/src/nilai_models/daemon.py +++ b/nilai-models/src/nilai_models/daemon.py @@ -37,6 +37,7 @@ async def get_metadata(num_retries=30): source=f"https://huggingface.co/{model_name}", # Model source supported_features=["chat_completion"], # Capabilities tool_support=SETTINGS["tool_support"], # Tool support + role=SETTINGS["role"], # Model role ) except Exception as e: diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index dd8b59f9..d34d6919 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -22,7 +22,7 @@ class Message(ChatCompletionMessage): - role: Literal["system", "user", "assistant"] + role: Literal["system", "user", "assistant", "tool"] class Choice(OpenaAIChoice): @@ -59,6 +59,7 @@ class ModelMetadata(BaseModel): author: str license: str source: str + role: Optional[str] = "unknown" supported_features: List[str] tool_support: bool diff --git a/packages/nilai-common/src/nilai_common/config.py b/packages/nilai-common/src/nilai_common/config.py index e101d3c8..08a92953 100644 --- a/packages/nilai-common/src/nilai_common/config.py +++ b/packages/nilai-common/src/nilai_common/config.py @@ -10,6 +10,7 @@ "etcd_host": os.getenv("ETCD_HOST", "localhost"), "etcd_port": os.getenv("ETCD_PORT", 2379), "tool_support": os.getenv("TOOL_SUPPORT", False), + "role": os.getenv("MODEL_ROLE", "default"), } # if environment == "docker": # config = "docker_settings.py" From 6599a49cea929e0577a8fdb777c57e0333bf4f19 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Tue, 25 Feb 2025 00:17:44 +0000 Subject: [PATCH 03/20] transforming inference output into schema and saving records successful; added output to model response --- .gitignore | 2 + nilai-api/src/nilai_api/routers/private.py | 72 +++++++++++-------- nilai-api/src/nilai_api/vault.py | 8 ++- .../src/nilai_common/api_model.py | 1 + 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index e53cf46b..1a6893da 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,5 @@ grafana/runtime-data/* prometheus/data/* !prometheus/data/.gitkeep + +*.swp diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index 1250fab1..a4876a4f 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -7,6 +7,7 @@ import numpy as np import uuid import json +from jsonschema.exceptions import ValidationError import nilql import nilrag @@ -427,30 +428,48 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: my_schema = vault.schema_definition if '$schema' in my_schema: del my_schema["$schema"] - remux_res = client.chat.completions.create( - model=model_name, - messages=[ - {"role": "system", "content": f"You are a helpful assistant that outputs JSON according to this jsonschema: {json.dumps(vault.schema_definition)}"}, - {"role": "user", "content": inference_result } - ], - response_format={"type": "json_object"}, - ) - json_response = remux_res.choices[0].message.content - logger.info(f""" - INPUT: - {inference_result} - - SCHEMA: - {vault.schema_definition} - - OUTPUT: - {json_response} - """) - parsed_data = json.loads(json_response) - vault_res = vault.post( - parsed_data["items"] if "items" in parsed_data else [parsed_data], - ) - logger.info("!! POSTED RECORDS TO SECRET VAULT") + messages = [ + {"role": "system", "content": f"Output only minimal JSON according to this jsonschema: {json.dumps(vault.schema_definition)}"}, + {"role": "user", "content": inference_result } + ] + max_retries = 3 + attempt = 0 + while attempt < max_retries: + try: + remux_res = client.chat.completions.create( + model=model_name, + messages=messages, + response_format={"type": "json_object"}, + ) + json_response = remux_res.choices[0].message.content + logger.info(f""" + INPUT: + {inference_result} + + SCHEMA: + {vault.schema_definition} + + OUTPUT: + {json_response} + """) + parsed_data = json.loads(json_response) + vault_res = vault.post( + parsed_data["items"] if "items" in parsed_data else parsed_data, + ) + logger.info("!! POSTED RECORDS TO SECRET VAULT") + break + + except (json.JSONDecodeError, ValidationError) as e: + attempt += 1 + if attempt == max_retries: + raise Exception(f"Failed to get valid response after {max_retries} attempts. Last error: {str(e)}") + + # Add the failed attempt and error to the conversation + messages.extend([ + {"role": "assistant", "content": json_response}, + {"role": "user", "content": f"{str(e)}. Try again, ensuring the response exactly matches the schema. Format dates like: 2025-02-24T15:30:00Z"} + ]) + print(f"Attempt {attempt} failed: {str(e)}. Retrying...") except Exception as e: logger.error("An error occurred within secret vault: %s", str(e)) raise HTTPException( @@ -459,6 +478,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: model_response = SignedChatCompletion( **response.model_dump(), + **({"secret_vault": vault_res} if req.secret_vault else {}), signature="", ) if model_response.usage is None: @@ -482,10 +502,6 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: # Sign the response response_json = model_response.model_dump_json() - if req.secret_vault: - unpacked = json.loads(response_json) - unpacked["secret_vault"] = vault_res - response_json = json.dumps(unpacked) signature = sign_message(state.private_key, response_json) model_response.signature = b64encode(signature).decode() diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index 693bce29..b3ce5e29 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -5,7 +5,9 @@ import nilql import os import requests +import traceback from jsonschema import validators, Draft7Validator +from jsonschema.exceptions import ValidationError import uuid import time @@ -104,6 +106,7 @@ def post(self, data_to_store: list) -> list: builder = self._validator_builder() validator = builder(self.schema_definition) + logger.info(f"fn:data_upload | got {len(data_to_store)} records") for entry in data_to_store: self._mutate_secret_attributes(entry) @@ -137,8 +140,9 @@ def post(self, data_to_store: list) -> list: logger.info(f"fn:data_upload COMPLETED: {record_uuids}") return record_uuids except Exception as e: - logger.info(f"Error creating records in node: {e!r}") - return [] + msg = ''.join(traceback.format_tb(e.__traceback__, limit=3)) + logger.info(f"Error creating records in node: {msg}") + raise ValidationError(f"{e!r}") if __name__ == "__main__": diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index d34d6919..f82173e7 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -43,6 +43,7 @@ class ChatRequest(BaseModel): class SignedChatCompletion(ChatCompletion): signature: str + secret_vault: List[str] = [] class AttestationResponse(BaseModel): From 7c6c361918b41b1b84af1b3ccd4245985db8ab67 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Tue, 25 Feb 2025 00:41:42 +0000 Subject: [PATCH 04/20] removed some vi swap files --- nilai-api/src/nilai_api/.vault.py.swp | Bin 20480 -> 0 bytes nilai-api/src/nilai_api/routers/.private.py.swp | Bin 32768 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nilai-api/src/nilai_api/.vault.py.swp delete mode 100644 nilai-api/src/nilai_api/routers/.private.py.swp diff --git a/nilai-api/src/nilai_api/.vault.py.swp b/nilai-api/src/nilai_api/.vault.py.swp deleted file mode 100644 index 95fdbd1cc668bfa0ce782623a166a8b8e54980e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHOTa4UR8FpKG142t$gv#~AZIzjHW_FV_w=Ely%eGx|ZL$fJVX-{+@vIY%?fTf8 zoi3a5P(&&f3Did9si0OxDu_Oo3LYpAAQb@$7Xht!;8O8~`cMQs0D|v7_VHzQa(gN$ z9_bs8?Q{9h|NrMd|Noyey~*RV2iT6zMh%}^HSNF;U+#bSn%lJvci*b{?#X~2U+U8j zleQn&ypxEw#r-%ky^U?BV|83##HJs&#ex~xZS6EQIN`hAu37pv-L@IJ6C$$GJA>{P z&BTj4;qX#@*6(W$)Eu}14kWSD-o8fLylLYk)w)w($8KAD>dIZ$(;=0MGX zngcZlY7W#Ks5$We&Ve|*PJ0Z4xHcQehU|LH$n_oB{d9J1jl91uyWf#r`y=nO+xk*- zpyoi$ftmv~2Wk$~9H==^bD-ux&4HQ&H3w=AybT;MZB4uRotpM4K>PnH{{Q_gn)WjA zZQvQ;E5H|lQ@~zeJJ15|0d4@U2mbONO?wX5349dz_Zm%m3HUnT0rS9Cpat9ny#8)Y zdky#oun0^76TmINAKnF;fER!-0LOp_fcpUk{5Yfeaa=zG9048z)&YOKS<}7;d>1$i z%mcH)jlgei(zKrfKLNf4aG(op1GWNp13$kJGy%^8r+_xF7I-i4yBjp^9Pk)$1Yp3M z*K68ufpfrPz-i#)zkA0ZL*H1HJA13m=& z49S=u0IvYwSBV*=D=hoO(QryrH(t>1^9biJoS@<8jz49av1ufs7nnBdE(`8C9bql- z0Ujog@f9w(8{7ERAZjUW;oz7%uc zZtRUrC*F2kJ+Dx@J8?amnMExY2kM4PaxD-@4RU4&Rx-eW6=wELI;+BnKN!Xs>W!QV zqengPNRFjhB3F?uxoZrP7+n~GTNs96#&P8Kl9-DI8cKLUGS%Xq>o8ZO$7L*@76F@F zD@F&ZU3H}sHp8xdm+5&ytk1J)hQlqZ$A{6W<_y=?t8Gal(L_oSwU-m) z1d*%=J;QTR)T298A;oFPdNf{9?iQN2D-69MnkB9Tu^add&86~SG$_~alWu^G49e@J z`kaa$dSXH=A`TUY6d*{Ootj`NFNhZ39Po;EUs&F$%1bJzQjwCX9}Ik6(w$7z2SXzz zAZLLo1dn2tzkr%xmc_Dui|LN(dY}!%@PgoE5@xEK&N`B%`t&e?PipE;U5jR?F=SU{ zy?6DLiV?kl7%PQHmJmLqUzn0YMkKsaaWWQVyF;=o3YQ5X*5s5zj`zD>%p*)`s=@*% z>rSxVkYUdBJxpXS+$f*840>3$JPw4IjVv=jWr9g}rS+ldwpt`vQR+Jn z+_7PdZQjsvz-N2OXp@NZ_HYa@PJ}@PNnV>KC#99n->3a``aEvvJc?jy^%m>SH>q&9 zn2*`G8wEjm3z6vxZb0T(Kd7%pVF8L?M3bYZ%MUFTqB}X?U7tkW`uUX!dHQeTM9LBB ze}TgoM`Aj=YE+v(s!z$VM-nb#At^7YTG3>|>`UL1a;iNy47onVbQ6YwCN)gL1dUv8 zRm<;6;)Nh`AC)Cg!CAkX!xltrgmS$nAM5ig>x&jLYC+s`-YS&w0SXKF=vIT7VzSdU%bl{OKD$s4H5 zkzzU*vMX1Y6H!&H(AX@5P*f#3EbCI>;AVFj?#2ctClB@P2lSpk7xh}4Ac0@8T&f2B zX|70@LqP8}*+lk5eRXs3fFUPN#k4-sL&K1Q#lk^fSghDRZ1dL1 z$wGJ35Og!aDk+Bs8$eceOc_@QlnJ7~ffCjC*$^u_NNwi>PzA_Fa}zd-7zT5$DGKNX zJV?hVYMMD+_!H>MlJeG*Fbs00JMgB$k}d)^e0c=MrksN+_EtL?RVel8-Kw?Z_>x zd{J8G@&cD_(8z*JFYB2g3X!Z-WioP0jJ{ICqzqzVSY#^;aU6=NiHVdQZFz#a9q~R^ ztVo)$PQ+pG;tuSdw6a(^9JgPxdTP*;L77FB?z%=D&_^;c8zM?&zcl#{Uocv;WKZCc zKgwC!K0Ae}M6*MrGYuXTJxFI3BLy4asJ9zp`6eMi`^0^0mu)l4O9UK4XKlYMf_7ADKOD<)!#8AGPeA*DnKs}peOkiUUqt zY!k@kB1J5nwb9B^haJQ}59w=c)ev4Xnjcs9plh9EbD(={MVZW8o%^gh{)M;RmHu+} z4@b&|%lm@irKo*c-@eUqc5rjDZEf0WweQ`wZEL&dY~R@4yk*Pg-geX6Y;B$_x$uSm zI~^cT?k~Dg;CJhCiy(}&E6Z_~@=5eGb-mSA#SA5%7y>_t1nJq*MgzqNPzt^- zS}BF)e97Wr%x2_;QoQhLkyoXL)hFvVZAxx;2u;1CYn6bJy^=kL4jkS;GdHsrU6)%Z z)1Vqd2Eoy@9g@ZZ|s^uRS^}kX4mnBkP;;6j%ETW`8gp~ftM6rwX6oU zI%d^W5p~TZZ1Y~yU%ef6_|VZgDJb?iwoD@#CtG@so|aW&93kb%9vTwAGFyu`^l#^t zs_qjhs|_eUz0xEA)uE4m;Vh+OW}f{jCnwXYOr=(7M4Ec0u2dT@inK`=T3pIOt8#gG z+sS_Mh8%gbI&up1(EuWJVhiPyxQ|UYWG3=doEY6jyXchsSh}-j?_|qa8cU2yOg+ai z(ycMMRn{Q+7;1;Js?O!PjauEMuAc605cx|)b*1tcc1V6*co#_S|5W>=rsd;R&6o0Q z#O<8Zpsc+4sJ3v6Y;LuKtgI5|m@UkvjQ`JIuli~1V^jP;o%uh%K&<~1@C0xM_!Mvl z@D}3xF9A;ieP9CkAn+RE`xk((0nY#{z&4-_+zilu|347lKL;!Ur+``DKZx_+0R9BL z2%G>O0`3CdLVW)U@J-+ZK>PcLfwjQ1i0wZQ^nnL~dw_o-u74eP37~j?AMiflcHk}K zIL-kMz=3;#H!!2b#dl#6lsXPQlUN!knp3G+pf{nl2ju(;)yHF&Nqndv>)#W*s+?Cb!edoeS+fWy-Jru+3wvpwCt z?{)9)I4+7+K}9g2Wy+xXh$QZpxz4o+QyMep;V~Wqn2N9jYNxnSRV1NmIl|?tF`ed`Ri9l{AP81 z6qd}lqI?S*?N$&*>ziTqklzXl&E;eDKDa-iz<>hBq(Hk>8Tq5fcxP|gxIxMe<<3xR zp0MYb)dmFy6c|uoK!E`T1{4@jU_gNZ1qKutP~f+R0!;iIS9aY09eaJkzTehy-(DWP4Ja_6 zz<>e+3JfSPpum6v0}2c%FrdJI0s{&RC@`Qv4+{7g^t-rzzBmAg|2zBtyN~s}yTRXr zPk^_AI+z2yzy#O|wtzFi-M{O3?*!L^9bgE2|1qBTF>n)TfQ!M?z*E6V;Jc^MKKK}T z8~6+G$KVCv2)Ghl2nyg-@WV%Y-hY7m!1uxDz-Phxz(y;8IWkj{=VX zKgVHm3%DF?1-}PQ0sqE2-U)65mxIf|IJf}F8lMLq)|cWnq{5)p4(q%{?OJPY!#>Y5 z*Vn2_BUC}X+-y|qEmf_nynooQwiJmWWOpo)HByV#77qEfb`a&)?z7dTa@lYBYAmi> zSPELcTq~5TrB;6JaH?qIa6Kp&=a+jH_uH+-Mwlr+e^pRwQ8=gj&!z8`!hnI5xw#>I zxhhxOG?JlI%dU`_IfdqS$ei+ebe1Y}T@`;7s?-__3qeRuO{I~qkG;d zQ8(F+f>5o|k7@&1Gm`*WZSQhScN{f2mmu40DXA zb?ayewu#oQ8&%s_)oP>ehs%8%lo~P)DL&4sl4?{f>D7{}Fc-YG) z)@x1=<0iQ%s0SfCO!*y)mtsB+{bnPy%hSD4QYG~vay+{wHEG9EJ$6f~<@II^$<9f& z&};u3Y{TL~G$tFgV80BD9J_GpvK^CfWHnNiYEUaHKGYj6)$~Js(Cvx*g+TL;@K3AJ z@@vIb<3LciZNbz_&6d5S&QiLA64z>haGkx8Y_+aiW=LI^lNy;GOzF&}%-+<)&F)5b z)VF0OoL9+7udnnu==B_#jnol|E_+rBr1A*IrOZ+jg~lJkk*`OmH33e?Y6+6tmZd$8 z0@G=U6QvDNlTG_DGPo0EdP1BkAqS1^H#=F;BC_(PpJYhLcs#7GY0!hYbt?%!>tcqJ zjnH7_#&=Im>ulLP0>WqqT$K+T-6B-BYmFgaEY|&{pjZ?!VnoOSZ8VFLl^aB;O+}~1 zEZFT{43_4Da+zkL;$mC3SMf`MVXdI9kGEo_*6>?J(E!Z#a?pKUD<7o#hW%IP+zux`2{5vFNuZ;_YPa$hGN!UF=4Z+WhYL81~#y z{A!WiwSfw{R^y^Lm@l1;YPs#o>o1)pmv)R6fS zj=5#HV259aj&_hb^ICGP3zU|f78l>c7h7~V(P=vSFv87s5wR@AC9_anB^&ihH6HYi zUE3zN7bkY@oY*rxJ-KtXI6Xc)S=>IgV`{duqHH$TfzzW*nTijU7&?rrHH~=eGc6SN zC1~VUJX78^7H^qhwY5=R9(LN=u+|eNkCXy^&J62AsT~cY>T167EI|z`r@kGmVOknu zUlpNM*w5{Dwd_9EIlNG2kRweqrq*&ZwU(MYtenM6QG4nfbi-O<99FY!QI|Du&HGVs z&Sqshm_KJT`w&aR^`f=YYQuePMDCM44?JWWw39vv8$ks2gA2g<;4E-5 zI0^g!+x+jrr@)_p17JHi51atLfo*;>h(HcJ5v&2Xt990cpZT95~i1NUH$e-ivDSOm`jzaY2aW8kCUtw2-_ zt88lvq3F2Z+{#`n$d2?et3GWRC8+26wQKZgNz&k||3w9keoEWvqHmmL^yj&`_%cu70Nh)}^40b+oMIccH78 zkytXfjMCP-cBV*DQ};9`^VOe{8*-RiyWd=Xh$d#pFCG#LWM`uu7=BJ>6K~wHTxxLZ);W$f%uy8HcFwYF^Xvv;^G==0GKHCE zC;5K0xjU*ytuP-XGmysmQp5Ex;tQ@0!mttMbK`ZTKdDAZE9+%-xQek>S7zs%BV<(l zL4@XPdP}+sv~As0J$BXb?)3NG#gRNFoLU|s+~Om<$#T4K(<@# z@9c$@OyQ%RYh2!U?U~)ZXLi(_0`A6&9$FzPEe1<|5qDR$j_%p0XRFRkTs*mByt68V z3$UO{fs78__^9$+v+_Q*Q+JoXWS7@EHLW+&703)75`@80`-n7MC@nT{endE$@x^K* zfuj~3zTWa&WqHq%Law;oQ8cc?v6UR!Sdbf4Io(-9dxmpIvx_AaJJwGw=~tF4?y7Tr zx$o|MrHewIyOn;ogz9;3cP&5@l!Ge5sb(zkN~2b59M(!@z1haCiRa8XvXw6$qKNeq zPaA&s7RD0XSF6fV8YzE)(+;&z?0H;t)ezS=Hl;LTIG~VSLO05lT-c~-y2-iCZp&Hv zL&{3u*~gWPZ?&`9<&Cz&BxTHt7*&-vzS$_^{N)i+Gj21oNIiFE*G}b^N{vu#RE~Xa zb4;2Mk1EacRs-q7&3M3jEVAV#T(4cEH$vB(pkhvEIV9#xxU^KOinp=^p;Pi7p4E|s z>=sYh!4X#8i658)qH7l(U#a?B?wN)bITKKE)w=hC-R5GiXpJJRK^ecaZOF!3Tubt9 z%ZiV@=@SN)>Ub}ZKljeoB5^RELXAa?)R;78c`{{&tN4uU3VfIkF}2KQm# z-v!)#LV1^);>2wn%OU@tfgd;z;( zV)!2cF9+9v7lQz722TeMV*h_0w7^wBd;%N58t@bB|F?kGfCz-Z2M=KH-w%Eaz6f3i zUJI@PZ7>c_1>e92a5b0!PY1F#;uCn-Uye66`vp}f6qL3K;UW>N$#&RWP*dm*s0m?P z$7sbQLFQKL5=J*irL?qZ-n1f)a&B5xP?%CYr-!S=TIT~LdM-)^^~>{~8^9(z08U&Z zZ>V3YwIyh1-OW@nNdm)tnqF#4MuD_zYnT8|GL21rrV+I`zmr*PET~yL$)aG@nO^mf z3q>~DOu&vVQH$d#Ou8HgUn(&aW1FNUm5SO;aev2koTAiU(4+-fC8x~})aVO$vBNuM zuG{e0DwCJZPLHRmNGaWaa+p?f;z4J^?yzIYwAWL|WAu@)Ruav}rWAfk;}S@OI6Hz0gv@j#+|(2HNX9AOvi5sywp+ro`i+{g-NjqA)Hoyz zff!cWg=(jjGMA;vv@O4RgU$Mo8+~n4mP>pE@wns66zQwz#v)3%tdSl-%2Mh%p-OJ5 zuC;RG15l!3Iy%bdqr*s~pmabbX##q68roltx$DV@-77sM^Vzs3m|k(~__pHoR~=Fq*Pmw0 zVI6Ta?Iz^R>bk30C^>>QwZ^bIyx7nN$8w{6e(tE}$S3bf^qYFuUI~$gNqh?U55m!&wqyxEJGe`K;IE}QD-GKu` za)si7W>U;96bUXzNU$!#(j z(GiZ31Yu-Qam=O7#i8vy)3ga0MHrO5i=H;tArP?8;zCKJe66+3QYKm=C1hMZoOwIU zv6L6L)>zIuwS>}e(^&3OVH&hv1VyN2^ZA{Q328RlMl3htR#p)jh0gXImv^|L9-8!! zL3POuxXbXC>=)5=$8;<_?Rqf83g+;H==ccRRP6sXEX%8{{qLUN7yJKe5Q6i-$>68h z`2PjI1-=4q0|&q;I2C*Yd;bIAI&d|R9Dr@$8Q_Q5`gem{!F8Yto&%l)euUlsZg3Es z1)c;>1ovR?-wi$ht^@mk0#5*UV(Whx+ypKL&j6=@uVLfA4_pgs-~iYGevV!LGw^N@ zfX9O01z*ONe-+pY#=+yjKVZY(0&3vd;1uvv?Dx-rH-JTO23P~WiM{?A@P2SJD1j#f z58Q|C{$}uMunRl_oB-~D*6#p9^H&MovoF~P?$yG(cL0vqjxri`IOsCY7o*!t591;l`YLduWOhMDMjQJVVx4Ns+J@AG+*E&c9yaI zgRW$mFy@sad2-HQD)q&62es~O4nBK=&8Z}IvOU@(3#ybMN( z(N6rhnM@m5on9Iib&Gs8RjyWCu*oE{p<{JlG}Dy~!>FUT}4jb(LyxgxKW+%OlC zzuif0d7nf%EdIdcNOTRWyHjZ`MYT~9g9^1O*=Gv{T**s`*D&dp3M>k-6_=@(zO~|| zzh#z-RZJ`oDJ5%iHd#+PiOVQ9D0lqiCZyw>C3I)BMAu?Bfx780Iol7J^3}4Qw;zW7 zay}s%&w|WiF$=SFELTz{leowXv-6i3ZW3L;jsZiUOjH_a&SaMcerZubO3zJD-n*B` zGPq`}QKjF6(H+Mj-ZBkHBgtJmzW%QNp2ZEPGM(<^%q&O91UIUSB!x58sTpLXcnD@{ zTV`nX3ECX_`>i0)je|9J z%_W>>*CIQ1tFVaTE1HKm{3NicHP@ZGmwxBo**q{39ZrD~nEf-PHo@t!Zm&zJBy)F^ zb5>GVLZO$ri3W=y)+TaN$gZ2T*vkjhSM|cs*A76_Zl%$#mpdd5PO`XDlfUBGacAD< zu^bNcyklyUvSl>$o&kPoijG_nQQp-U&vj}2J<;@}m^RZ*Q*vIRT)EVNC|l6=D}(l= zrh5s!H;fKX zgd%^;b~{*enQ&anujJ&nnInY9+{)2?YMmk>wTK6zMV2#e#g&|PfOC5`YzIfP%$ofs zb31lx?IqWiCl%Z)Ehc*n({lyoJvBti)`Gem7Mvn_CfPwr@;34pN6QP~b{!TLi=ulk zZ`*3Rm0Wa9?|hHer1Nb1az$Rfugaa&(MC918r2y;CI+6l*=giSZTGT~`0f_s8>`ix z*H5^afO6*$()U(tgOK}}Fnzadb7RzVV}z@h!i}E{VJ^qlUh-1fWKs2MK(efi(>H}{ z3w~1`r_0`ztsIltZD!NfoMm?FfJhHqRNA@D6ZE2>Wu=1ot#Y2IN{0$O*MPiR9eU$v z!g0x?WUgR#?@#-rzmu5KlI_Mr8L2ZewjiaZbAZd|a|&u)Pg*PJXvnzOw0Cy<_8oTX zOEG!j|ICOrYgcDX0Z*6Y4<69|V%#`;q$p0%Oq+c~Wl{m3XzGXy?5Xb#xa4&6q;+}W z7mc^9CSb?$Cc9T_C3=^#zD6-kdYp8jHcn3Kb5%T`rt@x0_eohtSsP+AT#|~$G!clN z9u|M>;^}O(TsqZH?VjE>F*!3Mi6l07GPy0am_wwOY$GT~c79DeAdxQ;L}l<2BNZ)$ zv1-W@cjiVWoo_Cg(5c~eo;F*SRA;Hvz37{5n3WkFJ639=qNxV01>>TlV*g{>d#?~X zl=#2M_3tRtYuouX4`)j~QvGH#OuLLgyli+*U_x}#Q1YQIVf+n~GoC@T5 z{XYjU2QLF{Fbw25fD^%cu=n2tt_05p4`Sv z_WlFli{Oo5KX?}SPi+0SfmeWOAo=~jz|Q|Ga241M&H>+t#&?42fzbOpkbVg#^m-Y0 zkbT0V5Y>X9ncvV~9xdw!7b`hQJ0%z^Z%41FUr|qDs-2xk5l%<#JV@mYo1A$3XA+4o zwt29(H6}_z@2+`}KNUvr?4oxaS4s|<%oCD0dU0fs%#JTUl||R}{G@9j{hmpi&oq>| z(_hR#!9nmu4a}*lZdnTnQ^Mqg{Jk0;pBSz_r zW*?ljE()A7sN!5s-RQ5F&}kJiGun>L*nQ%q9TDd9u^zZ_Q6f6{bv<-qmC1+nxQXX@ zMc%vTS;@`lpB-^74P{alY%WYoK2ODeQ=g>vd*>R_QF|X z`&pz9m}mR4ud-oQ7y=n866UhDb;qXZUcE|gM6Jj^JKJ)Gu3i12aWlwV;VOO_E6YrF^5=}oiOgW7O?IpH1Y~EP z^=HVk356v-rWGC=ijZNYzaJwiwvq&!Is#SVv6ttECFv?}eU90#)@F5}6fwm8k|D?t z{);3QrN@^NGBTI$rRW)$(N%l-n9_4zU4o}eK7>fj7IDDqNQ`bE8-&SBHr)Y~Ky={F zG#9m7AdZR%#STaWHamGC)-eDDNtFEqFVEQ52wbAZrg4CKKH z;M@2C?gd3~AsD;{6c|w8|2qXlSXt-0wgE)}&_9*Y_l7yXvxR?cKiwgt=si9&jGjYJ z37A#x|1ZrTl};$>aEWYmgx0=FgrD3U{P@VR+@={v=-|gkbS^{2foq(#$K#$H{P>8c zj~D(7ete|X`i=SVk<_n;%;j|cBR{f)oo+viJ&-D*#Q&lOKUkt-W)`OYE&Rcf Date: Tue, 25 Feb 2025 01:34:20 +0000 Subject: [PATCH 05/20] added data injection pattern --- nilai-api/src/nilai_api/routers/private.py | 45 +++++++++++++++++---- nilai-api/src/nilai_api/vault.py | 46 ++++++++++++++++++++++ 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index a4876a4f..2c95f60e 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -208,7 +208,7 @@ async def chat_completion( logger.info(f"EXTRA INFO: {req}") logger.info(f"VAULT INFO: {req.secret_vault}") - if req.secret_vault: + if req.secret_vault and (schema_uuid := req.secret_vault.get("inject_from")): """ Endpoint activated with SecretVault support 1. Test connectivity and pull schema definition @@ -220,9 +220,40 @@ async def chat_completion( 4b. ... if schema includes encrypted values, mutate payload to decrypt fields 4c. ... append payload to LLM query """ - # TODO: implement record injection to query - logger.info("SECRET VAULT PROCESSING REQUESTED") - pass + try: + logger.info(f"SECRET VAULT INJECTION REQUESTED ({schema_uuid})") + vault = SecretVaultHelper( + org_did=req.secret_vault.get("org_did"), + secret_key=req.secret_vault.get("secret_key"), + schema_uuid=schema_uuid, + ) + + records = vault.data_reveal(req.secret_vault.get("filter")) + formatted_results = "\n".join( + f"- {str(result)}" for result in records + ) + relevant_context = f"\n\nRelevant Context:\n{formatted_results}" + logger.info(f"SECRET VAULT INJECTION: {relevant_context}") + for message in req.messages: + if message.role == "system": + if message.content is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="system message is empty", + ) + message.content += ( + relevant_context # Append the context to the system message + ) + break + else: + # If no system message exists, add one + req.messages.insert(0, Message(role="system", content=relevant_context)) + except Exception as e: + logger.error("An error occurred within secret vault: %s", str(e)) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) + ) + if req.nilrag: """ @@ -416,13 +447,13 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: tools=req.tools, # type: ignore ) # type: ignore - if req.secret_vault: + if req.secret_vault and (schema_uuid := req.secret_vault.get("save_to")): try: logger.info("GOING TO SAVE RECORDS TO SECRET VAULT") vault = SecretVaultHelper( org_did=req.secret_vault.get("org_did"), secret_key=req.secret_vault.get("secret_key"), - schema_uuid=req.secret_vault.get("schema"), + schema_uuid=schema_uuid, ) inference_result = response.choices[0].message.content my_schema = vault.schema_definition @@ -478,7 +509,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: model_response = SignedChatCompletion( **response.model_dump(), - **({"secret_vault": vault_res} if req.secret_vault else {}), + **({"secret_vault": vault_res} if (req.secret_vault and req.secret_vault.get("save_to")) else {}), signature="", ) if model_response.usage is None: diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index b3ce5e29..eaffae14 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -1,4 +1,5 @@ from pdb import set_trace as bp +from collections import defaultdict from ecdsa import SigningKey, SECP256k1 import jwt import logging @@ -98,6 +99,51 @@ def _validator_builder(self): """Build a validator to validate the candidate document against loaded schema.""" return validators.extend(Draft7Validator) + + def data_reveal(self, filter: dict = {}) -> list[dict]: + """Get filtered data from schema on all nodes then reconstruct secret. + + Args: + dict: Optional filter paramters + + Returns: + list[dict]: A list of the downloaded records + + """ + try: + logger.info(f"fn:data_reveal | {self.schema_uuid} | filter: {filter} ") + + shares = defaultdict(list) + for node in self.nodes: + headers = { + "Authorization": f'Bearer {node["bearer"]}', + "Content-Type": "application/json", + } + + body = { + "schema": self.schema_uuid, + "filter": filter + } + + response = requests.post( + f"{node['url']}/api/v1/data/read", + headers=headers, + json=body, + ) + assert ( + response.status_code == 200 + ), "upload failed: " + response.content.decode("utf8") + data = response.json().get("data") + for d in data: + shares[d["_id"]].append(d) + decrypted = [] + for k in shares: + decrypted.append(nilql.unify(self.key, shares[k])) + return decrypted + except Exception as e: + logger.info(f"Error retrieving records in node: {e!r}") + return [] + def post(self, data_to_store: list) -> list: """Create/upload records in the specified node and schema.""" logger.info(f"fn:data_upload {self.schema_uuid} | {data_to_store}") From 28b8b216602725c8a9d47222a8e38df8d92aa1a0 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Tue, 25 Feb 2025 22:14:37 +0000 Subject: [PATCH 06/20] added common routine for building internal chat client; make it so that the nildb save always uses a worker/tools model --- docker/compose/docker-compose.npw.llama32.yml | 3 ++ nilai-api/src/nilai_api/routers/private.py | 40 ++++++++++++++++--- nilai-api/src/nilai_api/vault.py | 4 +- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/docker/compose/docker-compose.npw.llama32.yml b/docker/compose/docker-compose.npw.llama32.yml index d5e33e6e..90314d46 100644 --- a/docker/compose/docker-compose.npw.llama32.yml +++ b/docker/compose/docker-compose.npw.llama32.yml @@ -13,6 +13,9 @@ services: device_ids: - "1" ipc: host + depends_on: + etcd: + condition: service_healthy command: - --model - meta-llama/Llama-3.2-1B-Instruct diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index 2c95f60e..2ad338cd 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -128,6 +128,24 @@ async def chat_completion_concurrent_rate_limit(request: Request) -> Tuple[int, return limit, key +async def client_builder(clientType, model_name: str): + endpoint = await state.get_model(model_name) + if endpoint is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Invalid model name {model_name}, check /v1/models for options", + ) + + if not endpoint.metadata.tool_support and req.tools: + raise HTTPException( + status_code=400, + detail="Model does not support tool usage, remove tools from request", + ) + model_url = endpoint.url + "/v1/" + + logger.info(f"Chat client built for {model_url}") + return clientType(base_url=model_url, api_key="") + @router.post("/v1/chat/completions", tags=["Chat"], response_model=None) async def chat_completion( req: ChatRequest = Body( @@ -202,7 +220,7 @@ async def chat_completion( model_url = endpoint.url + "/v1/" logger.info( - f"Chat completion request for model {model_name} from user {user.userid} on url: {model_url}" + f"Chat completion request for model {req.model} from user {user.userid}" ) logger.info(f"EXTRA INFO: {req}") @@ -388,7 +406,7 @@ async def chat_completion( ) if req.stream: - client = AsyncOpenAI(base_url=model_url, api_key="") + client = await client_builder(AsyncOpenAI, req.model) # Forwarding Streamed Responses async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: @@ -436,7 +454,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: chat_completion_stream_generator(), media_type="text/event-stream", # Ensure client interprets as Server-Sent Events ) - client = OpenAI(base_url=model_url, api_key="") + client = await client_builder(OpenAI, req.model) response = client.chat.completions.create( model=req.model, messages=req.messages, # type: ignore @@ -465,11 +483,23 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: ] max_retries = 3 attempt = 0 + tools_model = None + try: + for _model in [endpoint.metadata.dict() for endpoint in (await state.models).values()]: + if _model.get("role", "default") == "worker": + tools_model = _model["id"] + break + assert tools_model is not None, "failed to discover tools model" + except Exception: + logger.error("failed to find worker model name") + raise + _client = await client_builder(OpenAI, tools_model) while attempt < max_retries: try: - remux_res = client.chat.completions.create( - model=model_name, + remux_res = _client.chat.completions.create( + model=tools_model, messages=messages, + temperature=0.3, response_format={"type": "json_object"}, ) json_response = remux_res.choices[0].message.content diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index eaffae14..b13b35ea 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -146,14 +146,14 @@ def data_reveal(self, filter: dict = {}) -> list[dict]: def post(self, data_to_store: list) -> list: """Create/upload records in the specified node and schema.""" - logger.info(f"fn:data_upload {self.schema_uuid} | {data_to_store}") + logger.info(f"fn:data_upload {self.schema_uuid} | {type(data_to_store)} | {data_to_store}") try: builder = self._validator_builder() validator = builder(self.schema_definition) logger.info(f"fn:data_upload | got {len(data_to_store)} records") - for entry in data_to_store: + for entry in [data_to_store] if isinstance(data_to_store, dict) else data_to_store: self._mutate_secret_attributes(entry) record_uuids = [x["_id"] for x in data_to_store] From 8ba3c2c00d3874f9347e46de5731026ff946ea91 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Wed, 26 Feb 2025 22:26:03 +0000 Subject: [PATCH 07/20] added deepseek docker compose --- .../compose/docker-compose.npw.deepseek14.yml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docker/compose/docker-compose.npw.deepseek14.yml diff --git a/docker/compose/docker-compose.npw.deepseek14.yml b/docker/compose/docker-compose.npw.deepseek14.yml new file mode 100644 index 00000000..73279890 --- /dev/null +++ b/docker/compose/docker-compose.npw.deepseek14.yml @@ -0,0 +1,54 @@ +services: + deepseek_14b_gpu: + build: + context: . + dockerfile: docker/vllm.Dockerfile + deploy: + resources: + reservations: + devices: + - capabilities: + - gpu + driver: nvidia + device_ids: + - "1" + ipc: host + depends_on: + etcd: + condition: service_healthy + command: + - --model + - deepseek-ai/DeepSeek-R1-Distill-Qwen-14B + - --max-model-len + - "45000" + - --device + - cuda + - --gpu-memory-utilization + - "0.95" + env_file: + - .env + environment: + SVC_HOST: "deepseek_14b_gpu" + SVC_PORT: "8000" + ETCD_HOST: "etcd" + ETCD_PORT: "2379" + TOOL_SUPPORT: true + MODEL_ROLE: "reasoning" + networks: + - backend_net + volumes: + - type: volume + source: hugging_face_models + target: /root/.cache/huggingface + volume: {} + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + retries: 3 + start_period: 60s + timeout: 10s +volumes: + hugging_face_models: + +networks: + backend_net: From 219bafc4ed177714050dd52e74191dd1f5d3d316 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Wed, 26 Feb 2025 23:14:59 +0000 Subject: [PATCH 08/20] added jinja templates --- ...mplate_DeepSeek-R1-Distill-Llama-70B.jinja | 1 + ...ate_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja | 1 + .../tool_chat_template_llama3.1_json.jinja | 120 ++++++++++++++++ .../tool_chat_template_llama3.2_json.jinja | 133 ++++++++++++++++++ .../tool_chat_template_llama3.3_json.jinja | 110 +++++++++++++++ 5 files changed, 365 insertions(+) create mode 100644 docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja create mode 100644 docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja create mode 100644 docker/compose/tool_chat_template_llama3.1_json.jinja create mode 100644 docker/compose/tool_chat_template_llama3.2_json.jinja create mode 100644 docker/compose/tool_chat_template_llama3.3_json.jinja diff --git a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja new file mode 100644 index 00000000..f6ce34fd --- /dev/null +++ b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja @@ -0,0 +1 @@ +{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '' in content %}{% set content = content.split('')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>\n'}}{% endif %} diff --git a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja new file mode 100644 index 00000000..03b3554b --- /dev/null +++ b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja @@ -0,0 +1 @@ +{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '' in content %}{% set content = content.split('')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>'}}{% endif %} diff --git a/docker/compose/tool_chat_template_llama3.1_json.jinja b/docker/compose/tool_chat_template_llama3.1_json.jinja new file mode 100644 index 00000000..03383093 --- /dev/null +++ b/docker/compose/tool_chat_template_llama3.1_json.jinja @@ -0,0 +1,120 @@ +{{- bos_token }} +{%- if custom_tools is defined %} + {%- set tools = custom_tools %} +{%- endif %} +{%- if not tools_in_user_message is defined %} + {#- Llama 3.1 doesn't pass all tests if the tools are in the system prompt #} + {%- set tools_in_user_message = true %} +{%- endif %} +{%- if not date_string is defined %} + {%- if strftime_now is defined %} + {%- set date_string = strftime_now("%d %b %Y") %} + {%- else %} + {%- set date_string = "26 Jul 2024" %} + {%- endif %} +{%- endif %} +{%- if not tools is defined %} + {%- set tools = none %} +{%- endif %} + +{#- This block extracts the system message, so we can slot it into the right place. #} +{%- if messages[0]['role'] == 'system' %} + {%- if messages[0]['content'] is string %} + {%- set system_message = messages[0]['content']|trim %} + {%- else %} + {%- set system_message = messages[0]['content'][0]['text']|trim %} + {%- endif %} + {%- set messages = messages[1:] %} +{%- else %} + {%- if tools is not none %} + {%- set system_message = "You are a helpful assistant with tool calling capabilities. Only reply with a tool call if the function exists in the library provided by the user. If it doesn't exist, just reply directly in natural language. When you receive a tool call response, use the output to format an answer to the original user question." %} + {%- else %} + {%- set system_message = "" %} + {%- endif %} +{%- endif %} + +{#- System message #} +{{- "<|start_header_id|>system<|end_header_id|>\n\n" }} +{%- if tools is not none %} + {{- "Environment: ipython\n" }} +{%- endif %} +{{- "Cutting Knowledge Date: December 2023\n" }} +{{- "Today Date: " + date_string + "\n\n" }} +{%- if tools is not none and not tools_in_user_message %} + {{- "You have access to the following functions. To call a function, please respond with JSON for a function call. " }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}. ' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} +{%- endif %} +{{- system_message }} +{{- "<|eot_id|>" }} + +{#- Custom tools are passed in a user message with some extra guidance #} +{%- if tools_in_user_message and not tools is none %} + {#- Extract the first user message so we can plug it in here #} + {%- if messages | length != 0 %} + {%- if messages[0]['content'] is string %} + {%- set first_user_message = messages[0]['content']|trim %} + {%- else %} + {%- set first_user_message = messages[0]['content'] | selectattr('type', 'equalto', 'text') | map(attribute='text') | map('trim') | join('\n') %} + {%- endif %} + {%- set messages = messages[1:] %} + {%- else %} + {{- raise_exception("Cannot put tools in the first user message when there's no first user message!") }} + {%- endif %} + {{- '<|start_header_id|>user<|end_header_id|>\n\n' -}} + {{- "Given the following functions, please respond with a JSON for a function call " }} + {{- "with its proper arguments that best answers the given prompt.\n\n" }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}. ' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} + {{- first_user_message + "<|eot_id|>"}} +{%- endif %} + +{%- for message in messages %} + {%- if not (message.role == 'ipython' or message.role == 'tool' or 'tool_calls' in message) %} + {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' }} + {%- if message['content'] is string %} + {{- message['content'] | trim}} + {%- else %} + {%- for content in message['content'] %} + {%- if content['type'] == 'text' %} + {{- content['text'] | trim }} + {%- endif %} + {%- endfor %} + {%- endif %} + {{- '<|eot_id|>' }} + {%- elif 'tool_calls' in message %} + {%- if not message.tool_calls|length == 1 %} + {{- raise_exception("This model only supports single tool-calls at once!") }} + {%- endif %} + {%- set tool_call = message.tool_calls[0].function %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} + {{- '{"name": "' + tool_call.name + '", ' }} + {{- '"parameters": ' }} + {{- tool_call.arguments | tojson }} + {{- "}" }} + {{- "<|eot_id|>" }} + {%- elif message.role == "tool" or message.role == "ipython" %} + {{- "<|start_header_id|>ipython<|end_header_id|>\n\n" }} + {%- if message.content is string %} + {{- { "output": message.content } | tojson }} + {%- else %} + {%- for content in message['content'] %} + {%- if content['type'] == 'text' %} + {{- { "output": content['text'] } | tojson }} + {%- endif %} + {%- endfor %} + {%- endif %} + {{- "<|eot_id|>" }} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' }} +{%- endif %} diff --git a/docker/compose/tool_chat_template_llama3.2_json.jinja b/docker/compose/tool_chat_template_llama3.2_json.jinja new file mode 100644 index 00000000..2b290c0e --- /dev/null +++ b/docker/compose/tool_chat_template_llama3.2_json.jinja @@ -0,0 +1,133 @@ +{{- bos_token }} +{%- if custom_tools is defined %} + {%- set tools = custom_tools %} +{%- endif %} +{%- if not tools_in_user_message is defined %} + {%- set tools_in_user_message = false %} +{%- endif %} +{%- if not date_string is defined %} + {%- if strftime_now is defined %} + {%- set date_string = strftime_now("%d %b %Y") %} + {%- else %} + {%- set date_string = "26 Jul 2024" %} + {%- endif %} +{%- endif %} +{%- if not tools is defined %} + {%- set tools = none %} +{%- endif %} + +{#- Find out if there are any images #} +{% set image_ns = namespace(has_images=false) %} +{%- for message in messages %} + {%- for content in message['content'] %} + {%- if content['type'] == 'image' %} + {%- set image_ns.has_images = true %} + {%- endif %} + {%- endfor %} +{%- endfor %} + +{#- This block extracts the system message, so we can slot it into the right place. #} +{%- if messages[0]['role'] == 'system' %} + {%- if messages[0]['content'] is string %} + {%- set system_message = messages[0]['content']|trim %} + {%- else %} + {%- set system_message = messages[0]['content'][0]['text']|trim %} + {%- endif %} + {%- set messages = messages[1:] %} +{%- else %} + {%- if tools is not none %} + {%- set system_message = "You are a helpful assistant with tool calling capabilities. Only reply with a tool call if the function exists in the library provided by the user. If it doesn't exist, just reply directly in natural language. When you receive a tool call response, use the output to format an answer to the original user question." %} + {%- else %} + {%- set system_message = "" %} + {%- endif %} +{%- endif %} + +{#- System message if there are no images, if the user supplied one, or if tools are used (default tool system message) #} +{%- if system_message or not image_ns.has_images %} + {{- "<|start_header_id|>system<|end_header_id|>\n\n" }} + {%- if tools is not none %} + {{- "Environment: ipython\n" }} + {%- endif %} + {{- "Cutting Knowledge Date: December 2023\n" }} + {{- "Today Date: " + date_string + "\n\n" }} + {%- if tools is not none and not tools_in_user_message %} + {{- "You have access to the following functions. To call a function, please respond with JSON for a function call. " }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}. ' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} + {%- endif %} + {{- system_message }} + {{- "<|eot_id|>" }} +{%- endif %} + +{#- Custom tools are passed in a user message with some extra guidance #} +{%- if tools_in_user_message and not tools is none %} + {#- Extract the first user message so we can plug it in here #} + {%- if messages | length != 0 %} + {%- if messages[0]['content'] is string %} + {%- set first_user_message = messages[0]['content']|trim %} + {%- else %} + {%- set first_user_message = messages[0]['content'] | selectattr('type', 'equalto', 'text') | map(attribute='text') | map('trim') | join('\n') %} + {%- endif %} + {%- set messages = messages[1:] %} + {%- else %} + {{- raise_exception("Cannot put tools in the first user message when there's no first user message!") }} + {%- endif %} + {{- '<|start_header_id|>user<|end_header_id|>\n\n' -}} + {{- "Given the following functions, please respond with a JSON for a function call " }} + {{- "with its proper arguments that best answers the given prompt.\n\n" }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}. ' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} + {{- first_user_message + "<|eot_id|>"}} +{%- endif %} + +{%- for message in messages %} + {%- if not (message.role == 'ipython' or message.role == 'tool' or 'tool_calls' in message) %} + {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' }} + {%- if message['content'] is string %} + {{- message['content'] | trim}} + {%- else %} + {%- for content in message['content'] %} + {%- if content['type'] == 'image' %} + {{- '<|image|>' }} + {%- elif content['type'] == 'text' %} + {{- content['text'] | trim }} + {%- endif %} + {%- endfor %} + {%- endif %} + {{- '<|eot_id|>' }} + {%- elif 'tool_calls' in message %} + {%- if not message.tool_calls|length == 1 %} + {{- raise_exception("This model only supports single tool-calls at once!") }} + {%- endif %} + {%- set tool_call = message.tool_calls[0].function %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} + {{- '{"name": "' + tool_call.name + '", ' }} + {{- '"parameters": ' }} + {{- tool_call.arguments | tojson }} + {{- "}" }} + {{- "<|eot_id|>" }} + {%- elif message.role == "tool" or message.role == "ipython" %} + {{- "<|start_header_id|>ipython<|end_header_id|>\n\n" }} + {%- if message.content is string %} + {{- { "output": message.content } | tojson }} + {%- else %} + {%- for content in message['content'] %} + {%- if content['type'] == 'text' %} + {{- { "output": content['text'] } | tojson }} + {%- endif %} + {%- endfor %} + {%- endif %} + {{- "<|eot_id|>" }} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' }} +{%- endif %} diff --git a/docker/compose/tool_chat_template_llama3.3_json.jinja b/docker/compose/tool_chat_template_llama3.3_json.jinja new file mode 100644 index 00000000..e70a3896 --- /dev/null +++ b/docker/compose/tool_chat_template_llama3.3_json.jinja @@ -0,0 +1,110 @@ +{{- bos_token }} +{%- if custom_tools is defined %} + {%- set tools = custom_tools %} +{%- endif %} +{%- if not tools_in_user_message is defined %} + {%- set tools_in_user_message = true %} +{%- endif %} +{%- if not date_string is defined %} + {%- set date_string = "26 Jul 2024" %} +{%- endif %} +{%- if not tools is defined %} + {%- set tools = none %} +{%- endif %} + +{#- This block extracts the system message, so we can slot it into the right place. #} +{%- if messages[0]['role'] == 'system' %} + {%- set system_message = messages[0]['content']|trim %} + {%- set messages = messages[1:] %} +{%- else %} + {%- set system_message = "" %} +{%- endif %} + +{#- System message + builtin tools #} +{{- "<|start_header_id|>system<|end_header_id|>\n\n" }} +{%- if builtin_tools is defined or tools is not none %} + {{- "Environment: ipython\n" }} +{%- endif %} +{%- if builtin_tools is defined %} + {{- "Tools: " + builtin_tools | reject('equalto', 'code_interpreter') | join(", ") + "\n\n"}} +{%- endif %} +{{- "Cutting Knowledge Date: December 2023\n" }} +{{- "Today Date: " + date_string + "\n\n" }} +{%- if tools is not none and not tools_in_user_message %} + {{- "You have access to the following functions. To call a function, please respond with JSON for a function call." }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}.' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} +{%- endif %} +{{- system_message }} +{{- "<|eot_id|>" }} + +{#- Custom tools are passed in a user message with some extra guidance #} +{%- if tools_in_user_message and not tools is none %} + {#- Extract the first user message so we can plug it in here #} + {%- if messages | length != 0 %} + {%- set first_user_message = messages[0]['content']|trim %} + {%- set messages = messages[1:] %} + {%- else %} + {{- raise_exception("Cannot put tools in the first user message when there's no first user message!") }} +{%- endif %} + {{- '<|start_header_id|>user<|end_header_id|>\n\n' -}} + {{- "Given the following functions, please respond with a JSON for a function call " }} + {{- "with its proper arguments that best answers the given prompt.\n\n" }} + {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}.' }} + {{- "Do not use variables.\n\n" }} + {%- for t in tools %} + {{- t | tojson(indent=4) }} + {{- "\n\n" }} + {%- endfor %} + {{- first_user_message + "<|eot_id|>"}} +{%- endif %} + +{%- for message in messages %} + {%- if not (message.role == 'ipython' or message.role == 'tool' or 'tool_calls' in message) %} + {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'+ message['content'] | trim + '<|eot_id|>' }} + {%- elif 'tool_calls' in message %} + {%- if not message.tool_calls|length == 1 %} + {{- raise_exception("This model only supports single tool-calls at once!") }} + {%- endif %} + {%- set tool_call = message.tool_calls[0].function %} + {%- if builtin_tools is defined and tool_call.name in builtin_tools %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} + {{- "<|python_tag|>" + tool_call.name + ".call(" }} + {%- for arg_name, arg_val in tool_call.arguments | items %} + {{- arg_name + '="' + arg_val + '"' }} + {%- if not loop.last %} + {{- ", " }} + {%- endif %} + {%- endfor %} + {{- ")" }} + {%- else %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} + {{- '{"name": "' + tool_call.name + '", ' }} + {{- '"parameters": ' }} + {{- tool_call.arguments | tojson }} + {{- "}" }} + {%- endif %} + {%- if builtin_tools is defined %} + {#- This means we're in ipython mode #} + {{- "<|eom_id|>" }} + {%- else %} + {{- "<|eot_id|>" }} + {%- endif %} + {%- elif message.role == "tool" or message.role == "ipython" %} + {{- "<|start_header_id|>ipython<|end_header_id|>\n\n" }} + {%- if message.content is mapping or message.content is iterable %} + {{- message.content | tojson }} + {%- else %} + {{- message.content }} + {%- endif %} + {{- "<|eot_id|>" }} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' }} +{%- endif %} + From 159cc3e09156aefc47f7ff7f066c67a393e36b73 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 28 Feb 2025 17:27:50 +0000 Subject: [PATCH 09/20] lint fixes --- nilai-api/src/nilai_api/config/mainnet.py | 1 - nilai-api/src/nilai_api/routers/private.py | 66 +++++++++++++--------- nilai-api/src/nilai_api/vault.py | 36 ++++++------ 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/nilai-api/src/nilai_api/config/mainnet.py b/nilai-api/src/nilai_api/config/mainnet.py index 791ee4aa..3772bff2 100644 --- a/nilai-api/src/nilai_api/config/mainnet.py +++ b/nilai-api/src/nilai_api/config/mainnet.py @@ -8,7 +8,6 @@ "meta-llama/Llama-3.2-3B-Instruct": 30, "meta-llama/Llama-3.1-8B-Instruct": 15, "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": 5, - "meta-llama/Llama-3.2-1B-Instruct": 10, "watt-ai/watt-tool-8B": 10, } diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index 2ad338cd..35257ba8 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -5,7 +5,6 @@ from base64 import b64encode from typing import AsyncGenerator, Union, List, Tuple import numpy as np -import uuid import json from jsonschema.exceptions import ValidationError @@ -128,7 +127,7 @@ async def chat_completion_concurrent_rate_limit(request: Request) -> Tuple[int, return limit, key -async def client_builder(clientType, model_name: str): +async def client_builder(clientType, model_name: str, req: ChatRequest): endpoint = await state.get_model(model_name) if endpoint is None: raise HTTPException( @@ -142,9 +141,10 @@ async def client_builder(clientType, model_name: str): detail="Model does not support tool usage, remove tools from request", ) model_url = endpoint.url + "/v1/" - + logger.info(f"Chat client built for {model_url}") - return clientType(base_url=model_url, api_key="") + return clientType(base_url=model_url, api_key="") + @router.post("/v1/chat/completions", tags=["Chat"], response_model=None) async def chat_completion( @@ -204,12 +204,11 @@ async def chat_completion( response = await chat_completion(request, user) """ - model_name = req.model - endpoint = await state.get_model(model_name) + endpoint = await state.get_model(req.model) if endpoint is None: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Invalid model name {model_name}, check /v1/models for options", + detail=f"Invalid model name {req.model}, check /v1/models for options", ) if not endpoint.metadata.tool_support and req.tools: @@ -217,7 +216,6 @@ async def chat_completion( status_code=400, detail="Model does not support tool usage, remove tools from request", ) - model_url = endpoint.url + "/v1/" logger.info( f"Chat completion request for model {req.model} from user {user.userid}" @@ -245,11 +243,9 @@ async def chat_completion( secret_key=req.secret_vault.get("secret_key"), schema_uuid=schema_uuid, ) - + records = vault.data_reveal(req.secret_vault.get("filter")) - formatted_results = "\n".join( - f"- {str(result)}" for result in records - ) + formatted_results = "\n".join(f"- {str(result)}" for result in records) relevant_context = f"\n\nRelevant Context:\n{formatted_results}" logger.info(f"SECRET VAULT INJECTION: {relevant_context}") for message in req.messages: @@ -271,7 +267,6 @@ async def chat_completion( raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) ) - if req.nilrag: """ @@ -406,7 +401,7 @@ async def chat_completion( ) if req.stream: - client = await client_builder(AsyncOpenAI, req.model) + client = await client_builder(AsyncOpenAI, req.model, req) # Forwarding Streamed Responses async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: @@ -454,7 +449,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: chat_completion_stream_generator(), media_type="text/event-stream", # Ensure client interprets as Server-Sent Events ) - client = await client_builder(OpenAI, req.model) + client = await client_builder(OpenAI, req.model, req) response = client.chat.completions.create( model=req.model, messages=req.messages, # type: ignore @@ -475,17 +470,23 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: ) inference_result = response.choices[0].message.content my_schema = vault.schema_definition - if '$schema' in my_schema: + if "$schema" in my_schema: del my_schema["$schema"] messages = [ - {"role": "system", "content": f"Output only minimal JSON according to this jsonschema: {json.dumps(vault.schema_definition)}"}, - {"role": "user", "content": inference_result } + { + "role": "system", + "content": f"Output only minimal JSON according to this jsonschema: {json.dumps(vault.schema_definition)}", + }, + {"role": "user", "content": inference_result}, ] max_retries = 3 attempt = 0 tools_model = None try: - for _model in [endpoint.metadata.dict() for endpoint in (await state.models).values()]: + for _model in [ + endpoint.metadata.dict() + for endpoint in (await state.models).values() + ]: if _model.get("role", "default") == "worker": tools_model = _model["id"] break @@ -493,7 +494,7 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: except Exception: logger.error("failed to find worker model name") raise - _client = await client_builder(OpenAI, tools_model) + _client = await client_builder(OpenAI, tools_model, req) while attempt < max_retries: try: remux_res = _client.chat.completions.create( @@ -523,13 +524,20 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: except (json.JSONDecodeError, ValidationError) as e: attempt += 1 if attempt == max_retries: - raise Exception(f"Failed to get valid response after {max_retries} attempts. Last error: {str(e)}") - + raise Exception( + f"Failed to get valid response after {max_retries} attempts. Last error: {str(e)}" + ) + # Add the failed attempt and error to the conversation - messages.extend([ - {"role": "assistant", "content": json_response}, - {"role": "user", "content": f"{str(e)}. Try again, ensuring the response exactly matches the schema. Format dates like: 2025-02-24T15:30:00Z"} - ]) + messages.extend( + [ + {"role": "assistant", "content": json_response}, + { + "role": "user", + "content": f"{str(e)}. Try again, ensuring the response exactly matches the schema. Format dates like: 2025-02-24T15:30:00Z", + }, + ] + ) print(f"Attempt {attempt} failed: {str(e)}. Retrying...") except Exception as e: logger.error("An error occurred within secret vault: %s", str(e)) @@ -539,7 +547,11 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: model_response = SignedChatCompletion( **response.model_dump(), - **({"secret_vault": vault_res} if (req.secret_vault and req.secret_vault.get("save_to")) else {}), + **( + {"secret_vault": vault_res} + if (req.secret_vault and req.secret_vault.get("save_to")) + else {} + ), signature="", ) if model_response.usage is None: diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index b13b35ea..facf7799 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -1,4 +1,3 @@ -from pdb import set_trace as bp from collections import defaultdict from ecdsa import SigningKey, SECP256k1 import jwt @@ -14,6 +13,7 @@ logger = logging.getLogger(__name__) + class SecretVaultHelper: def __init__(self, org_did: str, secret_key: str, schema_uuid: str): """Initialize config with JWTs signed with ES256K for multiple node_ids; Add cluster key.""" @@ -50,12 +50,14 @@ def __init__(self, org_did: str, secret_key: str, schema_uuid: str): self.schema_list = self.fetch_schemas() self.schema_definition = self.find_schema(schema_uuid) self.schema_uuid = schema_uuid - logger.info(f"fn:data_upload init complete: {len(self.nodes)} nodes | schema {schema_uuid}") + logger.info( + f"fn:data_upload init complete: {len(self.nodes)} nodes | schema {schema_uuid}" + ) def fetch_schemas(self) -> list: """Get all my schemas from the first server.""" headers = { - "Authorization": f'Bearer {self.nodes[0]["bearer"]}', + "Authorization": f"Bearer {self.nodes[0]['bearer']}", "Content-Type": "application/json", } @@ -99,7 +101,6 @@ def _validator_builder(self): """Build a validator to validate the candidate document against loaded schema.""" return validators.extend(Draft7Validator) - def data_reveal(self, filter: dict = {}) -> list[dict]: """Get filtered data from schema on all nodes then reconstruct secret. @@ -116,23 +117,20 @@ def data_reveal(self, filter: dict = {}) -> list[dict]: shares = defaultdict(list) for node in self.nodes: headers = { - "Authorization": f'Bearer {node["bearer"]}', + "Authorization": f"Bearer {node['bearer']}", "Content-Type": "application/json", } - body = { - "schema": self.schema_uuid, - "filter": filter - } + body = {"schema": self.schema_uuid, "filter": filter} response = requests.post( f"{node['url']}/api/v1/data/read", headers=headers, json=body, ) - assert ( - response.status_code == 200 - ), "upload failed: " + response.content.decode("utf8") + assert response.status_code == 200, ( + "upload failed: " + response.content.decode("utf8") + ) data = response.json().get("data") for d in data: shares[d["_id"]].append(d) @@ -146,14 +144,17 @@ def data_reveal(self, filter: dict = {}) -> list[dict]: def post(self, data_to_store: list) -> list: """Create/upload records in the specified node and schema.""" - logger.info(f"fn:data_upload {self.schema_uuid} | {type(data_to_store)} | {data_to_store}") + logger.info( + f"fn:data_upload {self.schema_uuid} | {type(data_to_store)} | {data_to_store}" + ) try: - builder = self._validator_builder() validator = builder(self.schema_definition) logger.info(f"fn:data_upload | got {len(data_to_store)} records") - for entry in [data_to_store] if isinstance(data_to_store, dict) else data_to_store: + for entry in ( + [data_to_store] if isinstance(data_to_store, dict) else data_to_store + ): self._mutate_secret_attributes(entry) record_uuids = [x["_id"] for x in data_to_store] @@ -161,12 +162,11 @@ def post(self, data_to_store: list) -> list: logger.info(f"fn:data_upload {payloads}") for idx, shard in enumerate(payloads): - validator.validate(shard) node = self.nodes[idx] headers = { - "Authorization": f'Bearer {node["bearer"]}', + "Authorization": f"Bearer {node['bearer']}", "Content-Type": "application/json", } @@ -186,7 +186,7 @@ def post(self, data_to_store: list) -> list: logger.info(f"fn:data_upload COMPLETED: {record_uuids}") return record_uuids except Exception as e: - msg = ''.join(traceback.format_tb(e.__traceback__, limit=3)) + msg = "".join(traceback.format_tb(e.__traceback__, limit=3)) logger.info(f"Error creating records in node: {msg}") raise ValidationError(f"{e!r}") From 160cc7f746be390823d5d2bf940f135d6b089143 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 3 Mar 2025 00:00:19 +0000 Subject: [PATCH 10/20] added healthcheck for watt; use lower resources; absolute file locations for templates --- .../compose/docker-compose.npw.deepseek14.yml | 8 ++++---- docker/compose/docker-compose.npw.llama32.yml | 10 +++++----- docker/compose/docker-compose.npw.watt.yml | 17 ++++++++++++----- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/docker/compose/docker-compose.npw.deepseek14.yml b/docker/compose/docker-compose.npw.deepseek14.yml index 73279890..9b3174b2 100644 --- a/docker/compose/docker-compose.npw.deepseek14.yml +++ b/docker/compose/docker-compose.npw.deepseek14.yml @@ -10,21 +10,21 @@ services: - capabilities: - gpu driver: nvidia - device_ids: - - "1" ipc: host depends_on: etcd: condition: service_healthy + watt_tool_gpu: + condition: service_healthy command: - --model - deepseek-ai/DeepSeek-R1-Distill-Qwen-14B - --max-model-len - - "45000" + - "10000" - --device - cuda - --gpu-memory-utilization - - "0.95" + - "0.45" env_file: - .env environment: diff --git a/docker/compose/docker-compose.npw.llama32.yml b/docker/compose/docker-compose.npw.llama32.yml index 90314d46..ac57b9da 100644 --- a/docker/compose/docker-compose.npw.llama32.yml +++ b/docker/compose/docker-compose.npw.llama32.yml @@ -10,21 +10,21 @@ services: - capabilities: - gpu driver: nvidia - device_ids: - - "1" ipc: host depends_on: etcd: condition: service_healthy + watt_tool_gpu: + condition: service_healthy command: - --model - meta-llama/Llama-3.2-1B-Instruct - --max-model-len - - "65536" + - "10000" - --device - cuda - --gpu-memory-utilization - - "0.95" + - "0.45" - --enable-auto-tool-choice - --tool-call-parser - llama3_json @@ -47,7 +47,7 @@ services: target: /root/.cache/huggingface volume: {} - type: bind - source: /home/niko/tool_chat_template_llama3.2_json.jinja + source: $PWD/docker/compose/tool_chat_template_llama3.2_json.jinja target: /tmp/tool_chat_template.jinja bind: create_host_path: true diff --git a/docker/compose/docker-compose.npw.watt.yml b/docker/compose/docker-compose.npw.watt.yml index b501a1cb..7cdb67c0 100644 --- a/docker/compose/docker-compose.npw.watt.yml +++ b/docker/compose/docker-compose.npw.watt.yml @@ -10,18 +10,19 @@ services: - capabilities: - gpu driver: nvidia - device_ids: - - "0" ipc: host + depends_on: + etcd: + condition: service_healthy command: - --model - watt-ai/watt-tool-8B - --max-model-len - - "65536" + - "10000" - --device - cuda - --gpu-memory-utilization - - "0.95" + - "0.45" - --enable-auto-tool-choice - --tool-call-parser - llama3_json @@ -44,10 +45,16 @@ services: target: /root/.cache/huggingface volume: {} - type: bind - source: /home/niko/tool_chat_template_llama3.1_json.jinja + source: $PWD/docker/compose/tool_chat_template_llama3.1_json.jinja target: /tmp/tool_chat_template.jinja bind: create_host_path: true + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + retries: 3 + start_period: 60s + timeout: 10s volumes: hugging_face_models: From 3987c5fece7500d919f01ba0033704603f7d0f2d Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Wed, 5 Mar 2025 07:49:26 -0800 Subject: [PATCH 11/20] PR review changes --- caddy/Caddyfile | 2 +- docker-compose.dev.yml | 3 --- docker-compose.yml | 7 +++++++ ....llama32.yml => docker-compose.llama-1b-gpu.yml} | 0 ....npw.watt.yml => docker-compose.watt-8b-gpu.yml} | 0 ...hat_template_DeepSeek-R1-Distill-Llama-70B.jinja | 1 - ..._template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja | 1 - nilai-api/src/nilai_api/routers/private.py | 13 ------------- 8 files changed, 8 insertions(+), 19 deletions(-) rename docker/compose/{docker-compose.npw.llama32.yml => docker-compose.llama-1b-gpu.yml} (100%) rename docker/compose/{docker-compose.npw.watt.yml => docker-compose.watt-8b-gpu.yml} (100%) delete mode 100644 docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja delete mode 100644 docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja diff --git a/caddy/Caddyfile b/caddy/Caddyfile index 4d195558..28108d27 100644 --- a/caddy/Caddyfile +++ b/caddy/Caddyfile @@ -4,7 +4,7 @@ } } - https://npw.nilai.sandbox.nilogy.xyz { + https://nilai.sandbox.nilogy.xyz { import ssl_config reverse_proxy api:8443 } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index b59c9133..b8d2e3bb 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,9 +3,6 @@ services: privileged: true volumes: - /dev/sev-guest:/dev/sev-guest # for AMD SEV - - $PWD/packages:/app/packages:ro - - $PWD/nilai-models:/app/nilai-models:ro - - $PWD/nilai-api:/app/nilai-api # this will drop a lockfile networks: - proxy_net redis: diff --git a/docker-compose.yml b/docker-compose.yml index b76879e0..3aff51c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -113,6 +113,13 @@ services: condition: service_healthy postgres: condition: service_healthy + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] restart: unless-stopped networks: - frontend_net diff --git a/docker/compose/docker-compose.npw.llama32.yml b/docker/compose/docker-compose.llama-1b-gpu.yml similarity index 100% rename from docker/compose/docker-compose.npw.llama32.yml rename to docker/compose/docker-compose.llama-1b-gpu.yml diff --git a/docker/compose/docker-compose.npw.watt.yml b/docker/compose/docker-compose.watt-8b-gpu.yml similarity index 100% rename from docker/compose/docker-compose.npw.watt.yml rename to docker/compose/docker-compose.watt-8b-gpu.yml diff --git a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja deleted file mode 100644 index f6ce34fd..00000000 --- a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Llama-70B.jinja +++ /dev/null @@ -1 +0,0 @@ -{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '' in content %}{% set content = content.split('')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>\n'}}{% endif %} diff --git a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja b/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja deleted file mode 100644 index 03b3554b..00000000 --- a/docker/compose/tool_chat_template_DeepSeek-R1-Distill-Qwen-32B-AWQ.jinja +++ /dev/null @@ -1 +0,0 @@ -{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '' in content %}{% set content = content.split('')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>'}}{% endif %} diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index 35257ba8..c4f4a33f 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -204,19 +204,6 @@ async def chat_completion( response = await chat_completion(request, user) """ - endpoint = await state.get_model(req.model) - if endpoint is None: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Invalid model name {req.model}, check /v1/models for options", - ) - - if not endpoint.metadata.tool_support and req.tools: - raise HTTPException( - status_code=400, - detail="Model does not support tool usage, remove tools from request", - ) - logger.info( f"Chat completion request for model {req.model} from user {user.userid}" ) From 30ae379155107f3778ffa530fea0a82da4abdb11 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 14 Mar 2025 05:06:24 +0000 Subject: [PATCH 12/20] saving off experimental changes --- caddy/Caddyfile | 2 +- docker/api.Dockerfile | 3 +- .../docker-compose.deepseek-14b-gpu.yml | 1 + docker/compose/docker-compose.watt-8b-gpu.yml | 4 +- nilai-api/pyproject.toml | 6 +- packages/verifier/pyproject.toml | 2 +- uv.lock | 2804 ----------------- 7 files changed, 10 insertions(+), 2812 deletions(-) delete mode 100644 uv.lock diff --git a/caddy/Caddyfile b/caddy/Caddyfile index 28108d27..35b87c11 100644 --- a/caddy/Caddyfile +++ b/caddy/Caddyfile @@ -4,7 +4,7 @@ } } - https://nilai.sandbox.nilogy.xyz { + https://npw.tee.nilai.sandbox.nilogy.xyz { import ssl_config reverse_proxy api:8443 } diff --git a/docker/api.Dockerfile b/docker/api.Dockerfile index 579783ea..57349cb8 100644 --- a/docker/api.Dockerfile +++ b/docker/api.Dockerfile @@ -18,9 +18,10 @@ apt-get install build-essential curl git -y && \ apt-get clean && \ apt-get autoremove && \ rm -rf /var/lib/apt/lists/* && \ -pip install uv && \ +pip install --upgrade uv && \ uv sync + EXPOSE 8080 8443 CMD ["./launch.sh"] diff --git a/docker/compose/docker-compose.deepseek-14b-gpu.yml b/docker/compose/docker-compose.deepseek-14b-gpu.yml index ca59872f..6da69411 100644 --- a/docker/compose/docker-compose.deepseek-14b-gpu.yml +++ b/docker/compose/docker-compose.deepseek-14b-gpu.yml @@ -31,6 +31,7 @@ services: - ETCD_HOST=etcd - ETCD_PORT=2379 - TOOL_SUPPORT=false + - MODEL_ROLE: "reasoning" volumes: - hugging_face_models:/root/.cache/huggingface # cache models networks: diff --git a/docker/compose/docker-compose.watt-8b-gpu.yml b/docker/compose/docker-compose.watt-8b-gpu.yml index 7cdb67c0..27503f1d 100644 --- a/docker/compose/docker-compose.watt-8b-gpu.yml +++ b/docker/compose/docker-compose.watt-8b-gpu.yml @@ -52,8 +52,8 @@ services: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s - retries: 3 - start_period: 60s + retries: 4 + start_period: 180s timeout: 10s volumes: hugging_face_models: diff --git a/nilai-api/pyproject.toml b/nilai-api/pyproject.toml index 1dd25f14..479000b2 100644 --- a/nilai-api/pyproject.toml +++ b/nilai-api/pyproject.toml @@ -12,7 +12,7 @@ requires-python = ">=3.12" dependencies = [ "accelerate>=1.1.1", "alembic>=1.14.1", - "cryptography>=43.0.1", + "cryptography>=3.4.0", "fastapi[standard]>=0.115.5", "gunicorn>=23.0.0", "nilai-common", @@ -21,7 +21,7 @@ dependencies = [ "sqlalchemy>=2.0.36", "uvicorn>=0.32.1", "httpx>=0.27.2", - "nilrag @ git+https://github.com/wwwehr/nilrag.git@patch-1", + "nilrag>=0.1.3", "openai>=1.59.9", "pg8000>=1.31.2", "prometheus_fastapi_instrumentator>=7.0.2", @@ -34,7 +34,7 @@ dependencies = [ "pyjwt>=2.10.1", "jsonschema>=4.23.0", "requests>=2.32.3", - "nilql>=0.0.0a10", + "nilql==0.0.0a12", "ecdsa>=0.19.0", ] diff --git a/packages/verifier/pyproject.toml b/packages/verifier/pyproject.toml index a51094c5..fb16489f 100644 --- a/packages/verifier/pyproject.toml +++ b/packages/verifier/pyproject.toml @@ -21,7 +21,7 @@ keywords = [ "verifier" ] dependencies = [ - 'cryptography == 43.0.1', + 'cryptography == 3.4', 'ecdsa >= 0.19.0', 'lxml >= 4.9.1', 'signxml == 3.2.0', diff --git a/uv.lock b/uv.lock deleted file mode 100644 index dd8b35d7..00000000 --- a/uv.lock +++ /dev/null @@ -1,2804 +0,0 @@ -version = 1 -revision = 1 -requires-python = ">=3.12" - -[manifest] -members = [ - "nilai", - "nilai-api", - "nilai-common", - "nilai-models", - "verifier", -] - -[[package]] -name = "accelerate" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyyaml" }, - { name = "safetensors" }, - { name = "torch" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8f/02/24a4c4edb9cf0f1e0bc32bb6829e2138f1cc201442e7a24f0daf93b8a15a/accelerate-1.4.0.tar.gz", hash = "sha256:37d413e1b64cb8681ccd2908ae211cf73e13e6e636a2f598a96eccaa538773a5", size = 348745 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/f6/791b9d7eb371a2f385da3b7f1769ced72ead7bf09744637ea2985c83d7ee/accelerate-1.4.0-py3-none-any.whl", hash = "sha256:f6e1e7dfaf9d799a20a1dc45efbf4b1546163eac133faa5acd0d89177c896e55", size = 342129 }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/07/508f9ebba367fc3370162e53a3cfd12f5652ad79f0e0bfdf9f9847c6f159/aiohappyeyeballs-2.4.6.tar.gz", hash = "sha256:9b05052f9042985d32ecbe4b59a77ae19c006a78f1344d7fdad69d28ded3d0b0", size = 21726 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/4c/03fb05f56551828ec67ceb3665e5dc51638042d204983a03b0a1541475b6/aiohappyeyeballs-2.4.6-py3-none-any.whl", hash = "sha256:147ec992cf873d74f5062644332c539fcd42956dc69453fe5204195e560517e1", size = 14543 }, -] - -[[package]] -name = "aiohttp" -version = "3.11.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/37/4b/952d49c73084fb790cb5c6ead50848c8e96b4980ad806cf4d2ad341eaa03/aiohttp-3.11.12.tar.gz", hash = "sha256:7603ca26d75b1b86160ce1bbe2787a0b706e592af5b2504e12caa88a217767b0", size = 7673175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/d0/94346961acb476569fca9a644cc6f9a02f97ef75961a6b8d2b35279b8d1f/aiohttp-3.11.12-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e392804a38353900c3fd8b7cacbea5132888f7129f8e241915e90b85f00e3250", size = 704837 }, - { url = "https://files.pythonhosted.org/packages/a9/af/05c503f1cc8f97621f199ef4b8db65fb88b8bc74a26ab2adb74789507ad3/aiohttp-3.11.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8fa1510b96c08aaad49303ab11f8803787c99222288f310a62f493faf883ede1", size = 464218 }, - { url = "https://files.pythonhosted.org/packages/f2/48/b9949eb645b9bd699153a2ec48751b985e352ab3fed9d98c8115de305508/aiohttp-3.11.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc065a4285307607df3f3686363e7f8bdd0d8ab35f12226362a847731516e42c", size = 456166 }, - { url = "https://files.pythonhosted.org/packages/14/fb/980981807baecb6f54bdd38beb1bd271d9a3a786e19a978871584d026dcf/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddb31f8474695cd61fc9455c644fc1606c164b93bff2490390d90464b4655df", size = 1682528 }, - { url = "https://files.pythonhosted.org/packages/90/cb/77b1445e0a716914e6197b0698b7a3640590da6c692437920c586764d05b/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dec0000d2d8621d8015c293e24589d46fa218637d820894cb7356c77eca3259", size = 1737154 }, - { url = "https://files.pythonhosted.org/packages/ff/24/d6fb1f4cede9ccbe98e4def6f3ed1e1efcb658871bbf29f4863ec646bf38/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3552fe98e90fdf5918c04769f338a87fa4f00f3b28830ea9b78b1bdc6140e0d", size = 1793435 }, - { url = "https://files.pythonhosted.org/packages/17/e2/9f744cee0861af673dc271a3351f59ebd5415928e20080ab85be25641471/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dfe7f984f28a8ae94ff3a7953cd9678550dbd2a1f9bda5dd9c5ae627744c78e", size = 1692010 }, - { url = "https://files.pythonhosted.org/packages/90/c4/4a1235c1df544223eb57ba553ce03bc706bdd065e53918767f7fa1ff99e0/aiohttp-3.11.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a481a574af914b6e84624412666cbfbe531a05667ca197804ecc19c97b8ab1b0", size = 1619481 }, - { url = "https://files.pythonhosted.org/packages/60/70/cf12d402a94a33abda86dd136eb749b14c8eb9fec1e16adc310e25b20033/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1987770fb4887560363b0e1a9b75aa303e447433c41284d3af2840a2f226d6e0", size = 1641578 }, - { url = "https://files.pythonhosted.org/packages/1b/25/7211973fda1f5e833fcfd98ccb7f9ce4fbfc0074e3e70c0157a751d00db8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a4ac6a0f0f6402854adca4e3259a623f5c82ec3f0c049374133bcb243132baf9", size = 1684463 }, - { url = "https://files.pythonhosted.org/packages/93/60/b5905b4d0693f6018b26afa9f2221fefc0dcbd3773fe2dff1a20fb5727f1/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c96a43822f1f9f69cc5c3706af33239489a6294be486a0447fb71380070d4d5f", size = 1646691 }, - { url = "https://files.pythonhosted.org/packages/b4/fc/ba1b14d6fdcd38df0b7c04640794b3683e949ea10937c8a58c14d697e93f/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a5e69046f83c0d3cb8f0d5bd9b8838271b1bc898e01562a04398e160953e8eb9", size = 1702269 }, - { url = "https://files.pythonhosted.org/packages/5e/39/18c13c6f658b2ba9cc1e0c6fb2d02f98fd653ad2addcdf938193d51a9c53/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:68d54234c8d76d8ef74744f9f9fc6324f1508129e23da8883771cdbb5818cbef", size = 1734782 }, - { url = "https://files.pythonhosted.org/packages/9f/d2/ccc190023020e342419b265861877cd8ffb75bec37b7ddd8521dd2c6deb8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9fd9dcf9c91affe71654ef77426f5cf8489305e1c66ed4816f5a21874b094b9", size = 1694740 }, - { url = "https://files.pythonhosted.org/packages/3f/54/186805bcada64ea90ea909311ffedcd74369bfc6e880d39d2473314daa36/aiohttp-3.11.12-cp312-cp312-win32.whl", hash = "sha256:0ed49efcd0dc1611378beadbd97beb5d9ca8fe48579fc04a6ed0844072261b6a", size = 411530 }, - { url = "https://files.pythonhosted.org/packages/3d/63/5eca549d34d141bcd9de50d4e59b913f3641559460c739d5e215693cb54a/aiohttp-3.11.12-cp312-cp312-win_amd64.whl", hash = "sha256:54775858c7f2f214476773ce785a19ee81d1294a6bedc5cc17225355aab74802", size = 437860 }, - { url = "https://files.pythonhosted.org/packages/c3/9b/cea185d4b543ae08ee478373e16653722c19fcda10d2d0646f300ce10791/aiohttp-3.11.12-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:413ad794dccb19453e2b97c2375f2ca3cdf34dc50d18cc2693bd5aed7d16f4b9", size = 698148 }, - { url = "https://files.pythonhosted.org/packages/91/5c/80d47fe7749fde584d1404a68ade29bcd7e58db8fa11fa38e8d90d77e447/aiohttp-3.11.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a93d28ed4b4b39e6f46fd240896c29b686b75e39cc6992692e3922ff6982b4c", size = 460831 }, - { url = "https://files.pythonhosted.org/packages/8e/f9/de568f8a8ca6b061d157c50272620c53168d6e3eeddae78dbb0f7db981eb/aiohttp-3.11.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d589264dbba3b16e8951b6f145d1e6b883094075283dafcab4cdd564a9e353a0", size = 453122 }, - { url = "https://files.pythonhosted.org/packages/8b/fd/b775970a047543bbc1d0f66725ba72acef788028fce215dc959fd15a8200/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5148ca8955affdfeb864aca158ecae11030e952b25b3ae15d4e2b5ba299bad2", size = 1665336 }, - { url = "https://files.pythonhosted.org/packages/82/9b/aff01d4f9716245a1b2965f02044e4474fadd2bcfe63cf249ca788541886/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:525410e0790aab036492eeea913858989c4cb070ff373ec3bc322d700bdf47c1", size = 1718111 }, - { url = "https://files.pythonhosted.org/packages/e0/a9/166fd2d8b2cc64f08104aa614fad30eee506b563154081bf88ce729bc665/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bd8695be2c80b665ae3f05cb584093a1e59c35ecb7d794d1edd96e8cc9201d7", size = 1775293 }, - { url = "https://files.pythonhosted.org/packages/13/c5/0d3c89bd9e36288f10dc246f42518ce8e1c333f27636ac78df091c86bb4a/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0203433121484b32646a5f5ea93ae86f3d9559d7243f07e8c0eab5ff8e3f70e", size = 1677338 }, - { url = "https://files.pythonhosted.org/packages/72/b2/017db2833ef537be284f64ead78725984db8a39276c1a9a07c5c7526e238/aiohttp-3.11.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd36749a1035c34ba8d8aaf221b91ca3d111532e5ccb5fa8c3703ab1b967ed", size = 1603365 }, - { url = "https://files.pythonhosted.org/packages/fc/72/b66c96a106ec7e791e29988c222141dd1219d7793ffb01e72245399e08d2/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7442662afebbf7b4c6d28cb7aab9e9ce3a5df055fc4116cc7228192ad6cb484", size = 1618464 }, - { url = "https://files.pythonhosted.org/packages/3f/50/e68a40f267b46a603bab569d48d57f23508801614e05b3369898c5b2910a/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8a2fb742ef378284a50766e985804bd6adb5adb5aa781100b09befdbfa757b65", size = 1657827 }, - { url = "https://files.pythonhosted.org/packages/c5/1d/aafbcdb1773d0ba7c20793ebeedfaba1f3f7462f6fc251f24983ed738aa7/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cee3b117a8d13ab98b38d5b6bdcd040cfb4181068d05ce0c474ec9db5f3c5bb", size = 1616700 }, - { url = "https://files.pythonhosted.org/packages/b0/5e/6cd9724a2932f36e2a6b742436a36d64784322cfb3406ca773f903bb9a70/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f6a19bcab7fbd8f8649d6595624856635159a6527861b9cdc3447af288a00c00", size = 1685643 }, - { url = "https://files.pythonhosted.org/packages/8b/38/ea6c91d5c767fd45a18151675a07c710ca018b30aa876a9f35b32fa59761/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e4cecdb52aaa9994fbed6b81d4568427b6002f0a91c322697a4bfcc2b2363f5a", size = 1715487 }, - { url = "https://files.pythonhosted.org/packages/8e/24/e9edbcb7d1d93c02e055490348df6f955d675e85a028c33babdcaeda0853/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:30f546358dfa0953db92ba620101fefc81574f87b2346556b90b5f3ef16e55ce", size = 1672948 }, - { url = "https://files.pythonhosted.org/packages/25/be/0b1fb737268e003198f25c3a68c2135e76e4754bf399a879b27bd508a003/aiohttp-3.11.12-cp313-cp313-win32.whl", hash = "sha256:ce1bb21fc7d753b5f8a5d5a4bae99566386b15e716ebdb410154c16c91494d7f", size = 410396 }, - { url = "https://files.pythonhosted.org/packages/68/fd/677def96a75057b0a26446b62f8fbb084435b20a7d270c99539c26573bfd/aiohttp-3.11.12-cp313-cp313-win_amd64.whl", hash = "sha256:f7914ab70d2ee8ab91c13e5402122edbc77821c66d2758abb53aabe87f013287", size = 436234 }, -] - -[[package]] -name = "aiosignal" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, -] - -[[package]] -name = "alembic" -version = "1.14.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mako" }, - { name = "sqlalchemy" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "asn1crypto" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/cf/d547feed25b5244fcb9392e288ff9fdc3280b10260362fc45d37a798a6ee/asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c", size = 121080 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67", size = 105045 }, -] - -[[package]] -name = "asyncpg" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162 }, - { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025 }, - { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243 }, - { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059 }, - { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596 }, - { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632 }, - { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186 }, - { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064 }, - { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373 }, - { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745 }, - { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103 }, - { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471 }, - { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253 }, - { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720 }, - { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404 }, - { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623 }, -] - -[[package]] -name = "attrs" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, -] - -[[package]] -name = "authlib" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/73/0aa3d68b1c3caeac01ae0bad7a3d2a23029c4a3b42c7ccb89d752ed67eb2/authlib-1.4.1.tar.gz", hash = "sha256:30ead9ea4993cdbab821dc6e01e818362f92da290c04c7f6a1940f86507a790d", size = 147376 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/6a/e83a6c04f8c6014c33d97c135782a55370cf60513f8d9f99f1279c7f9c13/Authlib-1.4.1-py2.py3-none-any.whl", hash = "sha256:edc29c3f6a3e72cd9e9f45fff67fc663a2c364022eb0371c003f22d5405915c1", size = 225610 }, -] - -[[package]] -name = "bcl" -version = "2.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/78/57a3b26ac13312ed5901f1089f0351dfd958d19e96242d557e25c1498a95/bcl-2.3.1.tar.gz", hash = "sha256:2a10f1e4fde1c146594fe835f29c9c9753a9f1c449617578c1473d6371da9853", size = 16823 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/93/f712cab57d0424ff65b380e22cb286b35b8bc0ba7997926dc18c8600f451/bcl-2.3.1-cp310-abi3-macosx_10_10_universal2.whl", hash = "sha256:cf59d66d4dd653b43b197ad5fc140a131db7f842c192d9836f5a6fe2bee9019e", size = 525696 }, - { url = "https://files.pythonhosted.org/packages/1a/a7/984bdb769c5ad2549fafc9365b0f6156fbeeec7df524eb064e65b164f8d0/bcl-2.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7696201b8111e877d21c1afd5a376f27975688658fa9001278f15e9fa3da2e0", size = 740158 }, - { url = "https://files.pythonhosted.org/packages/36/e3/c860ae7aa62ddacf0ff4e1d2c9741f0d2ab65fec00e3890e8ac0f5463629/bcl-2.3.1-cp310-abi3-win32.whl", hash = "sha256:28f55e08e929309eacf09118b29ffb4d110ce3702eef18e98b8b413d0dfb1bf9", size = 88671 }, - { url = "https://files.pythonhosted.org/packages/30/2e/a78ec72cfc2d6f438bd2978e81e05e708953434db8614a9f4f20bb7fa606/bcl-2.3.1-cp310-abi3-win_amd64.whl", hash = "sha256:f65e9f347b76964d91294964559da05cdcefb1f0bdfe90b6173892de3598a810", size = 96393 }, - { url = "https://files.pythonhosted.org/packages/25/f0/63337a824e34d0a3f48f2739d902c9c7d30524d4fc23ad73a3dcdad82e05/bcl-2.3.1-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:edb8277faee90121a248d26b308f4f007da1faedfd98d246841fb0f108e47db2", size = 315551 }, - { url = "https://files.pythonhosted.org/packages/00/1a/20ea61d352d5804df96baf8ca70401b17db8d748a81d4225f223f2580022/bcl-2.3.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99aff16e0da7a3b678c6cba9be24760eda75c068cba2b85604cf41818e2ba732", size = 740123 }, - { url = "https://files.pythonhosted.org/packages/5f/a8/2714e3f7d5643f487b0ecd49b21fa8db2d9572901baa49a6e0457a3b0c19/bcl-2.3.1-cp37-abi3-win32.whl", hash = "sha256:17d2e7dbe852c4447a7a2ff179dc466a3b8809ad1f151c4625ef7feff167fcaf", size = 88674 }, - { url = "https://files.pythonhosted.org/packages/26/69/6fab32cd6888887ed9113b806854ac696a76cf77febdacc6c5d4271cba8e/bcl-2.3.1-cp37-abi3-win_amd64.whl", hash = "sha256:fb778e77653735ac0bd2376636cba27ad972e0888227d4b40f49ea7ca5bceefa", size = 96395 }, - { url = "https://files.pythonhosted.org/packages/ab/7a/06d9297f9805da15775615bb9229b38eb28f1e113cdd05d0e7bbcc3429e4/bcl-2.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f6d551e139fa1544f7c822be57b0a8da2dff791c7ffa152bf371e3a8712b8b62", size = 315576 }, - { url = "https://files.pythonhosted.org/packages/7b/15/c244b97a2ffb839fc763cbd2ce65b9290c166e279aa9fc05f046e8feb372/bcl-2.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:447835deb112f75f89cca34e34957a36e355a102a37a7b41e83e5502b11fc10a", size = 740435 }, - { url = "https://files.pythonhosted.org/packages/6f/ff/25eaaf928078fc266d5f4cd485206acaec43c6a9311cf809114833bc24c4/bcl-2.3.1-cp38-abi3-win32.whl", hash = "sha256:1d8e0a25921ee705840219ed3c78e1d2e9d0d73cb2007c2708af57489bd6ce57", size = 88675 }, - { url = "https://files.pythonhosted.org/packages/85/e3/a0e02b0da403503015c2196e812c8d3781ffcd94426ce5baf7f4bbfa8533/bcl-2.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:a7312d21f5e8960b121fadbd950659bc58745282c1c2415e13150590d2bb271e", size = 96399 }, - { url = "https://files.pythonhosted.org/packages/08/ad/a46220911bd7795f9aec10b195e1828b2e48c2015ef7e088447cba5e9089/bcl-2.3.1-cp39-abi3-macosx_10_10_universal2.whl", hash = "sha256:bb695832cb555bb0e3dee985871e6cfc2d5314fb69bbf62297f81ba645e99257", size = 525703 }, - { url = "https://files.pythonhosted.org/packages/d8/3a/e8395071a89a7199363990968d438b77c55d55cce556327c98d5ce7975d1/bcl-2.3.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0922349eb5ffd19418f46c40469d132c6e0aea0e47fec48a69bec5191ee56bec", size = 315583 }, - { url = "https://files.pythonhosted.org/packages/b5/f9/2be5d88275d3d7e79cdbc8d52659b02b752d44f2bf90addb987d1fb96752/bcl-2.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97117d57cf90679dd1b28f1039fa2090f5561d3c1ee4fe4e78d1b0680cc39b8d", size = 740137 }, - { url = "https://files.pythonhosted.org/packages/7f/94/a3613caee8ca933902831343cc1040bcf3bb736cc9f38b2b4a7766292585/bcl-2.3.1-cp39-abi3-win32.whl", hash = "sha256:a5823f1b655a37259a06aa348bbc2e7a38d39d0e1683ea0596b888b7ef56d378", size = 88675 }, - { url = "https://files.pythonhosted.org/packages/9e/45/302d6712a8ff733a259446a7d24ff3c868715103032f50eef0d93ba70221/bcl-2.3.1-cp39-abi3-win_amd64.whl", hash = "sha256:52cf26c4ecd76e806c6576c4848633ff44ebfff528fca63ad0e52085b6ba5aa9", size = 96394 }, -] - -[[package]] -name = "bitarray" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/62/dcfac53d22ef7e904ed10a8e710a36391d2d6753c34c869b51bfc5e4ad54/bitarray-3.0.0.tar.gz", hash = "sha256:a2083dc20f0d828a7cdf7a16b20dae56aab0f43dc4f347a3b3039f6577992b03", size = 126627 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/2e/2e4beb2b714dc83a9e90ac0e4bacb1a191c71125734f72962ee2a20b9cfb/bitarray-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:184972c96e1c7e691be60c3792ca1a51dd22b7f25d96ebea502fe3c9b554f25d", size = 172152 }, - { url = "https://files.pythonhosted.org/packages/e0/1f/9ec96408c060ffc3df5ba64d2b520fd0484cb3393a96691df8f660a43b17/bitarray-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:787db8da5e9e29be712f7a6bce153c7bc8697ccc2c38633e347bb9c82475d5c9", size = 123319 }, - { url = "https://files.pythonhosted.org/packages/80/9f/4dd05086308bfcc84ad88c663460a8ad9f5f638f9f96eb5fa08381054db6/bitarray-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2da91ab3633c66999c2a352f0ca9ae064f553e5fc0eca231d28e7e305b83e942", size = 121242 }, - { url = "https://files.pythonhosted.org/packages/55/bb/8865b7380e9d20445bc775079f24f2279a8c0d9ee11d57c49b118d39beaf/bitarray-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7edb83089acbf2c86c8002b96599071931dc4ea5e1513e08306f6f7df879a48b", size = 287463 }, - { url = "https://files.pythonhosted.org/packages/db/8b/779119ee438090a80cbfaa49f96e783651183ab4c25b9760fe360aa7cb31/bitarray-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996d1b83eb904589f40974538223eaed1ab0f62be8a5105c280b9bd849e685c4", size = 301599 }, - { url = "https://files.pythonhosted.org/packages/41/25/78f7ba7fa8ab428767dfb722fc1ea9aac4a9813e348023d8047d8fd32253/bitarray-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4817d73d995bd2b977d9cde6050be8d407791cf1f84c8047fa0bea88c1b815bc", size = 304837 }, - { url = "https://files.pythonhosted.org/packages/f7/8d/30a448d3157b4239e635c92fc3b3789a5b87784875ca2776f65bd543d136/bitarray-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d47bc4ff9b0e1624d613563c6fa7b80aebe7863c56c3df5ab238bb7134e8755", size = 288588 }, - { url = "https://files.pythonhosted.org/packages/86/e0/c1f1b595682244f55119d55f280b5a996bcd462b702ec220d976a7566d27/bitarray-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aca0a9cd376beaccd9f504961de83e776dd209c2de5a4c78dc87a78edf61839b", size = 279002 }, - { url = "https://files.pythonhosted.org/packages/5c/4d/a17626923ad2c9d20ed1625fc5b27a8dfe2d1a3e877083e9422455ec302d/bitarray-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:572a61fba7e3a710a8324771322fba8488d134034d349dcd036a7aef74723a80", size = 281898 }, - { url = "https://files.pythonhosted.org/packages/50/d8/5c410580a510e669d9a28bf17675e58843236c55c60fc6dc8f8747808757/bitarray-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a817ad70c1aff217530576b4f037dd9b539eb2926603354fcac605d824082ad1", size = 274622 }, - { url = "https://files.pythonhosted.org/packages/e7/21/de2e8eda85c5f6a05bda75a00c22c94aee71ef09db0d5cbf22446de74312/bitarray-3.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2ac67b658fa5426503e9581a3fb44a26a3b346c1abd17105735f07db572195b3", size = 296930 }, - { url = "https://files.pythonhosted.org/packages/13/7b/7cfad12d77db2932fb745fa281693b0031c3dfd7f2ecf5803be688cc3798/bitarray-3.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:12f19ede03e685c5c588ab5ed63167999295ffab5e1126c5fe97d12c0718c18f", size = 309836 }, - { url = "https://files.pythonhosted.org/packages/53/e1/5120fbb8438a0d718e063f70168a2975e03f00ce6b86e74b8eec079cb492/bitarray-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcef31b062f756ba7eebcd7890c5d5de84b9d64ee877325257bcc9782288564a", size = 281535 }, - { url = "https://files.pythonhosted.org/packages/73/75/8acebbbb4f85dcca73b8e91dde5d3e1e3e2317b36fae4f5b133c60720834/bitarray-3.0.0-cp312-cp312-win32.whl", hash = "sha256:656db7bdf1d81ec3b57b3cad7ec7276765964bcfd0eb81c5d1331f385298169c", size = 114423 }, - { url = "https://files.pythonhosted.org/packages/ca/56/dadae4d4351b337de6e0269001fb40f3ebe9f72222190456713d2c1be53d/bitarray-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f785af6b7cb07a9b1e5db0dea9ef9e3e8bb3d74874a0a61303eab9c16acc1999", size = 121680 }, - { url = "https://files.pythonhosted.org/packages/4f/30/07d7be4624981537d32b261dc48a16b03757cc9d88f66012d93acaf11663/bitarray-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cb885c043000924554fe2124d13084c8fdae03aec52c4086915cd4cb87fe8be", size = 172147 }, - { url = "https://files.pythonhosted.org/packages/f0/e9/be1fa2828bad9cb32e1309e6dbd05adcc41679297d9e96bbb372be928e38/bitarray-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7814c9924a0b30ecd401f02f082d8697fc5a5be3f8d407efa6e34531ff3c306a", size = 123319 }, - { url = "https://files.pythonhosted.org/packages/22/28/33601d276a6eb76e40fe8a61c61f59cc9ff6d9ecf0b676235c02689475b8/bitarray-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcf524a087b143ba736aebbb054bb399d49e77cf7c04ed24c728e411adc82bfa", size = 121236 }, - { url = "https://files.pythonhosted.org/packages/85/d3/f36b213ffae8f9c8e4c6f12a91e18c06570a04f42d5a1bda4303380f2639/bitarray-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d5abf1d6d910599ac16afdd9a0ed3e24f3b46af57f3070cf2792f236f36e0b", size = 287395 }, - { url = "https://files.pythonhosted.org/packages/b7/1a/2da3b00d876883b05ffd3be9b1311858b48d4a26579f8647860e271c5385/bitarray-3.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9929051feeaf8d948cc0b1c9ce57748079a941a1a15c89f6014edf18adaade84", size = 301501 }, - { url = "https://files.pythonhosted.org/packages/88/b9/c1b5af8d1c918f1ee98748f7f7270f932f531c2259dd578c0edcf16ec73e/bitarray-3.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96cf0898f8060b2d3ae491762ae871b071212ded97ff9e1e3a5229e9fefe544c", size = 304804 }, - { url = "https://files.pythonhosted.org/packages/92/24/81a10862856419638c0db13e04de7cbf19938353517a67e4848c691f0b7c/bitarray-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab37da66a8736ad5a75a58034180e92c41e864da0152b84e71fcc253a2f69cd4", size = 288507 }, - { url = "https://files.pythonhosted.org/packages/da/70/a093af92ef7b207a59087e3b5819e03767fbdda9dd56aada3a4ee25a1fbd/bitarray-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeb79e476d19b91fd6a3439853e4e5ba1b3b475920fa40d62bde719c8af786f", size = 278905 }, - { url = "https://files.pythonhosted.org/packages/fb/40/0925c6079c4b282b16eb9085f82df0cdf1f787fb4c67fd4baca3e37acf7f/bitarray-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f75fc0198c955d840b836059bd43e0993edbf119923029ca60c4fc017cefa54a", size = 281909 }, - { url = "https://files.pythonhosted.org/packages/61/4b/e11754a5d34cb997250d8019b1fe555d4c06fe2d2a68b0bf7c5580537046/bitarray-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f12cc7c7638074918cdcc7491aff897df921b092ffd877227892d2686e98f876", size = 274711 }, - { url = "https://files.pythonhosted.org/packages/5b/78/39513f75423959ee2d82a82e10296b6a7bc7d880b16d714980a6752ef33b/bitarray-3.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dbe1084935b942fab206e609fa1ed3f46ad1f2612fb4833e177e9b2a5e006c96", size = 297038 }, - { url = "https://files.pythonhosted.org/packages/af/a2/5cb81f8773a479de7c06cc1ada36d5cc5a8ebcd8715013e1c4e01a76e84a/bitarray-3.0.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac06dd72ee1e1b6e312504d06f75220b5894af1fb58f0c20643698f5122aea76", size = 309814 }, - { url = "https://files.pythonhosted.org/packages/03/3e/795b57c6f6eea61c47d0716e1d60219218028b1f260f7328802eac684964/bitarray-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00f9a88c56e373009ac3c73c55205cfbd9683fbd247e2f9a64bae3da78795252", size = 281564 }, - { url = "https://files.pythonhosted.org/packages/f6/31/5914002ae4dd0e0079f8bccfd0647119cff364280d106108a19bd2511933/bitarray-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9c6e52005e91803eb4e08c0a08a481fb55ddce97f926bae1f6fa61b3396b5b61", size = 114404 }, - { url = "https://files.pythonhosted.org/packages/76/0a/184f85a1739db841ae8fbb1d9ec028240d5a351e36abec9cd020de889dab/bitarray-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cb98d5b6eac4b2cf2a5a69f60a9c499844b8bea207059e9fc45c752436e6bb49", size = 121672 }, -] - -[[package]] -name = "black" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 }, - { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 }, - { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 }, - { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 }, - { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 }, - { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 }, - { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 }, - { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 }, - { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "ckzg" -version = "2.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/80/4b6219a65634915efc4694fa606f38d4b893dcdc1e50b9bcf69b38ec82b0/ckzg-2.0.1.tar.gz", hash = "sha256:62c5adc381637affa7e1df465c57750b356a761b8a3164c3106589b02532b9c9", size = 1113747 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/87/dcc62fc2f6651127b6306a37db492998c291ad1a09a6a0d18895882fec51/ckzg-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:285cf3121b8a8c5609c5b706314f68d2ba2784ab02c5bb7487c6ae1714ecb27f", size = 114776 }, - { url = "https://files.pythonhosted.org/packages/fd/99/2d3aa09ebf692c26e03d17b9e7426a34fd71fe4d9b2ff1acf482736cc8da/ckzg-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f927bc41c2551b0ef0056a649a7ebed29d9665680a10795f4cee5002c69ddb7", size = 98711 }, - { url = "https://files.pythonhosted.org/packages/50/b3/44a533895aa4257d0dcb2818f7dd9b1321664784cac2d381022ed8c40113/ckzg-2.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd9fb690c88919f30c9f3ab7cc46a7ecd734d5ff4c9ccea383c119b9b7cc4da", size = 175026 }, - { url = "https://files.pythonhosted.org/packages/54/a2/c594861665851f91ae81ec29cf90e38999de042aa95604737d4b779a8609/ckzg-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fabc3bd41b306d1c7025d561c3281a007c2aca8ceaf998582dc3894904d9c73e", size = 161039 }, - { url = "https://files.pythonhosted.org/packages/59/a0/96bb77fb8bf4cd4d51d8bd1d67d59d13f51fa2477b11b915ab6465aa92ce/ckzg-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb50c53efdb9c34f762bd0c8006cf79bc92a9daf47aa6b541e496988484124f", size = 169889 }, - { url = "https://files.pythonhosted.org/packages/68/c4/77d54a7e5f85d833e9664935f6278fbea7de30f4fde213d121f7fdbc27a0/ckzg-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7960cc62f959403293fb53a3c2404778369ae7cefc6d7f202e5e00567cf98c4b", size = 171378 }, - { url = "https://files.pythonhosted.org/packages/02/54/6520ab37c06680910f8ff99afdc473c945c37ab1016662288d98a028d775/ckzg-2.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d721bcd492294c70eca39da0b0a433c29b6a571dbac2f7084bab06334904af06", size = 185969 }, - { url = "https://files.pythonhosted.org/packages/d6/fa/16c3a4fd8353a3a9f95728f4141b2800b08e588522f7b5644c91308f6fe1/ckzg-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dde2391d025b5033ef0eeacf62b11ecfe446aea25682b5f547a907766ad0a8cb", size = 180093 }, - { url = "https://files.pythonhosted.org/packages/d5/ae/91d36445c247a8832bbb7a71bd75293c4c006731d03a2ccaa13e5506ac8a/ckzg-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fab8859d9420f6f7df4e094ee3639bc49d18c8dab0df81bee825e2363dd67a09", size = 98280 }, - { url = "https://files.pythonhosted.org/packages/79/92/4910b9131eb637c6f72e655c1535b9a9c72a5fb2bdf52742f50066cb9e6b/ckzg-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9747d92883199d4f8f3a3d7018134745fddcf692dfe67115434e4b32609ea785", size = 114793 }, - { url = "https://files.pythonhosted.org/packages/09/95/cb52623cbc4573b2e65bd924524f479e6a8611002c4634dfd6e9d490b403/ckzg-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2cf58fb9e165da97f0ffe9f4a6efb73992645fac8e0fa223a6cc7ec486a434a", size = 98715 }, - { url = "https://files.pythonhosted.org/packages/27/05/3f246149a728b5d829dd8e0b75379fd6bce0d420de4042b8ca692083f96d/ckzg-2.0.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d25d006899d76bb8c9d3e8b27981dd6b66a78f9826e33c1bf981af6577a69a19", size = 175008 }, - { url = "https://files.pythonhosted.org/packages/5f/76/df568b24de6bdbb99fe2c48519744d01f1b9e152fa791ed84b43a2752e78/ckzg-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04bf0b32f04f5ea5e4b8518e292d3321bc05596fde95f9c3b4f504e5e4bc780", size = 161009 }, - { url = "https://files.pythonhosted.org/packages/7f/b5/8bbde8acb339a018c0456fb9af714fcca86ed9bf96114ece9556415afbac/ckzg-2.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0cf3dccd72376bff10e1833641cc9d642f34f60ca63972626d9dfcfdc8e77f", size = 169873 }, - { url = "https://files.pythonhosted.org/packages/5f/8f/9b9492f807acbfe791c4c447bbeb96e19160fda272328a9dc6700a2fcb08/ckzg-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:770809c7e93087470cc524724419b0f85590edb033c7c73ba94aef70b36ca18b", size = 171438 }, - { url = "https://files.pythonhosted.org/packages/f1/58/47d4ed23e338dbe1b06cca99e55ae49c3a539d88576c5893e8b589bf3ac6/ckzg-2.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e31b59b8124148d5e21f7e41b35532d7af98260c44a77c3917958adece84296d", size = 186020 }, - { url = "https://files.pythonhosted.org/packages/a5/f0/dc6f961b325d186af1a469e7119a0f48cdc36240f2aca6e10a5e5f91b8b8/ckzg-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:174f0c356df644d6e349ce03b7284d83dbec859e11ca5d1b1b3bace8b8fbc65d", size = 180132 }, - { url = "https://files.pythonhosted.org/packages/72/ca/44676731ca52e6d2289f7e9c74d836f59dc986e9b4182ddd2c7d0b14d88f/ckzg-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:30e375cd45142e56b5dbfdec05ce4deb2368d7f7dedfc7408ba37d5639af05ff", size = 98284 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "cryptography" -version = "43.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/de/ba/0664727028b37e249e73879348cc46d45c5c1a2a2e81e8166462953c5755/cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", size = 686927 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/28/b92c98a04ba762f8cdeb54eba5c4c84e63cac037a7c5e70117d337b15ad6/cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", size = 6223222 }, - { url = "https://files.pythonhosted.org/packages/33/13/1193774705783ba364121aa2a60132fa31a668b8ababd5edfa1662354ccd/cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", size = 3794751 }, - { url = "https://files.pythonhosted.org/packages/5e/4b/39bb3c4c8cfb3e94e736b8d8859ce5c81536e91a1033b1d26770c4249000/cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", size = 3981827 }, - { url = "https://files.pythonhosted.org/packages/ce/dc/1471d4d56608e1013237af334b8a4c35d53895694fbb73882d1c4fd3f55e/cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", size = 3780034 }, - { url = "https://files.pythonhosted.org/packages/ad/43/7a9920135b0d5437cc2f8f529fa757431eb6a7736ddfadfdee1cc5890800/cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", size = 3993407 }, - { url = "https://files.pythonhosted.org/packages/cc/42/9ab8467af6c0b76f3d9b8f01d1cf25b9c9f3f2151f4acfab888d21c55a72/cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", size = 3886457 }, - { url = "https://files.pythonhosted.org/packages/a4/65/430509e31700286ec02868a2457d2111d03ccefc20349d24e58d171ae0a7/cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", size = 4081499 }, - { url = "https://files.pythonhosted.org/packages/bb/18/a04b6467e6e09df8c73b91dcee8878f4a438a43a3603dc3cd6f8003b92d8/cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", size = 2616504 }, - { url = "https://files.pythonhosted.org/packages/cc/73/0eacbdc437202edcbdc07f3576ed8fb8b0ab79d27bf2c5d822d758a72faa/cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", size = 3067456 }, - { url = "https://files.pythonhosted.org/packages/8a/b6/bc54b371f02cffd35ff8dc6baba88304d7cf8e83632566b4b42e00383e03/cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", size = 6225263 }, - { url = "https://files.pythonhosted.org/packages/00/0e/8217e348a1fa417ec4c78cd3cdf24154f5e76fd7597343a35bd403650dfd/cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", size = 3794368 }, - { url = "https://files.pythonhosted.org/packages/3d/ed/38b6be7254d8f7251fde8054af597ee8afa14f911da67a9410a45f602fc3/cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", size = 3981750 }, - { url = "https://files.pythonhosted.org/packages/64/f3/b7946c3887cf7436f002f4cbb1e6aec77b8d299b86be48eeadfefb937c4b/cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", size = 3778925 }, - { url = "https://files.pythonhosted.org/packages/ac/7e/ebda4dd4ae098a0990753efbb4b50954f1d03003846b943ea85070782da7/cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", size = 3993152 }, - { url = "https://files.pythonhosted.org/packages/43/f6/feebbd78a3e341e3913846a3bb2c29d0b09b1b3af1573c6baabc2533e147/cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", size = 3886392 }, - { url = "https://files.pythonhosted.org/packages/bd/4c/ab0b9407d5247576290b4fd8abd06b7f51bd414f04eef0f2800675512d61/cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", size = 4082606 }, - { url = "https://files.pythonhosted.org/packages/05/36/e532a671998d6fcfdb9122da16434347a58a6bae9465e527e450e0bc60a5/cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", size = 2617948 }, - { url = "https://files.pythonhosted.org/packages/b3/c6/c09cee6968add5ff868525c3815e5dccc0e3c6e89eec58dc9135d3c40e88/cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", size = 3070445 }, -] - -[[package]] -name = "cytoolz" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "toolz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121 }, - { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904 }, - { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734 }, - { url = "https://files.pythonhosted.org/packages/c3/66/369262c60f9423c2da82a60864a259c852f1aa122aced4acd2c679af58c0/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1", size = 2155933 }, - { url = "https://files.pythonhosted.org/packages/aa/4e/ee55186802f8d24b5fbf9a11405ccd1203b30eded07cc17750618219b94e/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8", size = 2171903 }, - { url = "https://files.pythonhosted.org/packages/a1/96/bd1a9f3396e9b7f618db8cd08d15630769ce3c8b7d0534f92cd639c977ae/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d", size = 2125270 }, - { url = "https://files.pythonhosted.org/packages/28/48/2a3762873091c88a69e161111cfbc6c222ff145d57ff011a642b169f04f1/cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f", size = 1973967 }, - { url = "https://files.pythonhosted.org/packages/e4/50/500bd69774bdc49a4d78ec8779eb6ac7c1a9d706bfd91cf2a1dba604373a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7", size = 2021695 }, - { url = "https://files.pythonhosted.org/packages/e4/4e/ba5a0ce34869495eb50653de8d676847490cf13a2cac1760fc4d313e78de/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126", size = 2010177 }, - { url = "https://files.pythonhosted.org/packages/87/57/615c630b3089a13adb15351d958d227430cf624f03b1dd39eb52c34c1f59/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0", size = 2154321 }, - { url = "https://files.pythonhosted.org/packages/7f/0f/fe1aa2d931e3b35ecc05215bd75da945ea7346095b3b6f6027164e602d5a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b", size = 2188374 }, - { url = "https://files.pythonhosted.org/packages/de/fa/fd363d97a641b6d0e2fd1d5c35b8fd41d9ccaeb4df56302f53bf23a58e3a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d", size = 2077911 }, - { url = "https://files.pythonhosted.org/packages/d9/68/0a22946b98ae5201b54ccb4e651295285c0fb79406022b6ee8b2f791940c/cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9", size = 321903 }, - { url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b", size = 364490 }, - { url = "https://files.pythonhosted.org/packages/aa/2e/a9f069db0107749e9e72baf6c21abe3f006841a3bcfdc9b8420e22ef31eb/cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0", size = 407365 }, - { url = "https://files.pythonhosted.org/packages/a9/9b/5e87dd0e31f54c778b4f9f34cc14c1162d3096c8d746b0f8be97d70dd73c/cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a", size = 385233 }, - { url = "https://files.pythonhosted.org/packages/63/00/2fd32b16284cdb97cfe092822179bc0c3bcdd5e927dd39f986169a517642/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242", size = 2062903 }, - { url = "https://files.pythonhosted.org/packages/85/39/b3cbb5a9847ba59584a263772ad4f8ca2dbfd2a0e11efd09211d1219804c/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296", size = 2139517 }, - { url = "https://files.pythonhosted.org/packages/ea/39/bfcab4a46d50c467e36fe704f19d8904efead417787806ee210327f68390/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b", size = 2154849 }, - { url = "https://files.pythonhosted.org/packages/fd/42/3bc6ee61b0aa47e1cb40819adc1a456d7efa809f0dea9faddacb43fdde8f/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b", size = 2102302 }, - { url = "https://files.pythonhosted.org/packages/00/66/3f636c6ddea7b18026b90a8c238af472e423b86e427b11df02213689b012/cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266", size = 1960872 }, - { url = "https://files.pythonhosted.org/packages/40/36/cb3b7cdd651007b69f9c48e9d104cec7cb8dc53afa1d6a720e5ad08022fa/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5", size = 2014430 }, - { url = "https://files.pythonhosted.org/packages/88/3f/2e9bd2a16cfd269808922147551dcb2d8b68ba54a2c4deca2fa6a6cd0d5f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3", size = 2003127 }, - { url = "https://files.pythonhosted.org/packages/c4/7d/08604ff940aa784df8343c387fdf2489b948b714a6afb587775ae94da912/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296", size = 2142369 }, - { url = "https://files.pythonhosted.org/packages/d2/c6/39919a0645bdbdf720e97cae107f959ea9d1267fbc3b0d94fc6e1d12ac8f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140", size = 2180427 }, - { url = "https://files.pythonhosted.org/packages/d8/03/dbb9d47556ee54337e7e0ac209d17ceff2d2a197c34de08005abc7a7449b/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581", size = 2069785 }, - { url = "https://files.pythonhosted.org/packages/ea/f8/11bb7b8947002231faae3ec2342df5896afbc19eb783a332cce6d219ff79/cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9", size = 320685 }, - { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898 }, -] - -[[package]] -name = "distlib" -version = "0.3.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, -] - -[[package]] -name = "dnspython" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, -] - -[[package]] -name = "docker" -version = "7.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pywin32", marker = "sys_platform == 'win32'" }, - { name = "requests" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774 }, -] - -[[package]] -name = "ecdsa" -version = "0.19.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5e/d0/ec8ac1de7accdcf18cfe468653ef00afd2f609faf67c423efbd02491051b/ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8", size = 197791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/e7/ed3243b30d1bec41675b6394a1daae46349dc2b855cb83be846a5a918238/ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a", size = 149266 }, -] - -[[package]] -name = "egcd" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/f5/c0c0808f8a3f8a4af605b48a241b16a634ceddd41b5e3ee05ae2fd9e1e42/egcd-2.0.2.tar.gz", hash = "sha256:3b05b0feb67549f8f76c97afed36c53252c0d7cb9a65bf4e6ca8b99110fb77f2", size = 6952 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/e7/9d984faee490e50a495b50d0a87c42fe661252f9513157776d8cb2724445/egcd-2.0.2-py3-none-any.whl", hash = "sha256:2f0576a651b4aa9e9c4640bba078f9741d1624f386b55cb5363a79ae4b564bd2", size = 7187 }, -] - -[[package]] -name = "elementpath" -version = "4.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/44/7a10be09cb79d4e6900fc1f2a7db6fb7639c6b05f88b61106650b618fc52/elementpath-4.7.0.tar.gz", hash = "sha256:a2029dc8752fcfec49663d1ed1b412c6daf278c0c91938f50f63c4fe9ed1848e", size = 357225 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/eb/c4fac84745a84d3bc0fd481cf8c204f60bce367a19d8f9182a195ed6d42a/elementpath-4.7.0-py3-none-any.whl", hash = "sha256:607804a1b4250ac448c1e2bfaec4ee1c980b0a07cfdb0d9057b57102038ed480", size = 240649 }, -] - -[[package]] -name = "email-validator" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dnspython" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, -] - -[[package]] -name = "etcd3gw" -version = "2.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "futurist" }, - { name = "pbr" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/56/db0e19678af91d9213cf21c72e7d82a3494d6fc7da16d61c6ba578fd8648/etcd3gw-2.4.2.tar.gz", hash = "sha256:6c6e9e42b810ee9a9455dd342de989f1fab637a94daa4fc34cacb248a54473fa", size = 29840 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/11/79f09e0d1195d455bdf0542d4fec4ddc80a4f496d090244bba9fc7113834/etcd3gw-2.4.2-py3-none-any.whl", hash = "sha256:b907bd2dc702eabbeba3f9c15666e94e92961bfe685429a0e415ce44097f5c22", size = 24092 }, -] - -[[package]] -name = "eth-abi" -version = "5.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-typing" }, - { name = "eth-utils" }, - { name = "parsimonious" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/71/d9e1380bd77fd22f98b534699af564f189b56d539cc2b9dab908d4e4c242/eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0", size = 49797 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/b4/2f3982c4cbcbf5eeb6aec62df1533c0e63c653b3021ff338d44944405676/eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877", size = 28511 }, -] - -[[package]] -name = "eth-account" -version = "0.13.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "bitarray" }, - { name = "ckzg" }, - { name = "eth-abi" }, - { name = "eth-keyfile" }, - { name = "eth-keys" }, - { name = "eth-rlp" }, - { name = "eth-utils" }, - { name = "hexbytes" }, - { name = "pydantic" }, - { name = "rlp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/23/0d/016e90c67a9c14cd38f4e7b46ef362795fe0f9be1ea4b26026846bdae68e/eth_account-0.13.5.tar.gz", hash = "sha256:010c9ce5f3d2688106cf9bfeb711bb8eaf0154ea6f85325f54fecea85c2b3759", size = 7793978 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/b9/d20fc50a5c04b23bd3e2f3d7864b529e0888f928d62b69209c778268e08e/eth_account-0.13.5-py3-none-any.whl", hash = "sha256:e43fd30c9a7fabb882b50e8c4c41d4486d2f3478ad97c66bb18cfcc872fdbec8", size = 580746 }, -] - -[[package]] -name = "eth-hash" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/38/577b7bc9380ef9dff0f1dffefe0c9a1ded2385e7a06c306fd95afb6f9451/eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5", size = 12227 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/db/f8775490669d28aca24871c67dd56b3e72105cb3bcae9a4ec65dd70859b3/eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a", size = 8028 }, -] - -[package.optional-dependencies] -pycryptodome = [ - { name = "pycryptodome" }, -] - -[[package]] -name = "eth-keyfile" -version = "0.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-keys" }, - { name = "eth-utils" }, - { name = "pycryptodome" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/66/dd823b1537befefbbff602e2ada88f1477c5b40ec3731e3d9bc676c5f716/eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1", size = 12267 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/fc/48a586175f847dd9e05e5b8994d2fe8336098781ec2e9836a2ad94280281/eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64", size = 7510 }, -] - -[[package]] -name = "eth-keys" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-typing" }, - { name = "eth-utils" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/72/96db2e3d27c64d3e4a6bf1397447d029e4268fd70b0f1ee4192d6e8d75cd/eth_keys-0.6.1.tar.gz", hash = "sha256:a43e263cbcabfd62fa769168efc6c27b1f5603040e4de22bb84d12567e4fd962", size = 30090 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/67/c241c85e9cb9c4d8c14440dd82f7fbe39536592bf59c6b643004ac63eab2/eth_keys-0.6.1-py3-none-any.whl", hash = "sha256:7deae4cd56e862e099ec58b78176232b931c4ea5ecded2f50c7b1ccbc10c24cf", size = 21292 }, -] - -[[package]] -name = "eth-rlp" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-utils" }, - { name = "hexbytes" }, - { name = "rlp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7f/ea/ad39d001fa9fed07fad66edb00af701e29b48be0ed44a3bcf58cb3adf130/eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d", size = 7720 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/3b/57efe2bc2df0980680d57c01a36516cd3171d2319ceb30e675de19fc2cc5/eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47", size = 4446 }, -] - -[[package]] -name = "eth-typing" -version = "5.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/6f/ecd98de0b67eefc68e17f6979433534a63e11aac88adaae7dede0b694567/eth_typing-5.1.0.tar.gz", hash = "sha256:8581f212ee6252aaa285377a77620f6e5f6e16ac3f144c61f098fafd47967b1a", size = 21727 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/2e/40e7577866f4378fb9737e0cb08e3e96e5a25b53821b0139dbfbd77dd66e/eth_typing-5.1.0-py3-none-any.whl", hash = "sha256:c0d6b93f5385aa84efc4b47ae2bd478da069bc0ffda8b67e0ccb573f43defd29", size = 19116 }, -] - -[[package]] -name = "eth-utils" -version = "5.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cytoolz", marker = "implementation_name == 'cpython'" }, - { name = "eth-hash" }, - { name = "eth-typing" }, - { name = "toolz", marker = "implementation_name == 'pypy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/27/e9/f4210d19fa45a23b239017cd75b535d594d8945ef6afc4bb3ab9ee4ff269/eth_utils-5.2.0.tar.gz", hash = "sha256:17e474eb654df6e18f20797b22c6caabb77415a996b3ba0f3cc8df3437463134", size = 120366 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/88/e4e2cc869eaab9a830ac69f213d0609a4f5c5377cde10698cdef6ad2874e/eth_utils-5.2.0-py3-none-any.whl", hash = "sha256:4d43eeb6720e89a042ad5b28d4b2111630ae764f444b85cbafb708d7f076da10", size = 100516 }, -] - -[[package]] -name = "fastapi" -version = "0.115.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/b2/5a5dc4affdb6661dea100324e19a7721d5dc524b464fe8e366c093fd7d87/fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9", size = 295403 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/7d/2d6ce181d7a5f51dedb8c06206cbf0ec026a99bf145edd309f9e17c3282f/fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf", size = 94814 }, -] - -[package.optional-dependencies] -standard = [ - { name = "email-validator" }, - { name = "fastapi-cli", extra = ["standard"] }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "python-multipart" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[[package]] -name = "fastapi-cli" -version = "0.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "rich-toolkit" }, - { name = "typer" }, - { name = "uvicorn", extra = ["standard"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, -] - -[package.optional-dependencies] -standard = [ - { name = "uvicorn", extra = ["standard"] }, -] - -[[package]] -name = "filelock" -version = "3.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, -] - -[[package]] -name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, - { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, - { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, - { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, - { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, - { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, - { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, - { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, - { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, - { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, - { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, - { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, - { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, - { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, - { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, - { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, - { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, - { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, - { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, - { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, - { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, - { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, - { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, - { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, - { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, - { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, -] - -[[package]] -name = "fsspec" -version = "2025.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/79/68612ed99700e6413de42895aa725463e821a6b3be75c87fcce1b4af4c70/fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd", size = 292283 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/94/758680531a00d06e471ef649e4ec2ed6bf185356a7f9fbfbb7368a40bd49/fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b", size = 184484 }, -] - -[[package]] -name = "futurist" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/24/864408313afba48440ee3a560e1a70b62b39e6c0dfeddea9506699e6e606/futurist-3.0.0.tar.gz", hash = "sha256:6422011792414c39228e114bec5494303aaf06dcd335e4f8dd4f907f78a41f79", size = 44836 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/2b/dcdb2dfdc61676ac25676f10f71c9bba77bf81227f3e73f5c678462bffaf/futurist-3.0.0-py3-none-any.whl", hash = "sha256:645565803423c907557d59f82b2e7f33d87fd483316414466d059a0fa5aa5fc9", size = 37008 }, -] - -[[package]] -name = "greenlet" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260 }, - { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064 }, - { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420 }, - { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035 }, - { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105 }, - { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077 }, - { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975 }, - { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955 }, - { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655 }, - { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990 }, - { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175 }, - { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425 }, - { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736 }, - { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347 }, - { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583 }, - { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039 }, - { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716 }, - { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490 }, - { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731 }, - { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304 }, - { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537 }, - { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506 }, - { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753 }, - { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731 }, - { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112 }, -] - -[[package]] -name = "gunicorn" -version = "23.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "hexbytes" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/71/1a3f2439cf138b555c182fffeffbf67c090837e4570370af85ee8e57013f/hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684", size = 8200 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/96/035871b535a728700d3cc5b94cf883706f345c5a088253f26f0bee0b7939/hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c", size = 4902 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httptools" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "huggingface-hub" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068 }, -] - -[[package]] -name = "identify" -version = "2.6.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/d1/524aa3350f78bcd714d148ade6133d67d6b7de2cdbae7d99039c024c9a25/identify-2.6.7.tar.gz", hash = "sha256:3fa266b42eba321ee0b2bb0936a6a6b9e36a1351cbb69055b3082f4193035684", size = 99260 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/00/1fd4a117c6c93f2dcc5b7edaeaf53ea45332ef966429be566ca16c2beb94/identify-2.6.7-py2.py3-none-any.whl", hash = "sha256:155931cb617a401807b09ecec6635d6c692d180090a1cedca8ef7d58ba5b6aa0", size = 99097 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, -] - -[[package]] -name = "isort" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/28/b382d1656ac0ee4cef4bf579b13f9c6c813bff8a5cb5996669592c8c75fa/isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1", size = 828356 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c7/d6017f09ae5b1206fbe531f7af3b6dac1f67aedcbd2e79f3b386c27955d6/isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892", size = 94053 }, -] - -[[package]] -name = "jinja2" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, -] - -[[package]] -name = "jiter" -version = "0.8.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/70/90bc7bd3932e651486861df5c8ffea4ca7c77d28e8532ddefe2abc561a53/jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d", size = 163007 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/17/c8747af8ea4e045f57d6cfd6fc180752cab9bc3de0e8a0c9ca4e8af333b1/jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f", size = 302027 }, - { url = "https://files.pythonhosted.org/packages/3c/c1/6da849640cd35a41e91085723b76acc818d4b7d92b0b6e5111736ce1dd10/jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44", size = 310326 }, - { url = "https://files.pythonhosted.org/packages/06/99/a2bf660d8ccffee9ad7ed46b4f860d2108a148d0ea36043fd16f4dc37e94/jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f", size = 334242 }, - { url = "https://files.pythonhosted.org/packages/a7/5f/cea1c17864828731f11427b9d1ab7f24764dbd9aaf4648a7f851164d2718/jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60", size = 356654 }, - { url = "https://files.pythonhosted.org/packages/e9/13/62774b7e5e7f5d5043efe1d0f94ead66e6d0f894ae010adb56b3f788de71/jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57", size = 379967 }, - { url = "https://files.pythonhosted.org/packages/ec/fb/096b34c553bb0bd3f2289d5013dcad6074948b8d55212aa13a10d44c5326/jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e", size = 389252 }, - { url = "https://files.pythonhosted.org/packages/17/61/beea645c0bf398ced8b199e377b61eb999d8e46e053bb285c91c3d3eaab0/jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887", size = 345490 }, - { url = "https://files.pythonhosted.org/packages/d5/df/834aa17ad5dcc3cf0118821da0a0cf1589ea7db9832589278553640366bc/jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d", size = 376991 }, - { url = "https://files.pythonhosted.org/packages/67/80/87d140399d382fb4ea5b3d56e7ecaa4efdca17cd7411ff904c1517855314/jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152", size = 510822 }, - { url = "https://files.pythonhosted.org/packages/5c/37/3394bb47bac1ad2cb0465601f86828a0518d07828a650722e55268cdb7e6/jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29", size = 503730 }, - { url = "https://files.pythonhosted.org/packages/f9/e2/253fc1fa59103bb4e3aa0665d6ceb1818df1cd7bf3eb492c4dad229b1cd4/jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e", size = 203375 }, - { url = "https://files.pythonhosted.org/packages/41/69/6d4bbe66b3b3b4507e47aa1dd5d075919ad242b4b1115b3f80eecd443687/jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c", size = 204740 }, - { url = "https://files.pythonhosted.org/packages/6c/b0/bfa1f6f2c956b948802ef5a021281978bf53b7a6ca54bb126fd88a5d014e/jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84", size = 301190 }, - { url = "https://files.pythonhosted.org/packages/a4/8f/396ddb4e292b5ea57e45ade5dc48229556b9044bad29a3b4b2dddeaedd52/jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4", size = 309334 }, - { url = "https://files.pythonhosted.org/packages/7f/68/805978f2f446fa6362ba0cc2e4489b945695940656edd844e110a61c98f8/jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587", size = 333918 }, - { url = "https://files.pythonhosted.org/packages/b3/99/0f71f7be667c33403fa9706e5b50583ae5106d96fab997fa7e2f38ee8347/jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c", size = 356057 }, - { url = "https://files.pythonhosted.org/packages/8d/50/a82796e421a22b699ee4d2ce527e5bcb29471a2351cbdc931819d941a167/jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18", size = 379790 }, - { url = "https://files.pythonhosted.org/packages/3c/31/10fb012b00f6d83342ca9e2c9618869ab449f1aa78c8f1b2193a6b49647c/jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6", size = 388285 }, - { url = "https://files.pythonhosted.org/packages/c8/81/f15ebf7de57be488aa22944bf4274962aca8092e4f7817f92ffa50d3ee46/jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef", size = 344764 }, - { url = "https://files.pythonhosted.org/packages/b3/e8/0cae550d72b48829ba653eb348cdc25f3f06f8a62363723702ec18e7be9c/jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1", size = 376620 }, - { url = "https://files.pythonhosted.org/packages/b8/50/e5478ff9d82534a944c03b63bc217c5f37019d4a34d288db0f079b13c10b/jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9", size = 510402 }, - { url = "https://files.pythonhosted.org/packages/8e/1e/3de48bbebbc8f7025bd454cedc8c62378c0e32dd483dece5f4a814a5cb55/jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05", size = 503018 }, - { url = "https://files.pythonhosted.org/packages/d5/cd/d5a5501d72a11fe3e5fd65c78c884e5164eefe80077680533919be22d3a3/jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a", size = 203190 }, - { url = "https://files.pythonhosted.org/packages/51/bf/e5ca301245ba951447e3ad677a02a64a8845b185de2603dabd83e1e4b9c6/jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865", size = 203551 }, - { url = "https://files.pythonhosted.org/packages/2f/3c/71a491952c37b87d127790dd7a0b1ebea0514c6b6ad30085b16bbe00aee6/jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca", size = 308347 }, - { url = "https://files.pythonhosted.org/packages/a0/4c/c02408042e6a7605ec063daed138e07b982fdb98467deaaf1c90950cf2c6/jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0", size = 342875 }, - { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, -] - -[[package]] -name = "joblib" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, -] - -[[package]] -name = "lxml" -version = "4.9.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/14/c2070b5e37c650198de8328467dd3d1681e80986f81ba0fea04fc4ec9883/lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e", size = 3576664 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/ac/0abe4b25cae50247c5130539d0f45a201dbfe0ba69d3dd844411f90c9930/lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8", size = 8624172 }, - { url = "https://files.pythonhosted.org/packages/33/e6/47c4675f0c58398c924915379eee8458bf7954644a7907ad8fbc1c42a380/lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229", size = 7674086 }, - { url = "https://files.pythonhosted.org/packages/be/9e/5d88b189e91fae65140dc29904946297b3d9cfdf5449d4bc6e657a3ffc2d/lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d", size = 8026189 }, - { url = "https://files.pythonhosted.org/packages/ea/08/ab6c2a803a5d5dce1fbbb32f5c133bbd0ebfe69476ab1eb5ffa3490b0b51/lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20", size = 7516933 }, - { url = "https://files.pythonhosted.org/packages/43/52/b0d387577620af767c73b8b20f28986e5aad70b44053ee296f8a472a12b1/lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10", size = 7815609 }, - { url = "https://files.pythonhosted.org/packages/be/13/18230c0d567ed282a3d7b61395323e2ef8fc9ad64096fdd3d1b384fa3e3c/lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b", size = 3460500 }, - { url = "https://files.pythonhosted.org/packages/5f/df/6d15cc415e04724ba4c141051cf43709e09bbcdd9868a6c2e7a7073ef498/lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56", size = 3773977 }, -] - -[[package]] -name = "mako" -version = "1.3.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/62/4f/ddb1965901bc388958db9f0c991255b2c469349a741ae8c9cd8a562d70a6/mako-1.3.9.tar.gz", hash = "sha256:b5d65ff3462870feec922dbccf38f6efb44e5714d7b593a656be86663d8600ac", size = 392195 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/83/de0a49e7de540513f53ab5d2e105321dedeb08a8f5850f0208decf4390ec/Mako-1.3.9-py3-none-any.whl", hash = "sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1", size = 78456 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "mpmath" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, -] - -[[package]] -name = "multidict" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, - { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, - { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, - { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, - { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, - { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, - { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, - { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, - { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, - { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, - { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, - { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, - { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, - { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, - { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, - { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, - { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, - { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, - { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, - { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, - { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, - { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, - { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, - { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, - { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, - { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, - { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, -] - -[[package]] -name = "networkx" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, -] - -[[package]] -name = "nilai" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "nilai-api" }, - { name = "nilai-common" }, - { name = "nilai-models" }, - { name = "verifier" }, -] - -[package.dev-dependencies] -dev = [ - { name = "black" }, - { name = "isort" }, - { name = "pre-commit" }, - { name = "pyright" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-mock" }, - { name = "ruff" }, - { name = "testcontainers" }, - { name = "uvicorn" }, -] - -[package.metadata] -requires-dist = [ - { name = "nilai-api", editable = "nilai-api" }, - { name = "nilai-common", editable = "packages/nilai-common" }, - { name = "nilai-models", editable = "nilai-models" }, - { name = "verifier", editable = "packages/verifier" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "black", specifier = ">=24.10.0" }, - { name = "isort", specifier = ">=5.13.2" }, - { name = "pre-commit", specifier = ">=4.1.0" }, - { name = "pyright", specifier = ">=1.1" }, - { name = "pytest", specifier = ">=8.3.3" }, - { name = "pytest-asyncio", specifier = ">=0.25.0" }, - { name = "pytest-mock", specifier = ">=3.14.0" }, - { name = "ruff", specifier = ">=0.8.0" }, - { name = "testcontainers", specifier = ">=4.9.1" }, - { name = "uvicorn", specifier = ">=0.32.1" }, -] - -[[package]] -name = "nilai-api" -version = "0.1.0" -source = { editable = "nilai-api" } -dependencies = [ - { name = "accelerate" }, - { name = "alembic" }, - { name = "asyncpg" }, - { name = "authlib" }, - { name = "cryptography" }, - { name = "fastapi", extra = ["standard"] }, - { name = "greenlet" }, - { name = "gunicorn" }, - { name = "httpx" }, - { name = "nilai-common" }, - { name = "nilql" }, - { name = "nilrag" }, - { name = "numpy" }, - { name = "openai" }, - { name = "pg8000" }, - { name = "prometheus-fastapi-instrumentator" }, - { name = "python-dotenv" }, - { name = "redis" }, - { name = "sqlalchemy" }, - { name = "uvicorn" }, - { name = "verifier" }, - { name = "web3" }, -] - -[package.metadata] -requires-dist = [ - { name = "accelerate", specifier = ">=1.1.1" }, - { name = "alembic", specifier = ">=1.14.1" }, - { name = "asyncpg", specifier = ">=0.30.0" }, - { name = "authlib", specifier = ">=1.4.1" }, - { name = "cryptography", specifier = ">=43.0.1" }, - { name = "fastapi", extras = ["standard"], specifier = ">=0.115.5" }, - { name = "greenlet", specifier = ">=3.1.1" }, - { name = "gunicorn", specifier = ">=23.0.0" }, - { name = "httpx", specifier = ">=0.27.2" }, - { name = "nilai-common", editable = "packages/nilai-common" }, - { name = "nilql", specifier = ">=0.0.0a3" }, - { name = "nilrag", specifier = ">=0.1.2" }, - { name = "numpy", specifier = "<2.0.0" }, - { name = "openai", specifier = ">=1.59.9" }, - { name = "pg8000", specifier = ">=1.31.2" }, - { name = "prometheus-fastapi-instrumentator", specifier = ">=7.0.2" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "redis", specifier = ">=5.2.1" }, - { name = "sqlalchemy", specifier = ">=2.0.36" }, - { name = "uvicorn", specifier = ">=0.32.1" }, - { name = "verifier", editable = "packages/verifier" }, - { name = "web3", specifier = ">=7.8.0" }, -] - -[[package]] -name = "nilai-common" -version = "0.1.0" -source = { editable = "packages/nilai-common" } -dependencies = [ - { name = "etcd3gw" }, - { name = "openai" }, - { name = "pydantic" }, - { name = "tenacity" }, -] - -[package.metadata] -requires-dist = [ - { name = "etcd3gw", specifier = ">=2.4.2" }, - { name = "openai", specifier = ">=1.59.9" }, - { name = "pydantic", specifier = ">=2.10.1" }, - { name = "tenacity", specifier = ">=9.0.0" }, -] - -[[package]] -name = "nilai-models" -version = "0.1.0" -source = { editable = "nilai-models" } -dependencies = [ - { name = "httpx" }, - { name = "nilai-common" }, -] - -[package.metadata] -requires-dist = [ - { name = "httpx", specifier = ">=0.27.2" }, - { name = "nilai-common", editable = "packages/nilai-common" }, -] - -[[package]] -name = "nilql" -version = "0.0.0a3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "bcl" }, - { name = "pailliers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/68/44/d08dd617075d517c7db6ac001ea25a40b1ebc2799b4fda5ed8817588c2d5/nilql-0.0.0a3.tar.gz", hash = "sha256:d52022bada5fbd7ddb756f7bdf4cc1181f8f0a9cdbc437aef016b23deb91c82a", size = 8903 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/9f/2128303f11e8a3744aa94bdfb67eed9b2445a5a6e62ceb385f4ea13a50b7/nilql-0.0.0a3-py3-none-any.whl", hash = "sha256:2ececdf8d13b9bd1cca7cd281fdb40fd0600c4050c6a4c5efaa82efc9310a6e8", size = 7017 }, -] - -[[package]] -name = "nilrag" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ecdsa" }, - { name = "nilql" }, - { name = "numpy" }, - { name = "pyjwt" }, - { name = "sentence-transformers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cb/14/60989528013e433b426111418982a74c28a18177e2b9cc1e8fc91fb8cb7f/nilrag-0.1.2.tar.gz", hash = "sha256:0f51cb5f2ea2d44585424d4afcfc3421177e598178fce205b8103d816baa4148", size = 14068 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/24/8b93f7f2407a67b67f31ae339884832494ee3ecdd7e402fd90e7cbad96a2/nilrag-0.1.2-py3-none-any.whl", hash = "sha256:437d3b2ede209ecec13173fed251a6e97667a1f7c472868cf1fd0224df5860c6", size = 12205 }, -] - -[[package]] -name = "nodeenv" -version = "1.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, -] - -[[package]] -name = "numpy" -version = "1.26.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, -] - -[[package]] -name = "nvidia-cublas-cu12" -version = "12.4.5.8" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 }, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 }, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 }, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 }, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.1.0.70" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.2.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 }, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.5.147" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 }, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.6.1.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 }, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.3.1.170" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 }, -] - -[[package]] -name = "nvidia-cusparselt-cu12" -version = "0.6.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/a8/bcbb63b53a4b1234feeafb65544ee55495e1bb37ec31b999b963cbccfd1d/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9", size = 150057751 }, -] - -[[package]] -name = "nvidia-ml-py" -version = "12.570.86" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/6e/7b0c9b88c7d520fb8639024a1a3b6dd1db03bf2c17ae85040c8758d2eb6f/nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b", size = 43147 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/a8/ec37169be4e2b7063b9076ed3fe0661e87335fbca665eed3f48c415cb234/nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51", size = 44442 }, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.21.5" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414 }, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 }, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, -] - -[[package]] -name = "openai" -version = "1.63.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e6/1c/11b520deb71f9ea54ced3c52cd6a5f7131215deba63ad07f23982e328141/openai-1.63.2.tar.gz", hash = "sha256:aeabeec984a7d2957b4928ceaa339e2ead19c61cfcf35ae62b7c363368d26360", size = 356902 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/64/db3462b358072387b8e93e6e6a38d3c741a17b4a84171ef01d6c85c63f25/openai-1.63.2-py3-none-any.whl", hash = "sha256:1f38b27b5a40814c2b7d8759ec78110df58c4a614c25f182809ca52b080ff4d4", size = 472282 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "pailliers" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "egcd" }, - { name = "rabinmiller" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b5/c2/578c08af348247c025179e9f22d4970549fd58635d3881a9ac86192b159b/pailliers-0.2.0.tar.gz", hash = "sha256:a1d3d7d840594f51073e531078b3da4dc5a7a527b410102a0f0fa65d6c222871", size = 8919 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/0e/d793836d158ea15f7705e8ae705d73991f58e3eda0dde07e64bc423a4c12/pailliers-0.2.0-py3-none-any.whl", hash = "sha256:ad0ddc72be63f9b3c10200e23178fe527b566c4aa86659ab54a8faeb367ac7d6", size = 7404 }, -] - -[[package]] -name = "parsimonious" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "regex" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/91/abdc50c4ef06fdf8d047f60ee777ca9b2a7885e1a9cea81343fbecda52d7/parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c", size = 52172 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427 }, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, -] - -[[package]] -name = "pbr" -version = "6.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 }, -] - -[[package]] -name = "pg8000" -version = "1.31.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, - { name = "scramp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/d7/0554640cbe3e193184796bedb6de23f797c03958425176faf0e694c06eb0/pg8000-1.31.2.tar.gz", hash = "sha256:1ea46cf09d8eca07fe7eaadefd7951e37bee7fabe675df164f1a572ffb300876", size = 113513 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/a0/2b30d52017c4ced8fc107386666ea7573954eb708bf66121f0229df05d41/pg8000-1.31.2-py3-none-any.whl", hash = "sha256:436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6", size = 54494 }, -] - -[[package]] -name = "pillow" -version = "11.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, - { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, - { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, - { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, - { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, - { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, - { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, - { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, - { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, - { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, - { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, - { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, - { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, - { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, - { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, - { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, - { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, - { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, - { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, - { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, - { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, - { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, - { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, - { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, - { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, - { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, - { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, - { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, - { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, - { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, -] - -[[package]] -name = "pre-commit" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, -] - -[[package]] -name = "prometheus-client" -version = "0.21.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, -] - -[[package]] -name = "prometheus-fastapi-instrumentator" -version = "7.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "prometheus-client" }, - { name = "starlette" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/01/e3ccb464ba9bf6c001ad85652e6fc7e63098c2685275a682cabc8e7871b8/prometheus_fastapi_instrumentator-7.0.2.tar.gz", hash = "sha256:8a4d8fb13dbe19d2882ac6af9ce236e4e1f98dc48e3fa44fe88d8e23ac3c953f", size = 19844 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/f7/a67e804853d05b3f1f5def0ebd662b9f48dbcfe0b452f0aa5d4c183a6f86/prometheus_fastapi_instrumentator-7.0.2-py3-none-any.whl", hash = "sha256:975e39992acb7a112758ff13ba95317e6c54d1bbf605f9156f31ac9f2800c32d", size = 18998 }, -] - -[[package]] -name = "propcache" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 }, - { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 }, - { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 }, - { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 }, - { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 }, - { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 }, - { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 }, - { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 }, - { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 }, - { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 }, - { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 }, - { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 }, - { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 }, - { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 }, - { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 }, - { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 }, - { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 }, - { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 }, - { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 }, - { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 }, - { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 }, - { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 }, - { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 }, - { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 }, - { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 }, - { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 }, - { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 }, - { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 }, - { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 }, - { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 }, - { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 }, - { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 }, - { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 }, -] - -[[package]] -name = "psutil" -version = "7.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pycryptodome" -version = "3.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/52/13b9db4a913eee948152a079fe58d035bd3d1a519584155da8e786f767e6/pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297", size = 4818071 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/88/5e83de10450027c96c79dc65ac45e9d0d7a7fef334f39d3789a191f33602/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4", size = 2495937 }, - { url = "https://files.pythonhosted.org/packages/66/e1/8f28cd8cf7f7563319819d1e172879ccce2333781ae38da61c28fe22d6ff/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b", size = 1634629 }, - { url = "https://files.pythonhosted.org/packages/6a/c1/f75a1aaff0c20c11df8dc8e2bf8057e7f73296af7dfd8cbb40077d1c930d/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e", size = 2168708 }, - { url = "https://files.pythonhosted.org/packages/ea/66/6f2b7ddb457b19f73b82053ecc83ba768680609d56dd457dbc7e902c41aa/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8", size = 2254555 }, - { url = "https://files.pythonhosted.org/packages/2c/2b/152c330732a887a86cbf591ed69bd1b489439b5464806adb270f169ec139/pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1", size = 2294143 }, - { url = "https://files.pythonhosted.org/packages/55/92/517c5c498c2980c1b6d6b9965dffbe31f3cd7f20f40d00ec4069559c5902/pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a", size = 2160509 }, - { url = "https://files.pythonhosted.org/packages/39/1f/c74288f54d80a20a78da87df1818c6464ac1041d10988bb7d982c4153fbc/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2", size = 2329480 }, - { url = "https://files.pythonhosted.org/packages/39/1b/d0b013bf7d1af7cf0a6a4fce13f5fe5813ab225313755367b36e714a63f8/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93", size = 2254397 }, - { url = "https://files.pythonhosted.org/packages/14/71/4cbd3870d3e926c34706f705d6793159ac49d9a213e3ababcdade5864663/pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764", size = 1775641 }, - { url = "https://files.pythonhosted.org/packages/43/1d/81d59d228381576b92ecede5cd7239762c14001a828bdba30d64896e9778/pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53", size = 1812863 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pyjwt" -version = "2.10.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, -] - -[[package]] -name = "pyopenssl" -version = "24.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5d/70/ff56a63248562e77c0c8ee4aefc3224258f1856977e0c1472672b62dadb8/pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", size = 184323 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/dd/e0aa7ebef5168c75b772eda64978c597a9129b46be17779054652a7999e4/pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d", size = 58390 }, -] - -[[package]] -name = "pyright" -version = "1.1.394" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nodeenv" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/e4/79f4d8a342eed6790fdebdb500e95062f319ee3d7d75ae27304ff995ae8c/pyright-1.1.394.tar.gz", hash = "sha256:56f2a3ab88c5214a451eb71d8f2792b7700434f841ea219119ade7f42ca93608", size = 3809348 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/4c/50c74e3d589517a9712a61a26143b587dba6285434a17aebf2ce6b82d2c3/pyright-1.1.394-py3-none-any.whl", hash = "sha256:5f74cce0a795a295fb768759bbeeec62561215dea657edcaab48a932b031ddbb", size = 5679540 }, -] - -[[package]] -name = "pytest" -version = "8.3.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, -] - -[[package]] -name = "pytest-asyncio" -version = "0.25.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pytest" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467 }, -] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pytest" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-dotenv" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, -] - -[[package]] -name = "python-multipart" -version = "0.0.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, -] - -[[package]] -name = "pyunormalize" -version = "16.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/08/568036c725dac746ecb267bb749ef930fb7907454fe69fce83c8557287fb/pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7", size = 49968 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/f9/9d86e56f716e0651194a5ad58be9c146fcaf1de6901ac6f3cd3affeeb74e/pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152", size = 49173 }, -] - -[[package]] -name = "pywin32" -version = "308" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, - { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, - { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, - { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, - { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, - { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "rabinmiller" -version = "0.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/9a4bd1d823200b4fcbdc25584cf4e788f672cdf0d6622b66a8b49c3be925/rabinmiller-0.1.0.tar.gz", hash = "sha256:a9873aa6fdd0c26d5205d99e126fd94e6e1bb2aa966e167e136dfbfab0d0556d", size = 5159 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/b0/68c2efd5f025b80316fce28e49ce25c5d0171aa17ce7f94a89c0a6544d2b/rabinmiller-0.1.0-py3-none-any.whl", hash = "sha256:3fec2d26fc210772ced965a8f0e2870e5582cadf255bc665ef3f4932752ada5f", size = 5309 }, -] - -[[package]] -name = "redis" -version = "5.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/da/d283a37303a995cd36f8b92db85135153dc4f7a8e4441aa827721b442cfb/redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f", size = 4608355 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4", size = 261502 }, -] - -[[package]] -name = "regex" -version = "2024.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, - { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, - { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, - { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, - { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, - { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, - { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, - { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, - { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, - { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, - { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, - { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, - { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, - { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, - { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, - { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, - { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "rich" -version = "13.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, -] - -[[package]] -name = "rich-toolkit" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/71cfbf6bf6257ea785d1f030c22468f763eea1b3e5417620f2ba9abd6dca/rich_toolkit-0.13.2.tar.gz", hash = "sha256:fea92557530de7c28f121cbed572ad93d9e0ddc60c3ca643f1b831f2f56b95d3", size = 72288 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/1b/1c2f43af46456050b27810a7a013af8a7e12bc545a0cdc00eb0df55eb769/rich_toolkit-0.13.2-py3-none-any.whl", hash = "sha256:f3f6c583e5283298a2f7dbd3c65aca18b7f818ad96174113ab5bec0b0e35ed61", size = 13566 }, -] - -[[package]] -name = "rlp" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-utils" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1b/2d/439b0728a92964a04d9c88ea1ca9ebb128893fbbd5834faa31f987f2fd4c/rlp-4.1.0.tar.gz", hash = "sha256:be07564270a96f3e225e2c107db263de96b5bc1f27722d2855bd3459a08e95a9", size = 33429 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/fb/e4c0ced9893b84ac95b7181d69a9786ce5879aeb3bbbcbba80a164f85d6a/rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f", size = 19973 }, -] - -[[package]] -name = "ruff" -version = "0.9.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 }, - { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 }, - { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 }, - { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 }, - { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 }, - { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 }, - { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 }, - { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 }, - { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 }, - { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 }, - { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 }, - { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 }, - { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 }, - { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 }, - { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 }, - { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 }, - { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 }, -] - -[[package]] -name = "safetensors" -version = "0.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f4/4f/2ef9ef1766f8c194b01b67a63a444d2e557c8fe1d82faf3ebd85f370a917/safetensors-0.5.2.tar.gz", hash = "sha256:cb4a8d98ba12fa016f4241932b1fc5e702e5143f5374bba0bbcf7ddc1c4cf2b8", size = 66957 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/d1/017e31e75e274492a11a456a9e7c171f8f7911fe50735b4ec6ff37221220/safetensors-0.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:45b6092997ceb8aa3801693781a71a99909ab9cc776fbc3fa9322d29b1d3bef2", size = 427067 }, - { url = "https://files.pythonhosted.org/packages/24/84/e9d3ff57ae50dd0028f301c9ee064e5087fe8b00e55696677a0413c377a7/safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6d0d6a8ee2215a440e1296b843edf44fd377b055ba350eaba74655a2fe2c4bae", size = 408856 }, - { url = "https://files.pythonhosted.org/packages/f1/1d/fe95f5dd73db16757b11915e8a5106337663182d0381811c81993e0014a9/safetensors-0.5.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86016d40bcaa3bcc9a56cd74d97e654b5f4f4abe42b038c71e4f00a089c4526c", size = 450088 }, - { url = "https://files.pythonhosted.org/packages/cf/21/e527961b12d5ab528c6e47b92d5f57f33563c28a972750b238b871924e49/safetensors-0.5.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:990833f70a5f9c7d3fc82c94507f03179930ff7d00941c287f73b6fcbf67f19e", size = 458966 }, - { url = "https://files.pythonhosted.org/packages/a5/8b/1a037d7a57f86837c0b41905040369aea7d8ca1ec4b2a77592372b2ec380/safetensors-0.5.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dfa7c2f3fe55db34eba90c29df94bcdac4821043fc391cb5d082d9922013869", size = 509915 }, - { url = "https://files.pythonhosted.org/packages/61/3d/03dd5cfd33839df0ee3f4581a20bd09c40246d169c0e4518f20b21d5f077/safetensors-0.5.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46ff2116150ae70a4e9c490d2ab6b6e1b1b93f25e520e540abe1b81b48560c3a", size = 527664 }, - { url = "https://files.pythonhosted.org/packages/c5/dc/8952caafa9a10a3c0f40fa86bacf3190ae7f55fa5eef87415b97b29cb97f/safetensors-0.5.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab696dfdc060caffb61dbe4066b86419107a24c804a4e373ba59be699ebd8d5", size = 461978 }, - { url = "https://files.pythonhosted.org/packages/60/da/82de1fcf1194e3dbefd4faa92dc98b33c06bed5d67890e0962dd98e18287/safetensors-0.5.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03c937100f38c9ff4c1507abea9928a6a9b02c9c1c9c3609ed4fb2bf413d4975", size = 491253 }, - { url = "https://files.pythonhosted.org/packages/5a/9a/d90e273c25f90c3ba1b0196a972003786f04c39e302fbd6649325b1272bb/safetensors-0.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a00e737948791b94dad83cf0eafc09a02c4d8c2171a239e8c8572fe04e25960e", size = 628644 }, - { url = "https://files.pythonhosted.org/packages/70/3c/acb23e05aa34b4f5edd2e7f393f8e6480fbccd10601ab42cd03a57d4ab5f/safetensors-0.5.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:d3a06fae62418ec8e5c635b61a8086032c9e281f16c63c3af46a6efbab33156f", size = 721648 }, - { url = "https://files.pythonhosted.org/packages/71/45/eaa3dba5253a7c6931230dc961641455710ab231f8a89cb3c4c2af70f8c8/safetensors-0.5.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1506e4c2eda1431099cebe9abf6c76853e95d0b7a95addceaa74c6019c65d8cf", size = 659588 }, - { url = "https://files.pythonhosted.org/packages/b0/71/2f9851164f821064d43b481ddbea0149c2d676c4f4e077b178e7eeaa6660/safetensors-0.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5c5b5d9da594f638a259fca766046f44c97244cc7ab8bef161b3e80d04becc76", size = 632533 }, - { url = "https://files.pythonhosted.org/packages/00/f1/5680e2ef61d9c61454fad82c344f0e40b8741a9dbd1e31484f0d31a9b1c3/safetensors-0.5.2-cp38-abi3-win32.whl", hash = "sha256:fe55c039d97090d1f85277d402954dd6ad27f63034fa81985a9cc59655ac3ee2", size = 291167 }, - { url = "https://files.pythonhosted.org/packages/86/ca/aa489392ec6fb59223ffce825461e1f811a3affd417121a2088be7a5758b/safetensors-0.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:78abdddd03a406646107f973c7843276e7b64e5e32623529dc17f3d94a20f589", size = 303756 }, -] - -[[package]] -name = "scikit-learn" -version = "1.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516 }, - { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837 }, - { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728 }, - { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700 }, - { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613 }, - { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001 }, - { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360 }, - { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004 }, - { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776 }, - { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865 }, - { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804 }, - { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530 }, - { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852 }, - { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256 }, -] - -[[package]] -name = "scipy" -version = "1.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, - { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, - { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, - { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, - { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, - { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, - { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, - { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, - { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, - { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, - { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, - { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, - { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, - { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, - { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, - { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, - { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, - { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, - { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, - { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, - { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, - { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, - { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, - { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, - { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, - { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, - { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, -] - -[[package]] -name = "scramp" -version = "1.4.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asn1crypto" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f9/fa/8f1b99c3f875f334ac782e173ec03c35c246ec7a94fc5dd85153bc1d8285/scramp-1.4.5.tar.gz", hash = "sha256:be3fbe774ca577a7a658117dca014e5d254d158cecae3dd60332dfe33ce6d78e", size = 16169 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/9f/8b2f2749ccfbe4fcef08650896ac47ed919ff25b7ac57b7a1ae7da16c8c3/scramp-1.4.5-py3-none-any.whl", hash = "sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7", size = 12781 }, -] - -[[package]] -name = "sentence-transformers" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "pillow" }, - { name = "scikit-learn" }, - { name = "scipy" }, - { name = "torch" }, - { name = "tqdm" }, - { name = "transformers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/16/74/aca6f8a2b8d62b4daf8c9a0c49d2aa573381caf47dc35cbb343389229376/sentence_transformers-3.4.1.tar.gz", hash = "sha256:68daa57504ff548340e54ff117bd86c1d2f784b21e0fb2689cf3272b8937b24b", size = 223898 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/89/7eb147a37b7f31d3c815543df539d8b8d0425e93296c875cc87719d65232/sentence_transformers-3.4.1-py3-none-any.whl", hash = "sha256:e026dc6d56801fd83f74ad29a30263f401b4b522165c19386d8bc10dcca805da", size = 275896 }, -] - -[[package]] -name = "setuptools" -version = "75.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - -[[package]] -name = "signxml" -version = "3.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "cryptography" }, - { name = "lxml" }, - { name = "pyopenssl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/46/f3/6910019f60efba3d76e42540013cb27203a41eaa9bc2ec9edbb2e0d7623f/signxml-3.2.0.tar.gz", hash = "sha256:da4a85c272998bb3a18211f9e21cbfe1359b756706bc4bddbeb4020babdab7ef", size = 58650 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/4b/1e3f14db5967ae48064cdff7683f52e0c492c6d98a40285a6a4bf449149f/signxml-3.2.0-py3-none-any.whl", hash = "sha256:0ee07e3e8fcba8fa0975f5bf9e205e557ea3f0b34ea95b4fde1c897e75c4812c", size = 57867 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.38" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/08/9a90962ea72acd532bda71249a626344d855c4032603924b1b547694b837/sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb", size = 9634782 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/f8/6d0424af1442c989b655a7b5f608bc2ae5e4f94cdf6df9f6054f629dc587/SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3", size = 2104927 }, - { url = "https://files.pythonhosted.org/packages/25/80/fc06e65fca0a19533e2bfab633a5633ed8b6ee0b9c8d580acf84609ce4da/SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32", size = 2095317 }, - { url = "https://files.pythonhosted.org/packages/98/2d/5d66605f76b8e344813237dc160a01f03b987201e974b46056a7fb94a874/SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e", size = 3244735 }, - { url = "https://files.pythonhosted.org/packages/73/8d/b0539e8dce90861efc38fea3eefb15a5d0cfeacf818614762e77a9f192f9/SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e", size = 3255581 }, - { url = "https://files.pythonhosted.org/packages/ac/a5/94e1e44bf5bdffd1782807fcc072542b110b950f0be53f49e68b5f5eca1b/SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579", size = 3190877 }, - { url = "https://files.pythonhosted.org/packages/91/13/f08b09996dce945aec029c64f61c13b4788541ac588d9288e31e0d3d8850/SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd", size = 3217485 }, - { url = "https://files.pythonhosted.org/packages/13/8f/8cfe2ba5ba6d8090f4de0e658330c53be6b7bf430a8df1b141c2b180dcdf/SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725", size = 2075254 }, - { url = "https://files.pythonhosted.org/packages/c2/5c/e3c77fae41862be1da966ca98eec7fbc07cdd0b00f8b3e1ef2a13eaa6cca/SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d", size = 2100865 }, - { url = "https://files.pythonhosted.org/packages/21/77/caa875a1f5a8a8980b564cc0e6fee1bc992d62d29101252561d0a5e9719c/SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd", size = 2100201 }, - { url = "https://files.pythonhosted.org/packages/f4/ec/94bb036ec78bf9a20f8010c807105da9152dd84f72e8c51681ad2f30b3fd/SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b", size = 2090678 }, - { url = "https://files.pythonhosted.org/packages/7b/61/63ff1893f146e34d3934c0860209fdd3925c25ee064330e6c2152bacc335/SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727", size = 3177107 }, - { url = "https://files.pythonhosted.org/packages/a9/4f/b933bea41a602b5f274065cc824fae25780ed38664d735575192490a021b/SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096", size = 3190435 }, - { url = "https://files.pythonhosted.org/packages/f5/23/9e654b4059e385988de08c5d3b38a369ea042f4c4d7c8902376fd737096a/SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a", size = 3123648 }, - { url = "https://files.pythonhosted.org/packages/83/59/94c6d804e76ebc6412a08d2b086a8cb3e5a056cd61508e18ddaf3ec70100/SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86", size = 3151789 }, - { url = "https://files.pythonhosted.org/packages/b2/27/17f143013aabbe1256dce19061eafdce0b0142465ce32168cdb9a18c04b1/SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120", size = 2073023 }, - { url = "https://files.pythonhosted.org/packages/e2/3e/259404b03c3ed2e7eee4c179e001a07d9b61070334be91124cf4ad32eec7/SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda", size = 2096908 }, - { url = "https://files.pythonhosted.org/packages/aa/e4/592120713a314621c692211eba034d09becaf6bc8848fabc1dc2a54d8c16/SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753", size = 1896347 }, -] - -[[package]] -name = "starlette" -version = "0.45.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507 }, -] - -[[package]] -name = "sympy" -version = "1.13.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mpmath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 }, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - -[[package]] -name = "testcontainers" -version = "4.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docker" }, - { name = "python-dotenv" }, - { name = "typing-extensions" }, - { name = "urllib3" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e6/be/32bcd4143bca261b70e02109d75c2dbb5eb3e47e72e99efac9ca6ae88f76/testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f", size = 62463 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/d1/bba4ad5dca32d48c0e9c4845e84fa44933308c595d22c9e4b977a5007c4b/testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0", size = 105478 }, -] - -[[package]] -name = "threadpoolctl" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b5148dcbf72f5cde221f8bfe3b6a540da7aa1842f6b491ad979a6c8b84af/threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107", size = 41936 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467", size = 18414 }, -] - -[[package]] -name = "tokenizers" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/20/41/c2be10975ca37f6ec40d7abd7e98a5213bb04f284b869c1a24e6504fd94d/tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4", size = 343021 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/5c/8b09607b37e996dc47e70d6a7b6f4bdd4e4d5ab22fe49d7374565c7fefaf/tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2", size = 2647461 }, - { url = "https://files.pythonhosted.org/packages/22/7a/88e58bb297c22633ed1c9d16029316e5b5ac5ee44012164c2edede599a5e/tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e", size = 2563639 }, - { url = "https://files.pythonhosted.org/packages/f7/14/83429177c19364df27d22bc096d4c2e431e0ba43e56c525434f1f9b0fd00/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193", size = 2903304 }, - { url = "https://files.pythonhosted.org/packages/7e/db/3433eab42347e0dc5452d8fcc8da03f638c9accffefe5a7c78146666964a/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e", size = 2804378 }, - { url = "https://files.pythonhosted.org/packages/57/8b/7da5e6f89736c2ade02816b4733983fca1c226b0c42980b1ae9dc8fcf5cc/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e", size = 3095488 }, - { url = "https://files.pythonhosted.org/packages/4d/f6/5ed6711093dc2c04a4e03f6461798b12669bc5a17c8be7cce1240e0b5ce8/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba", size = 3121410 }, - { url = "https://files.pythonhosted.org/packages/81/42/07600892d48950c5e80505b81411044a2d969368cdc0d929b1c847bf6697/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273", size = 3388821 }, - { url = "https://files.pythonhosted.org/packages/22/06/69d7ce374747edaf1695a4f61b83570d91cc8bbfc51ccfecf76f56ab4aac/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04", size = 3008868 }, - { url = "https://files.pythonhosted.org/packages/c8/69/54a0aee4d576045b49a0eb8bffdc495634309c823bf886042e6f46b80058/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e", size = 8975831 }, - { url = "https://files.pythonhosted.org/packages/f7/f3/b776061e4f3ebf2905ba1a25d90380aafd10c02d406437a8ba22d1724d76/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b", size = 8920746 }, - { url = "https://files.pythonhosted.org/packages/d8/ee/ce83d5ec8b6844ad4c3ecfe3333d58ecc1adc61f0878b323a15355bcab24/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74", size = 9161814 }, - { url = "https://files.pythonhosted.org/packages/18/07/3e88e65c0ed28fa93aa0c4d264988428eef3df2764c3126dc83e243cb36f/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff", size = 9357138 }, - { url = "https://files.pythonhosted.org/packages/15/b0/dc4572ca61555fc482ebc933f26cb407c6aceb3dc19c301c68184f8cad03/tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a", size = 2202266 }, - { url = "https://files.pythonhosted.org/packages/44/69/d21eb253fa91622da25585d362a874fa4710be600f0ea9446d8d0217cec1/tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c", size = 2389192 }, -] - -[[package]] -name = "toolz" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, -] - -[[package]] -name = "torch" -version = "2.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "setuptools" }, - { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/35/0c52d708144c2deb595cd22819a609f78fdd699b95ff6f0ebcd456e3c7c1/torch-2.6.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2bb8987f3bb1ef2675897034402373ddfc8f5ef0e156e2d8cfc47cacafdda4a9", size = 766624563 }, - { url = "https://files.pythonhosted.org/packages/01/d6/455ab3fbb2c61c71c8842753b566012e1ed111e7a4c82e0e1c20d0c76b62/torch-2.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b789069020c5588c70d5c2158ac0aa23fd24a028f34a8b4fcb8fcb4d7efcf5fb", size = 95607867 }, - { url = "https://files.pythonhosted.org/packages/18/cf/ae99bd066571656185be0d88ee70abc58467b76f2f7c8bfeb48735a71fe6/torch-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e1448426d0ba3620408218b50aa6ada88aeae34f7a239ba5431f6c8774b1239", size = 204120469 }, - { url = "https://files.pythonhosted.org/packages/81/b4/605ae4173aa37fb5aa14605d100ff31f4f5d49f617928c9f486bb3aaec08/torch-2.6.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:9a610afe216a85a8b9bc9f8365ed561535c93e804c2a317ef7fabcc5deda0989", size = 66532538 }, - { url = "https://files.pythonhosted.org/packages/24/85/ead1349fc30fe5a32cadd947c91bda4a62fbfd7f8c34ee61f6398d38fb48/torch-2.6.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:4874a73507a300a5d089ceaff616a569e7bb7c613c56f37f63ec3ffac65259cf", size = 766626191 }, - { url = "https://files.pythonhosted.org/packages/dd/b0/26f06f9428b250d856f6d512413e9e800b78625f63801cbba13957432036/torch-2.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a0d5e1b9874c1a6c25556840ab8920569a7a4137afa8a63a32cee0bc7d89bd4b", size = 95611439 }, - { url = "https://files.pythonhosted.org/packages/c2/9c/fc5224e9770c83faed3a087112d73147cd7c7bfb7557dcf9ad87e1dda163/torch-2.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:510c73251bee9ba02ae1cb6c9d4ee0907b3ce6020e62784e2d7598e0cfa4d6cc", size = 204126475 }, - { url = "https://files.pythonhosted.org/packages/88/8b/d60c0491ab63634763be1537ad488694d316ddc4a20eaadd639cedc53971/torch-2.6.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:ff96f4038f8af9f7ec4231710ed4549da1bdebad95923953a25045dcf6fd87e2", size = 66536783 }, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, -] - -[[package]] -name = "transformers" -version = "4.49.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "requests" }, - { name = "safetensors" }, - { name = "tokenizers" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/79/50/46573150944f46df8ec968eda854023165a84470b42f69f67c7d475dabc5/transformers-4.49.0.tar.gz", hash = "sha256:7e40e640b5b8dc3f48743f5f5adbdce3660c82baafbd3afdfc04143cdbd2089e", size = 8610952 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/37/1f29af63e9c30156a3ed6ebc2754077016577c094f31de7b2631e5d379eb/transformers-4.49.0-py3-none-any.whl", hash = "sha256:6b4fded1c5fee04d384b1014495b4235a2b53c87503d7d592423c06128cbbe03", size = 9970275 }, -] - -[[package]] -name = "triton" -version = "3.2.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/00/59500052cb1cf8cf5316be93598946bc451f14072c6ff256904428eaf03c/triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c", size = 253159365 }, - { url = "https://files.pythonhosted.org/packages/c7/30/37a3384d1e2e9320331baca41e835e90a3767303642c7a80d4510152cbcf/triton-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5dfa23ba84541d7c0a531dfce76d8bcd19159d50a4a8b14ad01e91734a5c1b0", size = 253154278 }, -] - -[[package]] -name = "typer" -version = "0.15.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 }, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/3c/4f2a430c01a22abd49a583b6b944173e39e7d01b688190a5618bd59a2e22/types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95", size = 18065 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747", size = 15836 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvicorn" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, -] - -[[package]] -name = "verifier" -version = "2.0.0" -source = { editable = "packages/verifier" } -dependencies = [ - { name = "cryptography" }, - { name = "ecdsa" }, - { name = "lxml" }, - { name = "nvidia-ml-py" }, - { name = "pyjwt" }, - { name = "pyopenssl" }, - { name = "requests" }, - { name = "signxml" }, - { name = "xmlschema" }, -] - -[package.metadata] -requires-dist = [ - { name = "cryptography", specifier = "==43.0.1" }, - { name = "ecdsa", specifier = ">=0.19.0" }, - { name = "lxml", specifier = ">=4.9.1" }, - { name = "nvidia-ml-py", specifier = ">=12.550.52" }, - { name = "pyjwt", specifier = ">=2.7.0" }, - { name = "pyopenssl", specifier = "==24.2.1" }, - { name = "requests", specifier = "==2.32.3" }, - { name = "signxml", specifier = "==3.2.0" }, - { name = "xmlschema", specifier = "==2.2.3" }, -] - -[[package]] -name = "virtualenv" -version = "20.29.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/88/dacc875dd54a8acadb4bcbfd4e3e86df8be75527116c91d8f9784f5e9cab/virtualenv-20.29.2.tar.gz", hash = "sha256:fdaabebf6d03b5ba83ae0a02cfe96f48a716f4fae556461d180825866f75b728", size = 4320272 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/fa/849483d56773ae29740ae70043ad88e068f98a6401aa819b5d6bee604683/virtualenv-20.29.2-py3-none-any.whl", hash = "sha256:febddfc3d1ea571bdb1dc0f98d7b45d24def7428214d4fb73cc486c9568cce6a", size = 4301478 }, -] - -[[package]] -name = "watchfiles" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, - { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, - { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, - { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, - { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, - { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, - { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, - { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, - { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, - { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, - { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, - { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, - { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, - { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, - { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, - { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, - { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, - { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, - { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, - { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, - { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, - { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, -] - -[[package]] -name = "web3" -version = "7.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "eth-abi" }, - { name = "eth-account" }, - { name = "eth-hash", extra = ["pycryptodome"] }, - { name = "eth-typing" }, - { name = "eth-utils" }, - { name = "hexbytes" }, - { name = "pydantic" }, - { name = "pyunormalize" }, - { name = "pywin32", marker = "sys_platform == 'win32'" }, - { name = "requests" }, - { name = "types-requests" }, - { name = "typing-extensions" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/55/943b2b544afade2f1220e4587bd7e95f8a39465d96e0c6e5029a007c6bec/web3-7.8.0.tar.gz", hash = "sha256:712bc9fd6b1ef6e467ee24c25b581e1951cab2cba17f9f548f12587734f2c857", size = 2188875 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/52/bc4a08811db59392e13bf56ada316517a83b9a6135c20d357c222c80be2d/web3-7.8.0-py3-none-any.whl", hash = "sha256:c8771b3d8772f7104a0462804449beb57d36cef7bd8b411140f95a92fc46b559", size = 1363475 }, -] - -[[package]] -name = "websockets" -version = "13.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e2/73/9223dbc7be3dcaf2a7bbf756c351ec8da04b1fa573edaf545b95f6b0c7fd/websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878", size = 158549 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/46/c426282f543b3c0296cf964aa5a7bb17e984f58dde23460c3d39b3148fcf/websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc", size = 157821 }, - { url = "https://files.pythonhosted.org/packages/aa/85/22529867010baac258da7c45848f9415e6cf37fef00a43856627806ffd04/websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49", size = 155480 }, - { url = "https://files.pythonhosted.org/packages/29/2c/bdb339bfbde0119a6e84af43ebf6275278698a2241c2719afc0d8b0bdbf2/websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd", size = 155715 }, - { url = "https://files.pythonhosted.org/packages/9f/d0/8612029ea04c5c22bf7af2fd3d63876c4eaeef9b97e86c11972a43aa0e6c/websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0", size = 165647 }, - { url = "https://files.pythonhosted.org/packages/56/04/1681ed516fa19ca9083f26d3f3a302257e0911ba75009533ed60fbb7b8d1/websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6", size = 164592 }, - { url = "https://files.pythonhosted.org/packages/38/6f/a96417a49c0ed132bb6087e8e39a37db851c70974f5c724a4b2a70066996/websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9", size = 165012 }, - { url = "https://files.pythonhosted.org/packages/40/8b/fccf294919a1b37d190e86042e1a907b8f66cff2b61e9befdbce03783e25/websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68", size = 165311 }, - { url = "https://files.pythonhosted.org/packages/c1/61/f8615cf7ce5fe538476ab6b4defff52beb7262ff8a73d5ef386322d9761d/websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14", size = 164692 }, - { url = "https://files.pythonhosted.org/packages/5c/f1/a29dd6046d3a722d26f182b783a7997d25298873a14028c4760347974ea3/websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf", size = 164686 }, - { url = "https://files.pythonhosted.org/packages/0f/99/ab1cdb282f7e595391226f03f9b498f52109d25a2ba03832e21614967dfa/websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c", size = 158712 }, - { url = "https://files.pythonhosted.org/packages/46/93/e19160db48b5581feac8468330aa11b7292880a94a37d7030478596cc14e/websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3", size = 159145 }, - { url = "https://files.pythonhosted.org/packages/51/20/2b99ca918e1cbd33c53db2cace5f0c0cd8296fc77558e1908799c712e1cd/websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6", size = 157828 }, - { url = "https://files.pythonhosted.org/packages/b8/47/0932a71d3d9c0e9483174f60713c84cee58d62839a143f21a2bcdbd2d205/websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708", size = 155487 }, - { url = "https://files.pythonhosted.org/packages/a9/60/f1711eb59ac7a6c5e98e5637fef5302f45b6f76a2c9d64fd83bbb341377a/websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418", size = 155721 }, - { url = "https://files.pythonhosted.org/packages/6a/e6/ba9a8db7f9d9b0e5f829cf626ff32677f39824968317223605a6b419d445/websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a", size = 165609 }, - { url = "https://files.pythonhosted.org/packages/c1/22/4ec80f1b9c27a0aebd84ccd857252eda8418ab9681eb571b37ca4c5e1305/websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f", size = 164556 }, - { url = "https://files.pythonhosted.org/packages/27/ac/35f423cb6bb15600438db80755609d27eda36d4c0b3c9d745ea12766c45e/websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5", size = 164993 }, - { url = "https://files.pythonhosted.org/packages/31/4e/98db4fd267f8be9e52e86b6ee4e9aa7c42b83452ea0ea0672f176224b977/websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135", size = 165360 }, - { url = "https://files.pythonhosted.org/packages/3f/15/3f0de7cda70ffc94b7e7024544072bc5b26e2c1eb36545291abb755d8cdb/websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2", size = 164745 }, - { url = "https://files.pythonhosted.org/packages/a1/6e/66b6b756aebbd680b934c8bdbb6dcb9ce45aad72cde5f8a7208dbb00dd36/websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6", size = 164732 }, - { url = "https://files.pythonhosted.org/packages/35/c6/12e3aab52c11aeb289e3dbbc05929e7a9d90d7a9173958477d3ef4f8ce2d/websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d", size = 158709 }, - { url = "https://files.pythonhosted.org/packages/41/d8/63d6194aae711d7263df4498200c690a9c39fb437ede10f3e157a6343e0d/websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2", size = 159144 }, - { url = "https://files.pythonhosted.org/packages/56/27/96a5cd2626d11c8280656c6c71d8ab50fe006490ef9971ccd154e0c42cd2/websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", size = 152134 }, -] - -[[package]] -name = "wrapt" -version = "1.17.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, - { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, - { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, - { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, - { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, - { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, - { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, - { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, - { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, - { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, - { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, - { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, - { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, - { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, - { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, - { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, - { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, - { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, - { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, - { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, - { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, - { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, - { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, - { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, - { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, - { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, - { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, - { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, - { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, - { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, - { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, - { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, - { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, -] - -[[package]] -name = "xmlschema" -version = "2.2.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "elementpath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/ff/3aaa6bf60779599427ebdb905d66d16377bcdef98d0b91b9619758069c78/xmlschema-2.2.3.tar.gz", hash = "sha256:d21ba86af4432720231fb4b40f1205fa75fd718d6856ec3b8118984de31c225b", size = 493444 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/32/aac4ca0f985a7d5e28ba8b0a90c50868b2dafa2f263f4e49e1bb852f7d95/xmlschema-2.2.3-py3-none-any.whl", hash = "sha256:7d971045eeeb8de183b56bc7530eb8f3d8276072d08017a962c2c34e93bfdd26", size = 355468 }, -] - -[[package]] -name = "yarl" -version = "1.18.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, - { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, - { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, - { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, - { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, - { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, - { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, - { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, - { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, - { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, - { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, - { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, - { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, - { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, - { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, - { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, - { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, - { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, - { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, - { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, - { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, - { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, - { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, - { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, - { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, - { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, - { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, - { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, - { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, - { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, - { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, - { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, - { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, -] From ddbf08d1280cbb99027d12b2eea5df066e109628 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 14 Mar 2025 17:29:40 -0700 Subject: [PATCH 13/20] moving verifier to own service container --- docker/verifier.Dockerfile | 16 + gpuverifier-api/.dockerignore | 10 + gpuverifier-api/.gitignore | 162 ++++ gpuverifier-api/gunicorn.conf.py | 16 + gpuverifier-api/launch.sh | 10 + gpuverifier-api/pyproject.toml | 20 + .../src/gpuverifier_api/__init__.py | 0 .../src/gpuverifier_api/__main__.py | 20 + gpuverifier-api/src/gpuverifier_api/app.py | 72 ++ gpuverifier-api/uv.lock | 869 ++++++++++++++++++ 10 files changed, 1195 insertions(+) create mode 100644 docker/verifier.Dockerfile create mode 100644 gpuverifier-api/.dockerignore create mode 100644 gpuverifier-api/.gitignore create mode 100644 gpuverifier-api/gunicorn.conf.py create mode 100755 gpuverifier-api/launch.sh create mode 100644 gpuverifier-api/pyproject.toml create mode 100644 gpuverifier-api/src/gpuverifier_api/__init__.py create mode 100644 gpuverifier-api/src/gpuverifier_api/__main__.py create mode 100644 gpuverifier-api/src/gpuverifier_api/app.py create mode 100644 gpuverifier-api/uv.lock diff --git a/docker/verifier.Dockerfile b/docker/verifier.Dockerfile new file mode 100644 index 00000000..d1d50c26 --- /dev/null +++ b/docker/verifier.Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.12-slim AS gpuverifier + +COPY --link ./gpuverifier-api /app/ + +WORKDIR /app +RUN apt-get update && \ +apt-get install curl git -y && \ +apt-get clean && \ +apt-get autoremove && \ +rm -rf /var/lib/apt/lists/* && \ +pip install --upgrade uv && \ +uv sync + +EXPOSE 8000 + +CMD ["/app/launch.sh"] diff --git a/gpuverifier-api/.dockerignore b/gpuverifier-api/.dockerignore new file mode 100644 index 00000000..570cedc3 --- /dev/null +++ b/gpuverifier-api/.dockerignore @@ -0,0 +1,10 @@ +build +*.egg-info/ +*.egg +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ diff --git a/gpuverifier-api/.gitignore b/gpuverifier-api/.gitignore new file mode 100644 index 00000000..82f92755 --- /dev/null +++ b/gpuverifier-api/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/gpuverifier-api/gunicorn.conf.py b/gpuverifier-api/gunicorn.conf.py new file mode 100644 index 00000000..dae995b5 --- /dev/null +++ b/gpuverifier-api/gunicorn.conf.py @@ -0,0 +1,16 @@ +# gunicorn.config.py + +# Bind to address and port +bind = ["0.0.0.0:8000"] + +# Set the number of workers (2) +workers = 10 + +# Set the number of threads per worker (16) +threads = 1 + +# Set the timeout (120 seconds) +timeout = 120 + +# Set the worker class to UvicornWorker for async handling +worker_class = "uvicorn.workers.UvicornWorker" diff --git a/gpuverifier-api/launch.sh b/gpuverifier-api/launch.sh new file mode 100755 index 00000000..eb730ae7 --- /dev/null +++ b/gpuverifier-api/launch.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -euo pipefail + +# Setup the multiproc directory for all guvicon workers to expose metrics together +export PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus-metrics +rm -rf "$PROMETHEUS_MULTIPROC_DIR" +mkdir -p "$PROMETHEUS_MULTIPROC_DIR" + +exec uv run gunicorn -c gunicorn.conf.py gpuverifier_api.__main__:app diff --git a/gpuverifier-api/pyproject.toml b/gpuverifier-api/pyproject.toml new file mode 100644 index 00000000..98507b20 --- /dev/null +++ b/gpuverifier-api/pyproject.toml @@ -0,0 +1,20 @@ +[project] +name = "gpuverifier-api" +version = "0.1.0" +description = "Simple fastapi to wrap the verifier package" +readme = "README.md" +authors = [ + { name = "José Cabrero-Holgueras", email = "jose.cabrero@nillion.com" }, + { name = "Nicholas Wehr", email = "nicholas.wehr@nillion.com" } +] +requires-python = ">=3.12" +dependencies = [ + "fastapi[standard]>=0.115.5", + "gunicorn>=23.0.0", + "nv-local-gpu-verifier", + "prometheus_fastapi_instrumentator>=7.0.2", + "uvicorn>=0.32.1" +] + +[tool.uv.sources] +nv-local-gpu-verifier = { git = "https://github.com/Azure/az-cgpu-onboarding.git", subdirectory = "src/local_gpu_verifier", tag = "V3.2.3" } diff --git a/gpuverifier-api/src/gpuverifier_api/__init__.py b/gpuverifier-api/src/gpuverifier_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gpuverifier-api/src/gpuverifier_api/__main__.py b/gpuverifier-api/src/gpuverifier_api/__main__.py new file mode 100644 index 00000000..e5f48db0 --- /dev/null +++ b/gpuverifier-api/src/gpuverifier_api/__main__.py @@ -0,0 +1,20 @@ +import uvicorn +from gpuverifier_api.app import app + + +def run_uvicorn(): + """ + Function to run the app with Uvicorn for debugging. + """ + uvicorn.run( + app, + host="0.0.0.0", # Listen on all interfaces + port=8000, # Use the desired port + reload=True, # Enable auto-reload for development + # ssl_certfile=SSL_CERTFILE, + # ssl_keyfile=SSL_KEYFILE, + ) + + +if __name__ == "__main__": + run_uvicorn() diff --git a/gpuverifier-api/src/gpuverifier_api/app.py b/gpuverifier-api/src/gpuverifier_api/app.py new file mode 100644 index 00000000..317e2e66 --- /dev/null +++ b/gpuverifier-api/src/gpuverifier_api/app.py @@ -0,0 +1,72 @@ +# simple_gpu_attestation_service.py +from fastapi import FastAPI, HTTPException +import asyncio +import secrets +import json +import base64 +import logging +from typing import Dict, Any + +# Import the verifier functions +from verifier.cc_admin import collect_gpu_evidence, attest + +app = FastAPI(title="Simple GPU Attestation Service") + +@app.get("/") +async def root(): + return {"status": "GPU Attestation Service is running"} + +@app.post("/attest-gpu", response_model=Dict[str, str]) +async def get_gpu_attestation(): + """Get GPU attestation and return the quote""" + try: + # Run the attestation in a thread pool to avoid blocking + loop = asyncio.get_event_loop() + result = await loop.run_in_executor(None, gpu_attestation) + + return {"gpu_quote": result} + except Exception as e: + logging.error("Error in attestation endpoint: %s", str(e)) + raise HTTPException(status_code=500, detail=f"Error getting GPU attestation: {str(e)}") + +def gpu_attestation() -> str: + # Check if GPU is available + try: + nonce = secrets.token_bytes(32).hex() + arguments_as_dictionary = { + "nonce": nonce, + "verbose": False, + "test_no_gpu": False, + "rim_root_cert": None, + "rim_service_url": None, + "ocsp_service_url": None, + "ocsp_attestation_settings": "default", + "allow_hold_cert": None, + "ocsp_validity_extension": None, + "ocsp_cert_revocation_extension_device": None, + "ocsp_cert_revocation_extension_driver_rim": None, + "ocsp_cert_revocation_extension_vbios_rim": None, + } + evidence_list = collect_gpu_evidence( + nonce, + ) + result, jwt_token = attest(arguments_as_dictionary, nonce, evidence_list) + gpu_quote = base64.b64encode( + json.dumps({"result": result, "jwt_token": jwt_token}).encode() + ).decode() + return gpu_quote + except Exception as e: + logging.error("Could not attest GPU: %s", e) + # Return empty string or specific error indicator + return "" + +if __name__ == "__main__": + import uvicorn + + # Configure logging + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/gpuverifier-api/uv.lock b/gpuverifier-api/uv.lock new file mode 100644 index 00000000..8bb082a4 --- /dev/null +++ b/gpuverifier-api/uv.lock @@ -0,0 +1,869 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "cryptography" +version = "43.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/ba/0664727028b37e249e73879348cc46d45c5c1a2a2e81e8166462953c5755/cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", size = 686927 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/28/b92c98a04ba762f8cdeb54eba5c4c84e63cac037a7c5e70117d337b15ad6/cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", size = 6223222 }, + { url = "https://files.pythonhosted.org/packages/33/13/1193774705783ba364121aa2a60132fa31a668b8ababd5edfa1662354ccd/cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", size = 3794751 }, + { url = "https://files.pythonhosted.org/packages/5e/4b/39bb3c4c8cfb3e94e736b8d8859ce5c81536e91a1033b1d26770c4249000/cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", size = 3981827 }, + { url = "https://files.pythonhosted.org/packages/ce/dc/1471d4d56608e1013237af334b8a4c35d53895694fbb73882d1c4fd3f55e/cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", size = 3780034 }, + { url = "https://files.pythonhosted.org/packages/ad/43/7a9920135b0d5437cc2f8f529fa757431eb6a7736ddfadfdee1cc5890800/cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", size = 3993407 }, + { url = "https://files.pythonhosted.org/packages/cc/42/9ab8467af6c0b76f3d9b8f01d1cf25b9c9f3f2151f4acfab888d21c55a72/cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", size = 3886457 }, + { url = "https://files.pythonhosted.org/packages/a4/65/430509e31700286ec02868a2457d2111d03ccefc20349d24e58d171ae0a7/cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", size = 4081499 }, + { url = "https://files.pythonhosted.org/packages/bb/18/a04b6467e6e09df8c73b91dcee8878f4a438a43a3603dc3cd6f8003b92d8/cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", size = 2616504 }, + { url = "https://files.pythonhosted.org/packages/cc/73/0eacbdc437202edcbdc07f3576ed8fb8b0ab79d27bf2c5d822d758a72faa/cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", size = 3067456 }, + { url = "https://files.pythonhosted.org/packages/8a/b6/bc54b371f02cffd35ff8dc6baba88304d7cf8e83632566b4b42e00383e03/cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", size = 6225263 }, + { url = "https://files.pythonhosted.org/packages/00/0e/8217e348a1fa417ec4c78cd3cdf24154f5e76fd7597343a35bd403650dfd/cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", size = 3794368 }, + { url = "https://files.pythonhosted.org/packages/3d/ed/38b6be7254d8f7251fde8054af597ee8afa14f911da67a9410a45f602fc3/cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", size = 3981750 }, + { url = "https://files.pythonhosted.org/packages/64/f3/b7946c3887cf7436f002f4cbb1e6aec77b8d299b86be48eeadfefb937c4b/cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", size = 3778925 }, + { url = "https://files.pythonhosted.org/packages/ac/7e/ebda4dd4ae098a0990753efbb4b50954f1d03003846b943ea85070782da7/cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", size = 3993152 }, + { url = "https://files.pythonhosted.org/packages/43/f6/feebbd78a3e341e3913846a3bb2c29d0b09b1b3af1573c6baabc2533e147/cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", size = 3886392 }, + { url = "https://files.pythonhosted.org/packages/bd/4c/ab0b9407d5247576290b4fd8abd06b7f51bd414f04eef0f2800675512d61/cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", size = 4082606 }, + { url = "https://files.pythonhosted.org/packages/05/36/e532a671998d6fcfdb9122da16434347a58a6bae9465e527e450e0bc60a5/cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", size = 2617948 }, + { url = "https://files.pythonhosted.org/packages/b3/c6/c09cee6968add5ff868525c3815e5dccc0e3c6e89eec58dc9135d3c40e88/cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", size = 3070445 }, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, +] + +[[package]] +name = "ecdsa" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/7b/ba6547a76c468a0d22de93e89ae60d9561ec911f59532907e72b0d8bc0f1/ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49", size = 197938 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", size = 142915 }, +] + +[[package]] +name = "elementpath" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/41/afdd82534c80e9675d1c51dc21d0889b72d023bfe395a2f5a44d751d3a73/elementpath-4.8.0.tar.gz", hash = "sha256:5822a2560d99e2633d95f78694c7ff9646adaa187db520da200a8e9479dc46ae", size = 358528 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/95/615af832e7f507fe5ce4562b4be1bd2fec080c4ff6da88dcd0c2dbfca582/elementpath-4.8.0-py3-none-any.whl", hash = "sha256:5393191f84969bcf8033b05ec4593ef940e58622ea13cefe60ecefbbf09d58d9", size = 243271 }, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, +] + +[[package]] +name = "fastapi" +version = "0.115.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/28/c5d26e5860df807241909a961a37d45e10533acef95fc368066c7dd186cd/fastapi-0.115.11.tar.gz", hash = "sha256:cc81f03f688678b92600a65a5e618b93592c65005db37157147204d8924bf94f", size = 294441 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/5d/4d8bbb94f0dbc22732350c06965e40740f4a92ca560e90bb566f4f73af41/fastapi-0.115.11-py3-none-any.whl", hash = "sha256:32e1541b7b74602e4ef4a0260ecaf3aadf9d4f19590bba3e1bf2ac4666aa2c64", size = 94926 }, +] + +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, +] + +[package.optional-dependencies] +standard = [ + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "gpuverifier-api" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "fastapi", extra = ["standard"] }, + { name = "gunicorn" }, + { name = "nv-local-gpu-verifier" }, + { name = "prometheus-fastapi-instrumentator" }, + { name = "uvicorn" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastapi", extras = ["standard"], specifier = ">=0.115.5" }, + { name = "gunicorn", specifier = ">=23.0.0" }, + { name = "nv-local-gpu-verifier", git = "https://github.com/Azure/az-cgpu-onboarding.git?subdirectory=src%2Flocal_gpu_verifier&tag=V3.2.3" }, + { name = "prometheus-fastapi-instrumentator", specifier = ">=7.0.2" }, + { name = "uvicorn", specifier = ">=0.32.1" }, +] + +[[package]] +name = "gunicorn" +version = "23.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + +[[package]] +name = "lxml" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/14/c2070b5e37c650198de8328467dd3d1681e80986f81ba0fea04fc4ec9883/lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e", size = 3576664 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/ac/0abe4b25cae50247c5130539d0f45a201dbfe0ba69d3dd844411f90c9930/lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8", size = 8624172 }, + { url = "https://files.pythonhosted.org/packages/33/e6/47c4675f0c58398c924915379eee8458bf7954644a7907ad8fbc1c42a380/lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229", size = 7674086 }, + { url = "https://files.pythonhosted.org/packages/be/9e/5d88b189e91fae65140dc29904946297b3d9cfdf5449d4bc6e657a3ffc2d/lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d", size = 8026189 }, + { url = "https://files.pythonhosted.org/packages/ea/08/ab6c2a803a5d5dce1fbbb32f5c133bbd0ebfe69476ab1eb5ffa3490b0b51/lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20", size = 7516933 }, + { url = "https://files.pythonhosted.org/packages/43/52/b0d387577620af767c73b8b20f28986e5aad70b44053ee296f8a472a12b1/lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10", size = 7815609 }, + { url = "https://files.pythonhosted.org/packages/be/13/18230c0d567ed282a3d7b61395323e2ef8fc9ad64096fdd3d1b384fa3e3c/lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b", size = 3460500 }, + { url = "https://files.pythonhosted.org/packages/5f/df/6d15cc415e04724ba4c141051cf43709e09bbcdd9868a6c2e7a7073ef498/lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56", size = 3773977 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "nv-local-gpu-verifier" +version = "2.1.1" +source = { git = "https://github.com/Azure/az-cgpu-onboarding.git?subdirectory=src%2Flocal_gpu_verifier&tag=V3.2.3#c13a407ce85cb60a78408d46831b750deee57c99" } +dependencies = [ + { name = "cryptography" }, + { name = "ecdsa" }, + { name = "lxml" }, + { name = "nvidia-ml-py" }, + { name = "pyjwt" }, + { name = "pyopenssl" }, + { name = "requests" }, + { name = "signxml" }, + { name = "xmlschema" }, +] + +[[package]] +name = "nvidia-ml-py" +version = "12.550.52" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/f0/7a123ecef9994f4551820e96575475df25bdb8038904723f7ea6de943234/nvidia-ml-py-12.550.52.tar.gz", hash = "sha256:dfedd714335c72e65a32c86e9f5db1cd49526d44d6d8c72809d996958f734c07", size = 37971 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/fb/4abda63f347daa50fcbf068ebfe37e10e247565af5df8473ddb7b3836ba4/nvidia_ml_py-12.550.52-py3-none-any.whl", hash = "sha256:b78a1175f299f702dea17fc468676443f3fefade880202da8d0997df15dc11e2", size = 39295 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, +] + +[[package]] +name = "prometheus-fastapi-instrumentator" +version = "7.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prometheus-client" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/01/e3ccb464ba9bf6c001ad85652e6fc7e63098c2685275a682cabc8e7871b8/prometheus_fastapi_instrumentator-7.0.2.tar.gz", hash = "sha256:8a4d8fb13dbe19d2882ac6af9ce236e4e1f98dc48e3fa44fe88d8e23ac3c953f", size = 19844 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/f7/a67e804853d05b3f1f5def0ebd662b9f48dbcfe0b452f0aa5d4c183a6f86/prometheus_fastapi_instrumentator-7.0.2-py3-none-any.whl", hash = "sha256:975e39992acb7a112758ff13ba95317e6c54d1bbf605f9156f31ac9f2800c32d", size = 18998 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyjwt" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/f0/9804c72e9a314360c135f42c434eb42eaabb5e7ebad760cbd8fc7023be38/PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074", size = 77902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/e8/01b2e35d81e618a8212e651e10c91660bdfda49c1d15ce66f4ca1ff43649/PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", size = 22366 }, +] + +[[package]] +name = "pyopenssl" +version = "24.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/70/ff56a63248562e77c0c8ee4aefc3224258f1856977e0c1472672b62dadb8/pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", size = 184323 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/dd/e0aa7ebef5168c75b772eda64978c597a9129b46be17779054652a7999e4/pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d", size = 58390 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + +[[package]] +name = "rich-toolkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/71cfbf6bf6257ea785d1f030c22468f763eea1b3e5417620f2ba9abd6dca/rich_toolkit-0.13.2.tar.gz", hash = "sha256:fea92557530de7c28f121cbed572ad93d9e0ddc60c3ca643f1b831f2f56b95d3", size = 72288 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/1b/1c2f43af46456050b27810a7a013af8a7e12bc545a0cdc00eb0df55eb769/rich_toolkit-0.13.2-py3-none-any.whl", hash = "sha256:f3f6c583e5283298a2f7dbd3c65aca18b7f818ad96174113ab5bec0b0e35ed61", size = 13566 }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "signxml" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "cryptography" }, + { name = "lxml" }, + { name = "pyopenssl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/f3/6910019f60efba3d76e42540013cb27203a41eaa9bc2ec9edbb2e0d7623f/signxml-3.2.0.tar.gz", hash = "sha256:da4a85c272998bb3a18211f9e21cbfe1359b756706bc4bddbeb4020babdab7ef", size = 58650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/4b/1e3f14db5967ae48064cdff7683f52e0c492c6d98a40285a6a4bf449149f/signxml-3.2.0-py3-none-any.whl", hash = "sha256:0ee07e3e8fcba8fa0975f5bf9e205e557ea3f0b34ea95b4fde1c897e75c4812c", size = 57867 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "starlette" +version = "0.46.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, +] + +[[package]] +name = "typer" +version = "0.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "uvicorn" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, +] + +[[package]] +name = "watchfiles" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, + { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, + { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, + { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, + { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, + { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, + { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, + { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, + { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, + { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, + { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, + { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, + { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, + { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, + { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, + { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, + { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, + { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, + { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, + { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, + { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, + { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, + { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, + { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, + { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, +] + +[[package]] +name = "xmlschema" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "elementpath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/ff/3aaa6bf60779599427ebdb905d66d16377bcdef98d0b91b9619758069c78/xmlschema-2.2.3.tar.gz", hash = "sha256:d21ba86af4432720231fb4b40f1205fa75fd718d6856ec3b8118984de31c225b", size = 493444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/32/aac4ca0f985a7d5e28ba8b0a90c50868b2dafa2f263f4e49e1bb852f7d95/xmlschema-2.2.3-py3-none-any.whl", hash = "sha256:7d971045eeeb8de183b56bc7530eb8f3d8276072d08017a962c2c34e93bfdd26", size = 355468 }, +] From c805836f485ae283e8fbaee5c2d22c30b0eb8450 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Sat, 15 Mar 2025 01:09:12 +0000 Subject: [PATCH 14/20] fixed up gpuverifier dockerfile build --- docker/verifier.Dockerfile | 8 +- gpuverifier-api/launch.sh | 2 +- gpuverifier-api/uv.lock | 869 ------------------------------------- 3 files changed, 2 insertions(+), 877 deletions(-) delete mode 100644 gpuverifier-api/uv.lock diff --git a/docker/verifier.Dockerfile b/docker/verifier.Dockerfile index d1d50c26..33bb53d0 100644 --- a/docker/verifier.Dockerfile +++ b/docker/verifier.Dockerfile @@ -3,13 +3,7 @@ FROM python:3.12-slim AS gpuverifier COPY --link ./gpuverifier-api /app/ WORKDIR /app -RUN apt-get update && \ -apt-get install curl git -y && \ -apt-get clean && \ -apt-get autoremove && \ -rm -rf /var/lib/apt/lists/* && \ -pip install --upgrade uv && \ -uv sync +RUN pip install --upgrade . EXPOSE 8000 diff --git a/gpuverifier-api/launch.sh b/gpuverifier-api/launch.sh index eb730ae7..36e06732 100755 --- a/gpuverifier-api/launch.sh +++ b/gpuverifier-api/launch.sh @@ -7,4 +7,4 @@ export PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus-metrics rm -rf "$PROMETHEUS_MULTIPROC_DIR" mkdir -p "$PROMETHEUS_MULTIPROC_DIR" -exec uv run gunicorn -c gunicorn.conf.py gpuverifier_api.__main__:app +exec gunicorn -c gunicorn.conf.py gpuverifier_api.__main__:app diff --git a/gpuverifier-api/uv.lock b/gpuverifier-api/uv.lock deleted file mode 100644 index 8bb082a4..00000000 --- a/gpuverifier-api/uv.lock +++ /dev/null @@ -1,869 +0,0 @@ -version = 1 -requires-python = ">=3.12" - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "cryptography" -version = "43.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/de/ba/0664727028b37e249e73879348cc46d45c5c1a2a2e81e8166462953c5755/cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", size = 686927 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/28/b92c98a04ba762f8cdeb54eba5c4c84e63cac037a7c5e70117d337b15ad6/cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", size = 6223222 }, - { url = "https://files.pythonhosted.org/packages/33/13/1193774705783ba364121aa2a60132fa31a668b8ababd5edfa1662354ccd/cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", size = 3794751 }, - { url = "https://files.pythonhosted.org/packages/5e/4b/39bb3c4c8cfb3e94e736b8d8859ce5c81536e91a1033b1d26770c4249000/cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", size = 3981827 }, - { url = "https://files.pythonhosted.org/packages/ce/dc/1471d4d56608e1013237af334b8a4c35d53895694fbb73882d1c4fd3f55e/cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", size = 3780034 }, - { url = "https://files.pythonhosted.org/packages/ad/43/7a9920135b0d5437cc2f8f529fa757431eb6a7736ddfadfdee1cc5890800/cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", size = 3993407 }, - { url = "https://files.pythonhosted.org/packages/cc/42/9ab8467af6c0b76f3d9b8f01d1cf25b9c9f3f2151f4acfab888d21c55a72/cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", size = 3886457 }, - { url = "https://files.pythonhosted.org/packages/a4/65/430509e31700286ec02868a2457d2111d03ccefc20349d24e58d171ae0a7/cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", size = 4081499 }, - { url = "https://files.pythonhosted.org/packages/bb/18/a04b6467e6e09df8c73b91dcee8878f4a438a43a3603dc3cd6f8003b92d8/cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", size = 2616504 }, - { url = "https://files.pythonhosted.org/packages/cc/73/0eacbdc437202edcbdc07f3576ed8fb8b0ab79d27bf2c5d822d758a72faa/cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", size = 3067456 }, - { url = "https://files.pythonhosted.org/packages/8a/b6/bc54b371f02cffd35ff8dc6baba88304d7cf8e83632566b4b42e00383e03/cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", size = 6225263 }, - { url = "https://files.pythonhosted.org/packages/00/0e/8217e348a1fa417ec4c78cd3cdf24154f5e76fd7597343a35bd403650dfd/cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", size = 3794368 }, - { url = "https://files.pythonhosted.org/packages/3d/ed/38b6be7254d8f7251fde8054af597ee8afa14f911da67a9410a45f602fc3/cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", size = 3981750 }, - { url = "https://files.pythonhosted.org/packages/64/f3/b7946c3887cf7436f002f4cbb1e6aec77b8d299b86be48eeadfefb937c4b/cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", size = 3778925 }, - { url = "https://files.pythonhosted.org/packages/ac/7e/ebda4dd4ae098a0990753efbb4b50954f1d03003846b943ea85070782da7/cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", size = 3993152 }, - { url = "https://files.pythonhosted.org/packages/43/f6/feebbd78a3e341e3913846a3bb2c29d0b09b1b3af1573c6baabc2533e147/cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", size = 3886392 }, - { url = "https://files.pythonhosted.org/packages/bd/4c/ab0b9407d5247576290b4fd8abd06b7f51bd414f04eef0f2800675512d61/cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", size = 4082606 }, - { url = "https://files.pythonhosted.org/packages/05/36/e532a671998d6fcfdb9122da16434347a58a6bae9465e527e450e0bc60a5/cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", size = 2617948 }, - { url = "https://files.pythonhosted.org/packages/b3/c6/c09cee6968add5ff868525c3815e5dccc0e3c6e89eec58dc9135d3c40e88/cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", size = 3070445 }, -] - -[[package]] -name = "dnspython" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, -] - -[[package]] -name = "ecdsa" -version = "0.18.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/7b/ba6547a76c468a0d22de93e89ae60d9561ec911f59532907e72b0d8bc0f1/ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49", size = 197938 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", size = 142915 }, -] - -[[package]] -name = "elementpath" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/41/afdd82534c80e9675d1c51dc21d0889b72d023bfe395a2f5a44d751d3a73/elementpath-4.8.0.tar.gz", hash = "sha256:5822a2560d99e2633d95f78694c7ff9646adaa187db520da200a8e9479dc46ae", size = 358528 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/95/615af832e7f507fe5ce4562b4be1bd2fec080c4ff6da88dcd0c2dbfca582/elementpath-4.8.0-py3-none-any.whl", hash = "sha256:5393191f84969bcf8033b05ec4593ef940e58622ea13cefe60ecefbbf09d58d9", size = 243271 }, -] - -[[package]] -name = "email-validator" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dnspython" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, -] - -[[package]] -name = "fastapi" -version = "0.115.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b5/28/c5d26e5860df807241909a961a37d45e10533acef95fc368066c7dd186cd/fastapi-0.115.11.tar.gz", hash = "sha256:cc81f03f688678b92600a65a5e618b93592c65005db37157147204d8924bf94f", size = 294441 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/5d/4d8bbb94f0dbc22732350c06965e40740f4a92ca560e90bb566f4f73af41/fastapi-0.115.11-py3-none-any.whl", hash = "sha256:32e1541b7b74602e4ef4a0260ecaf3aadf9d4f19590bba3e1bf2ac4666aa2c64", size = 94926 }, -] - -[package.optional-dependencies] -standard = [ - { name = "email-validator" }, - { name = "fastapi-cli", extra = ["standard"] }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "python-multipart" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[[package]] -name = "fastapi-cli" -version = "0.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "rich-toolkit" }, - { name = "typer" }, - { name = "uvicorn", extra = ["standard"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, -] - -[package.optional-dependencies] -standard = [ - { name = "uvicorn", extra = ["standard"] }, -] - -[[package]] -name = "gpuverifier-api" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "fastapi", extra = ["standard"] }, - { name = "gunicorn" }, - { name = "nv-local-gpu-verifier" }, - { name = "prometheus-fastapi-instrumentator" }, - { name = "uvicorn" }, -] - -[package.metadata] -requires-dist = [ - { name = "fastapi", extras = ["standard"], specifier = ">=0.115.5" }, - { name = "gunicorn", specifier = ">=23.0.0" }, - { name = "nv-local-gpu-verifier", git = "https://github.com/Azure/az-cgpu-onboarding.git?subdirectory=src%2Flocal_gpu_verifier&tag=V3.2.3" }, - { name = "prometheus-fastapi-instrumentator", specifier = ">=7.0.2" }, - { name = "uvicorn", specifier = ">=0.32.1" }, -] - -[[package]] -name = "gunicorn" -version = "23.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httptools" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, -] - -[[package]] -name = "lxml" -version = "4.9.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/14/c2070b5e37c650198de8328467dd3d1681e80986f81ba0fea04fc4ec9883/lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e", size = 3576664 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/ac/0abe4b25cae50247c5130539d0f45a201dbfe0ba69d3dd844411f90c9930/lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8", size = 8624172 }, - { url = "https://files.pythonhosted.org/packages/33/e6/47c4675f0c58398c924915379eee8458bf7954644a7907ad8fbc1c42a380/lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229", size = 7674086 }, - { url = "https://files.pythonhosted.org/packages/be/9e/5d88b189e91fae65140dc29904946297b3d9cfdf5449d4bc6e657a3ffc2d/lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d", size = 8026189 }, - { url = "https://files.pythonhosted.org/packages/ea/08/ab6c2a803a5d5dce1fbbb32f5c133bbd0ebfe69476ab1eb5ffa3490b0b51/lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20", size = 7516933 }, - { url = "https://files.pythonhosted.org/packages/43/52/b0d387577620af767c73b8b20f28986e5aad70b44053ee296f8a472a12b1/lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10", size = 7815609 }, - { url = "https://files.pythonhosted.org/packages/be/13/18230c0d567ed282a3d7b61395323e2ef8fc9ad64096fdd3d1b384fa3e3c/lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b", size = 3460500 }, - { url = "https://files.pythonhosted.org/packages/5f/df/6d15cc415e04724ba4c141051cf43709e09bbcdd9868a6c2e7a7073ef498/lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56", size = 3773977 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "nv-local-gpu-verifier" -version = "2.1.1" -source = { git = "https://github.com/Azure/az-cgpu-onboarding.git?subdirectory=src%2Flocal_gpu_verifier&tag=V3.2.3#c13a407ce85cb60a78408d46831b750deee57c99" } -dependencies = [ - { name = "cryptography" }, - { name = "ecdsa" }, - { name = "lxml" }, - { name = "nvidia-ml-py" }, - { name = "pyjwt" }, - { name = "pyopenssl" }, - { name = "requests" }, - { name = "signxml" }, - { name = "xmlschema" }, -] - -[[package]] -name = "nvidia-ml-py" -version = "12.550.52" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/f0/7a123ecef9994f4551820e96575475df25bdb8038904723f7ea6de943234/nvidia-ml-py-12.550.52.tar.gz", hash = "sha256:dfedd714335c72e65a32c86e9f5db1cd49526d44d6d8c72809d996958f734c07", size = 37971 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/fb/4abda63f347daa50fcbf068ebfe37e10e247565af5df8473ddb7b3836ba4/nvidia_ml_py-12.550.52-py3-none-any.whl", hash = "sha256:b78a1175f299f702dea17fc468676443f3fefade880202da8d0997df15dc11e2", size = 39295 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "prometheus-client" -version = "0.21.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, -] - -[[package]] -name = "prometheus-fastapi-instrumentator" -version = "7.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "prometheus-client" }, - { name = "starlette" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/01/e3ccb464ba9bf6c001ad85652e6fc7e63098c2685275a682cabc8e7871b8/prometheus_fastapi_instrumentator-7.0.2.tar.gz", hash = "sha256:8a4d8fb13dbe19d2882ac6af9ce236e4e1f98dc48e3fa44fe88d8e23ac3c953f", size = 19844 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/f7/a67e804853d05b3f1f5def0ebd662b9f48dbcfe0b452f0aa5d4c183a6f86/prometheus_fastapi_instrumentator-7.0.2-py3-none-any.whl", hash = "sha256:975e39992acb7a112758ff13ba95317e6c54d1bbf605f9156f31ac9f2800c32d", size = 18998 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pyjwt" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/f0/9804c72e9a314360c135f42c434eb42eaabb5e7ebad760cbd8fc7023be38/PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074", size = 77902 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/e8/01b2e35d81e618a8212e651e10c91660bdfda49c1d15ce66f4ca1ff43649/PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", size = 22366 }, -] - -[[package]] -name = "pyopenssl" -version = "24.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5d/70/ff56a63248562e77c0c8ee4aefc3224258f1856977e0c1472672b62dadb8/pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", size = 184323 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/dd/e0aa7ebef5168c75b772eda64978c597a9129b46be17779054652a7999e4/pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d", size = 58390 }, -] - -[[package]] -name = "python-dotenv" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, -] - -[[package]] -name = "python-multipart" -version = "0.0.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "rich" -version = "13.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, -] - -[[package]] -name = "rich-toolkit" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/71cfbf6bf6257ea785d1f030c22468f763eea1b3e5417620f2ba9abd6dca/rich_toolkit-0.13.2.tar.gz", hash = "sha256:fea92557530de7c28f121cbed572ad93d9e0ddc60c3ca643f1b831f2f56b95d3", size = 72288 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/1b/1c2f43af46456050b27810a7a013af8a7e12bc545a0cdc00eb0df55eb769/rich_toolkit-0.13.2-py3-none-any.whl", hash = "sha256:f3f6c583e5283298a2f7dbd3c65aca18b7f818ad96174113ab5bec0b0e35ed61", size = 13566 }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - -[[package]] -name = "signxml" -version = "3.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "cryptography" }, - { name = "lxml" }, - { name = "pyopenssl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/46/f3/6910019f60efba3d76e42540013cb27203a41eaa9bc2ec9edbb2e0d7623f/signxml-3.2.0.tar.gz", hash = "sha256:da4a85c272998bb3a18211f9e21cbfe1359b756706bc4bddbeb4020babdab7ef", size = 58650 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/4b/1e3f14db5967ae48064cdff7683f52e0c492c6d98a40285a6a4bf449149f/signxml-3.2.0-py3-none-any.whl", hash = "sha256:0ee07e3e8fcba8fa0975f5bf9e205e557ea3f0b34ea95b4fde1c897e75c4812c", size = 57867 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "starlette" -version = "0.46.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, -] - -[[package]] -name = "typer" -version = "0.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvicorn" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, -] - -[[package]] -name = "watchfiles" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, - { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, - { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, - { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, - { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, - { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, - { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, - { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, - { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, - { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, - { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, - { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, - { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, - { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, - { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, - { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, - { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, - { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, - { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, - { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, - { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, - { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, -] - -[[package]] -name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, -] - -[[package]] -name = "xmlschema" -version = "2.2.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "elementpath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/ff/3aaa6bf60779599427ebdb905d66d16377bcdef98d0b91b9619758069c78/xmlschema-2.2.3.tar.gz", hash = "sha256:d21ba86af4432720231fb4b40f1205fa75fd718d6856ec3b8118984de31c225b", size = 493444 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/32/aac4ca0f985a7d5e28ba8b0a90c50868b2dafa2f263f4e49e1bb852f7d95/xmlschema-2.2.3-py3-none-any.whl", hash = "sha256:7d971045eeeb8de183b56bc7530eb8f3d8276072d08017a962c2c34e93bfdd26", size = 355468 }, -] From 36117a3bb263884dc3fbecf3a6618b805cd4ec49 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Sat, 15 Mar 2025 01:25:32 +0000 Subject: [PATCH 15/20] updated docker compose with healthcheck; updated nilai-api to use new backend service instead of inline gpu verifier --- docker-compose.yml | 17 +++++++++++ docker/verifier.Dockerfile | 9 +++++- nilai-api/pyproject.toml | 2 -- nilai-api/src/nilai_api/config/__init__.py | 1 + nilai-api/src/nilai_api/state.py | 34 ++++------------------ 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3aff51c8..858449ce 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,6 +102,19 @@ services: retries: 3 start_period: 10s + gpuverifier: + container_name: gpuverifier-api + build: + context: . + dockerfile: docker/verifier.Dockerfile + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/"] + interval: 10s + timeout: 5s + retries: 3 + start_period: 5s + networks: + - backend_net api: container_name: nilai-api build: @@ -113,6 +126,8 @@ services: condition: service_healthy postgres: condition: service_healthy + gpuverifier: + condition: service_healthy deploy: resources: reservations: @@ -124,6 +139,8 @@ services: networks: - frontend_net - backend_net + environment: + - GPUVERIFIER_API=http://gpuverifier:8000 env_file: - .env healthcheck: diff --git a/docker/verifier.Dockerfile b/docker/verifier.Dockerfile index 33bb53d0..4e15c5f1 100644 --- a/docker/verifier.Dockerfile +++ b/docker/verifier.Dockerfile @@ -2,8 +2,15 @@ FROM python:3.12-slim AS gpuverifier COPY --link ./gpuverifier-api /app/ +ENV PATH="/venv/bin:$PATH" + WORKDIR /app -RUN pip install --upgrade . +RUN apt-get update && \ +apt-get install curl -y && \ +apt-get clean && \ +apt-get autoremove && \ +rm -rf /var/lib/apt/lists/* && \ +pip install --upgrade . EXPOSE 8000 diff --git a/nilai-api/pyproject.toml b/nilai-api/pyproject.toml index 479000b2..b3f76372 100644 --- a/nilai-api/pyproject.toml +++ b/nilai-api/pyproject.toml @@ -29,7 +29,6 @@ dependencies = [ "greenlet>=3.1.1", "redis>=5.2.1", "authlib>=1.4.1", - "verifier", "web3>=7.8.0", "pyjwt>=2.10.1", "jsonschema>=4.23.0", @@ -45,7 +44,6 @@ build-backend = "hatchling.build" [tool.uv.sources] nilai-common = { workspace = true } -verifier = { workspace = true } [tool.hatch.metadata] allow-direct-references = true diff --git a/nilai-api/src/nilai_api/config/__init__.py b/nilai-api/src/nilai_api/config/__init__.py index 79ba8478..05a8cb5c 100644 --- a/nilai-api/src/nilai_api/config/__init__.py +++ b/nilai-api/src/nilai_api/config/__init__.py @@ -10,6 +10,7 @@ ETCD_HOST = os.getenv("ETCD_HOST", "localhost") ETCD_PORT = int(os.getenv("ETCD_PORT", 2379)) +GPUVERIFIER_API = os.getenv("GPUVERIFIER_API", "http://localhost:8000") REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") diff --git a/nilai-api/src/nilai_api/state.py b/nilai-api/src/nilai_api/state.py index 504d4050..c5dba7dd 100644 --- a/nilai-api/src/nilai_api/state.py +++ b/nilai-api/src/nilai_api/state.py @@ -1,6 +1,7 @@ import logging import time from asyncio import Semaphore +import os from typing import Dict, Optional from nilai_api import config @@ -8,10 +9,8 @@ from nilai_api.sev.sev import sev from nilai_common import ModelServiceDiscovery from nilai_common.api_model import ModelEndpoint -from verifier.cc_admin import collect_gpu_evidence, attest -import secrets -import json -import base64 +# from verifier.cc_admin import collect_gpu_evidence, attest +import requests logger = logging.getLogger("uvicorn.error") @@ -40,31 +39,10 @@ def cpu_attestation(self) -> str: @property def gpu_attestation(self) -> str: - # Check if GPU is available try: - nonce = secrets.token_bytes(32).hex() - arguments_as_dictionary = { - "nonce": nonce, - "verbose": False, - "test_no_gpu": False, - "rim_root_cert": None, - "rim_service_url": None, - "ocsp_service_url": None, - "ocsp_attestation_settings": "default", - "allow_hold_cert": None, - "ocsp_validity_extension": None, - "ocsp_cert_revocation_extension_device": None, - "ocsp_cert_revocation_extension_driver_rim": None, - "ocsp_cert_revocation_extension_vbios_rim": None, - } - evidence_list = collect_gpu_evidence( - nonce, - ) - result, jwt_token = attest(arguments_as_dictionary, nonce, evidence_list) - self._gpu_quote = base64.b64encode( - json.dumps({"result": result, "jwt_token": jwt_token}).encode() - ).decode() - return self._gpu_quote + res = requests.get(config.GPUVERIFIER_API) + res.raise_for_status() + return str(res.content) except Exception as e: logging.error("Could not attest GPU: %s", e) return self._gpu_quote From cf62245a39efb3a249b46a49f6023a31b092160c Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Sat, 15 Mar 2025 02:00:37 +0000 Subject: [PATCH 16/20] removed verifier from nilai-api build workspace --- docker/api.Dockerfile | 2 +- packages/verifier/LICENSE.txt | 342 ------- packages/verifier/README.md | 124 --- packages/verifier/pyproject.toml | 40 - packages/verifier/src/verifier/__about__.py | 40 - packages/verifier/src/verifier/__init__.py | 0 .../src/verifier/attestation/__init__.py | 237 ----- .../verifier/attestation/spdm_msrt_req_msg.py | 223 ---- .../attestation/spdm_msrt_resp_msg.py | 749 -------------- packages/verifier/src/verifier/cc_admin.py | 772 -------------- .../verifier/src/verifier/cc_admin_utils.py | 959 ------------------ .../src/verifier/certs/verifier_RIM_root.pem | 14 - .../verifier/certs/verifier_device_root.pem | 13 - packages/verifier/src/verifier/config.py | 560 ---------- .../src/verifier/exceptions/__init__.py | 309 ------ .../verifier/src/verifier/exceptions/utils.py | 72 -- .../verifier/src/verifier/nvml/__init__.py | 412 -------- .../src/verifier/nvml/gpu_cert_chains.py | 181 ---- .../src/verifier/nvml/nvmlHandlerTest.py | 152 --- .../verifier/src/verifier/nvml/test_handle.py | 52 - .../verifier/src/verifier/rim/__init__.py | 534 ---------- .../src/verifier/rim/golden_measurement.py | 203 ---- .../verifier/src/verifier/rim/signSchema.xsd | 318 ------ .../src/verifier/rim/swidSchema2015.xsd | 1 - .../1010_0200_882_96005E0001_PROD.swidtag | 125 --- ...10_0200_882_96005E0001_test_no_gpu.swidtag | 125 --- .../1010_0200_882_96005E0003_PROD.swidtag | 125 --- .../1010_0200_882_960074001A_PROD.swidtag | 125 --- .../1010_0200_882_960074001C_PROD.swidtag | 125 --- .../1010_0205_862_96005E0002_PROD.swidtag | 125 --- .../1010_0205_862_96005E0004_PROD.swidtag | 125 --- .../1010_0205_862_960074001F_PROD.swidtag | 125 --- .../1010_0205_862_9600740020_PROD.swidtag | 125 --- .../1010_0210_886_9600740011_PROD.swidtag | 125 --- .../1010_0215_866_9600740010_PROD.swidtag | 125 --- .../samples/Driver_RIM_test_no_gpu.swidtag | 125 --- .../verifier/samples/attestationReport.txt | 1 - .../g520_0200_885_9600740001_PROD.swidtag | 125 --- .../g520_0200_885_960074000D_PROD.swidtag | 125 --- .../g520_0202_885_96006D0008_PROD.swidtag | 125 --- .../g520_0202_885_96006D0027_PROD.swidtag | 125 --- .../g520_0202_885_9600740014_PROD.swidtag | 125 --- .../g520_0202_885_9600740018_PROD.swidtag | 125 --- .../g520_0205_865_9600740006_PROD.swidtag | 125 --- .../g520_0205_865_960074000F_PROD.swidtag | 125 --- .../g520_0207_865_9600740015_PROD.swidtag | 125 --- .../g520_0207_865_9600740019_PROD.swidtag | 125 --- .../g520_0213_881_96006D0007_PROD.swidtag | 125 --- .../g520_0213_881_96006D0026_PROD.swidtag | 125 --- .../g520_0228_889_96006D000A_PROD.swidtag | 125 --- .../g520_0228_889_96006D0029_PROD.swidtag | 125 --- .../src/verifier/samples/gpuAkCertChain.txt | 82 -- .../verifier/src/verifier/utils/__init__.py | 247 ----- .../src/verifier/utils/claims_utils.py | 163 --- packages/verifier/src/verifier/verifier.py | 182 ---- pyproject.toml | 4 +- 56 files changed, 2 insertions(+), 10236 deletions(-) delete mode 100644 packages/verifier/LICENSE.txt delete mode 100644 packages/verifier/README.md delete mode 100644 packages/verifier/pyproject.toml delete mode 100644 packages/verifier/src/verifier/__about__.py delete mode 100644 packages/verifier/src/verifier/__init__.py delete mode 100644 packages/verifier/src/verifier/attestation/__init__.py delete mode 100644 packages/verifier/src/verifier/attestation/spdm_msrt_req_msg.py delete mode 100644 packages/verifier/src/verifier/attestation/spdm_msrt_resp_msg.py delete mode 100644 packages/verifier/src/verifier/cc_admin.py delete mode 100644 packages/verifier/src/verifier/cc_admin_utils.py delete mode 100644 packages/verifier/src/verifier/certs/verifier_RIM_root.pem delete mode 100644 packages/verifier/src/verifier/certs/verifier_device_root.pem delete mode 100644 packages/verifier/src/verifier/config.py delete mode 100644 packages/verifier/src/verifier/exceptions/__init__.py delete mode 100644 packages/verifier/src/verifier/exceptions/utils.py delete mode 100644 packages/verifier/src/verifier/nvml/__init__.py delete mode 100644 packages/verifier/src/verifier/nvml/gpu_cert_chains.py delete mode 100644 packages/verifier/src/verifier/nvml/nvmlHandlerTest.py delete mode 100644 packages/verifier/src/verifier/nvml/test_handle.py delete mode 100644 packages/verifier/src/verifier/rim/__init__.py delete mode 100644 packages/verifier/src/verifier/rim/golden_measurement.py delete mode 100644 packages/verifier/src/verifier/rim/signSchema.xsd delete mode 100644 packages/verifier/src/verifier/rim/swidSchema2015.xsd delete mode 100644 packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_test_no_gpu.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0200_882_96005E0003_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0200_882_960074001A_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0200_882_960074001C_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0205_862_96005E0002_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0205_862_96005E0004_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0205_862_960074001F_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0205_862_9600740020_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0210_886_9600740011_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/1010_0215_866_9600740010_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/Driver_RIM_test_no_gpu.swidtag delete mode 100644 packages/verifier/src/verifier/samples/attestationReport.txt delete mode 100644 packages/verifier/src/verifier/samples/g520_0200_885_9600740001_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0200_885_960074000D_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0202_885_96006D0008_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0202_885_96006D0027_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0202_885_9600740014_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0202_885_9600740018_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0205_865_9600740006_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0205_865_960074000F_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0207_865_9600740015_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0207_865_9600740019_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0213_881_96006D0007_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0213_881_96006D0026_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0228_889_96006D000A_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/g520_0228_889_96006D0029_PROD.swidtag delete mode 100644 packages/verifier/src/verifier/samples/gpuAkCertChain.txt delete mode 100644 packages/verifier/src/verifier/utils/__init__.py delete mode 100644 packages/verifier/src/verifier/utils/claims_utils.py delete mode 100644 packages/verifier/src/verifier/verifier.py diff --git a/docker/api.Dockerfile b/docker/api.Dockerfile index 57349cb8..fdff481c 100644 --- a/docker/api.Dockerfile +++ b/docker/api.Dockerfile @@ -14,7 +14,7 @@ COPY --from=sev /app/sev/libsevguest.h /app/nilai-api/src/nilai_api/sev/libsevgu WORKDIR /app/nilai-api/ RUN apt-get update && \ -apt-get install build-essential curl git -y && \ +apt-get install build-essential curl -y && \ apt-get clean && \ apt-get autoremove && \ rm -rf /var/lib/apt/lists/* && \ diff --git a/packages/verifier/LICENSE.txt b/packages/verifier/LICENSE.txt deleted file mode 100644 index 79fdd6ed..00000000 --- a/packages/verifier/LICENSE.txt +++ /dev/null @@ -1,342 +0,0 @@ -Portions provided under the following terms: -------------------------------- - -Open Source Software Licensed Under Python Software Foundation License : ----------------------------------------------------------------------- - -python3 and its libraries os, sys, io, argparse, copy, secrets, subprocess, json and hashlib are used. Out of which Hashlib has copyright - -Hashlib: - Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org) - Licensed to PSF under a Contributor Agreement. - - -1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and - the Individual or Organization ("Licensee") accessing and otherwise using Python - 3.9.7 software in source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby - grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, - analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use Python 3.9.7 alone or in any derivative - version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright (C) 2001-2022 Python Software Foundation; All Rights - Reserved" are retained in Python 3.9.7 alone or in any derivative version - prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on or - incorporates Python 3.9.7 or any part thereof, and wants to make the - derivative work available to others as provided herein, then Licensee hereby - agrees to include in any such work a brief summary of the changes made to Python - 3.9.7. - -4. PSF is making Python 3.9.7 available to Licensee on an "AS IS" basis. - PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF - EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR - WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF PYTHON 3.9.7 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.9.7 - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.9.7, OR ANY DERIVATIVE - THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material breach of - its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any relationship - of agency, partnership, or joint venture between PSF and Licensee. This License - Agreement does not grant permission to use PSF trademarks or trade name in a - trademark sense to endorse or promote products or services of Licensee, or any - third party. - -8. By copying, installing or otherwise using Python 3.9.7, Licensee agrees - to be bound by the terms and conditions of this License Agreement. - ----------------------------------------------------------------------------------------- - - -Open Source Software Licensed Under the MIT License: ----------------------------------------------------- - -xmlschema, ecdsa and pyjwt are MIT licensed Python packages used in this project. - -xmlschema: - The MIT License (MIT) - Copyright (c), 2016-2020, SISSA (Scuola Internazionale Superiore di Studi Avanzati) - -ecdsa: - "python-ecdsa" Copyright (c) 2010 Brian Warner - Portions written in 2005 by Peter Pearson and placed in the public domain. - -pyjwt: - "pyjwt" Copyright (c) 2015-2022 José Padilla - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ----------------------------------------------------------------------------------------- - - -Open Source Software Licensed Under the Apache License: -------------------------------------------------------- - -signxml, cryptography, and pyOpenSSL are used - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -------------------------------------------------------------------------------------- - - -Open Source Software Licensed Under the BSD License: ----------------------------------------------------- - -lxml, nvidia-ml-py, and cryptography are used - -nvidia-ml-py: -# Copyright (c) 2020, NVIDIA Corporation. All rights reserved. - - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------------- - diff --git a/packages/verifier/README.md b/packages/verifier/README.md deleted file mode 100644 index df6193b7..00000000 --- a/packages/verifier/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# This code is taken from [Azure Confidential GPU Onboarding](https://github.com/Azure/az-cgpu-onboarding/tree/main/src/local_gpu_verifier) -- [Verifier](#verifier) - - [System Requirements:](#system-requirements) - - [Pre-requisites:](#pre-requisites) - - [Install](#install) - - [Step 1: Elevate to Root User Privileges (Optional)](#step-1-elevate-to-root-user-privileges-optional) - - [Step 2: Create a new Python Virtual Environment](#step-2-create-a-new-python-virtual-environment) - - [Step 3: Install and run Local GPU Verifier](#step-3-install-and-run-local-gpu-verifier) - - [Troubleshooting Installation Issues](#troubleshooting-installation-issues) - - [Usage](#usage) - - [Module details:](#module-details) - - [rim](#rim) - - [attestation](#attestation) - - [nvmlHandler](#nvmlhandler) - - [verifier](#verifier-1) - - [cc\_admin](#cc_admin) - -# Verifier - -The Verifier is a Python-based tool that validates GPU measurements by comparing an authenticated attestation report containing runtime measurements with authenticated golden measurements. Its purpose is to verify if the software and hardware state of the GPU are in accordance with the intended state. - -## System Requirements: -- NVIDIA Hopper H100 GPU or newer -- GPU SKU with Confidential Compute(CC) -- NVIDIA GPU driver installed - -## Pre-requisites: - Requires Python 3.8 or later. - -## Install - -### Step 1: Elevate to Root User Privileges (Optional) - -If you want the verifier to set the GPU Ready State based on the Attestation results, you will need to elevate the user privileges to root before you execute the rest of the instructions. For use cases where the user does not intend to set the GPU Ready State (e.g., when using the Attestation SDK), you can install and run the Verifier tool without requiring sudo privileges. - - sudo -i - -### Step 2: Create a new Python Virtual Environment - - python3 -m venv ./prodtest - source ./prodtest/bin/activate - -### Step 3: Install and run Local GPU Verifier - - cd local_gpu_verifier - pip3 install . - python3 -m verifier.cc_admin - -### Troubleshooting Installation Issues - -- If you encounter any pip related issues while building the package, please execute the following commands to update to the latest versions of setuptools and pip - - python3 -m pip install --upgrade setuptools - pip install -U pip - -- If you encounter any permission issues while building the package, please execute the following commands and then build the package again - - cd local_gpu_verifier - rm -r build - -## Usage -To run the cc_admin module, use the following command: - - python3 -m verifier.cc_admin - [-h] [-v] [--test_no_gpu] - [--driver_rim DRIVER_RIM] [--vbios_rim VBIOS_RIM] - [--user_mode] [--nonce NONCE] - [--rim_root_cert RIM_ROOT_CERT] - [--rim_service_url RIM_SERVICE_URL] - [--ocsp_service_url OCSP_SERVICE_URL] - [--allow_hold_cert] - [--ocsp_nonce_enabled] - [--ocsp_validity_extension OCSP_VALIDITY_EXTENSION] - [--ocsp_cert_revocation_extension_device OCSP_CERT_REVOCATION_EXTENSION_DEVICE] - [--ocsp_cert_revocation_extension_driver_rim OCSP_CERT_REVOCATION_EXTENSION_DRIVER_RIM] - [--ocsp_cert_revocation_extension_vbios_rim OCSP_CERT_REVOCATION_EXTENSION_VBIOS_RIM] - [--ocsp_attestation_settings {default,strict}] - -| Option | Description | -| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `-h, --help` | Show this help message and exit | -| `-v, --verbose` | Print more detailed output | -| `--test_no_gpu` | If there is no GPU and we need to test the verifier, no NVML APIs will be available, so the verifier will use hardcoded GPU info | -| `--driver_rim DRIVER_RIM` | The path to the driver RIM. If not provided, it will use the default file: `/usr/share/nvidia/rim/RIM_GH100PROD.swidtag` | -| `--vbios_rim VBIOS_RIM` | The path to the VBIOS RIM. If not provided, it will try to find the appropriate file in `verifier_cc/samples/` directory for the VBIOS ROM flashed onto the GPU | -| `--user_mode` | Runs the GPU attestation in user mode | -| `--allow_hold_cert` | Continue attestation if the OCSP revocation status of the certificate in the RIM files is 'certificate_hold' | -| `--nonce` | Specify a Nonce for Attestation Report | -| `--rim_root_cert RIM_ROOT_CERT` | The absolute path to the root certificate to be used for verifying the certificate chain of the driver and VBIOS RIM certificate chain | -| `--rim_service_url RIM_SERVICE_URL` | The URL to be used for fetching driver and VBIOS RIM files (e.g., `https://useast2.thim.azure.net/nvidia/v1/rim/`) | -| `--ocsp_service_url OCSP_SERVICE_URL` | The URL to be used for fetching OCSP responses (e.g., `https://useast2.thim.azure.net/nvidia/ocsp/`) | -| `--ocsp_nonce_enabled` | Enable the nonce with the provided OCSP service URL, defaults to False. | -| `--ocsp_validity_extension OCSP_VALIDITY_EXTENSION` | If the OCSP response is expired within the validity extension in hours, treat the OCSP response as valid and continue the attestation. | -| `--ocsp_cert_revocation_extension_device OCSP_CERT_REVOCATION_EXTENSION_DEVICE` | If the OCSP response indicates the device certificate is revoked within the extension grace period in hours, treat the certificate as good and continue the attestation. | -| `--ocsp_cert_revocation_extension_driver_rim OCSP_CERT_REVOCATION_EXTENSION_DRIVER_RIM` | If the OCSP response indicates the driver RIM certificate is revoked within the extension grace period in hours, treat the certificate as good and continue the attestation. | -| `--ocsp_cert_revocation_extension_vbios_rim OCSP_CERT_REVOCATION_EXTENSION_VBIOS_RIM` | If the OCSP response indicates the VBIOS RIM certificate is revoked within the extension grace period in hours, treat the certificate as good and continue the attestation. | -| `--ocsp_attestation_settings {default,strict}` | The OCSP attestation settings to be used for the attestation. The default settings are to allow hold cert, validity extension, and cert revocation extension of 7 days. The strict settings are to not allow hold cert, validity extension, and cert revocation extension of 0 days. | - - -If you need information about any function, use - - help(function_name) - -For example: - - e.g. help(verify_measurement_signature) - - -## Module details: -### rim -The RIM (Reference Integrity Manifest) is a manifest containing golden measurements for the GPU. You can find the TCG RIM specification at the following link: [TCG RIM Specification](https://trustedcomputinggroup.org/wp-content/uploads/TCG_RIM_Model_v1p01_r0p16_pub.pdf). The RIM module performs the parsing and schema validation of the base RIM against the SWID tag schema and XML signature schema. It then performs the signature verification of the base RIM. - -### attestation -The Attestation module is capable of extracting the measurements and the measurement signature. It then performs signature verification. DMTF's SPDM 1.1 MEASUREMENT response message is used as the attestation report. You can find the SPDM 1.1 specification at the following link: [SPDM 1.1 Specification](https://www.dmtf.org/sites/default/files/standards/documents/DSP0274_1.1.3.pdf). - -### nvmlHandler -The nvmlHandler module utilizes the NVML API calls to retrieve GPU information, including the driver version, GPU certificates, attestation report, and more. - -### verifier -The verifier module utilizes the RIM attestation module for parsing the attestation report and performing a runtime comparison of the measurements in the attestation report against the golden measurements stored in RIM. - -### cc_admin -The cc_admin module retrieves the GPU information, attestation report, and the driver RIM associated with the driver version. It then proceeds with the authentication of the driver RIM and the attestation report. Afterward, it executes the verifier tool to compare the runtime measurements in the attestation report with the golden measurements stored in the driver RIM. - diff --git a/packages/verifier/pyproject.toml b/packages/verifier/pyproject.toml deleted file mode 100644 index fb16489f..00000000 --- a/packages/verifier/pyproject.toml +++ /dev/null @@ -1,40 +0,0 @@ -[project] -name = "verifier" -version = "2.0.0" -description = "A Python-based tool that validates GPU measurements by comparing GPU runtime measurements with authenticated golden measurements" -authors = [ - {name = "NVIDIA"} -] -readme = "README.md" -requires-python = ">=3.8" -license = {text = "BSD-3-Clause"} -classifiers = [ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", -] -keywords = [ - "confidential-computing", - "local-gpu-verifier", - "attestation", - "NVIDIA", - "verifier" -] -dependencies = [ - 'cryptography == 3.4', - 'ecdsa >= 0.19.0', - 'lxml >= 4.9.1', - 'signxml == 3.2.0', - 'xmlschema == 2.2.3', - 'pyOpenSSL == 24.2.1', - 'PyJWT >= 2.7.0', - 'nvidia-ml-py >= 12.550.52', - 'requests == 2.32.3' -] - -[tool.setuptools.package-data] -verifier = ["samples/*.swidtag", "rim/*.xsd", "samples/*.txt","certs/*.pem", "Tests/*/*.txt"] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" diff --git a/packages/verifier/src/verifier/__about__.py b/packages/verifier/src/verifier/__about__.py deleted file mode 100644 index 18c0bf59..00000000 --- a/packages/verifier/src/verifier/__about__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -__all__ = [ - "__version__", - "__author__", - "__copyright__", -] - -__version__ = "1.3.0" - -__author__ = "NVIDIA CORPORATION" -__copyright__ = f"Copyright (c) 2021-2023 {__author__}" diff --git a/packages/verifier/src/verifier/__init__.py b/packages/verifier/src/verifier/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/verifier/src/verifier/attestation/__init__.py b/packages/verifier/src/verifier/attestation/__init__.py deleted file mode 100644 index 459aff3a..00000000 --- a/packages/verifier/src/verifier/attestation/__init__.py +++ /dev/null @@ -1,237 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from ecdsa import ( - VerifyingKey, - BadSignatureError, -) - -from verifier.utils import extract_public_key -from verifier.config import ( - info_log, - event_log, - __author__, - __copyright__, - __version__, -) - -from .spdm_msrt_resp_msg import SpdmMeasurementResponseMessage -from .spdm_msrt_req_msg import SpdmMeasurementRequestMessage -from verifier.exceptions import ( - NoMeasurementsError, - ParsingError, -) - - -class AttestationReport: - """A class to represent the attestation report coming from the GPU driver. - - The class to encapsulate the Attestation report which comprises of the - SPDM GET MEASUREMENT request message and the SPDM GET MEASUREMENT response - message. - """ - - LENGTH_OF_SPDM_GET_MEASUREMENT_REQUEST_MESSAGE = 37 - - def extract_response_message(self, attestation_report_data): - """Extracts the SPDM GET_MEASUREMENT response message from the attestation report. - - Args: - attestation_report_data (bytes): the attestation report coming from gpu via the nvml api. - - Returns: - [bytes]: returns the extracted SPDM GET_MEASUREMENT response message. - """ - assert type(attestation_report_data) is bytes - assert ( - len(attestation_report_data) - > self.LENGTH_OF_SPDM_GET_MEASUREMENT_REQUEST_MESSAGE - ) - - response = attestation_report_data[ - self.LENGTH_OF_SPDM_GET_MEASUREMENT_REQUEST_MESSAGE : - ] - return response - - def extract_request_message(self, attestation_report_data): - """Extracts the SPDM GET_MEASUREMENT request message from the attestation report. - - Args: - attestation_report_data (bytes): the attestation report coming from gpu via the nvml api. - - Returns: - [bytes]: returns the extracted SPDM GET_MEASUREMENT request message. - """ - assert type(attestation_report_data) is bytes - assert ( - len(attestation_report_data) - > self.LENGTH_OF_SPDM_GET_MEASUREMENT_REQUEST_MESSAGE - ) - - request = attestation_report_data[ - : self.LENGTH_OF_SPDM_GET_MEASUREMENT_REQUEST_MESSAGE - ] - return request - - @staticmethod - def concatenate(request_data, response_data, signature_length): - """Computes the binary data over which the signature verification is to be done. - - Args: - request_data (bytes) : the SPDM GET_MEASUREMENTS request message. - response_data (bytes) : the successful SPDM GET_MEASUREMENT response message. - signature_length (int): the size of the digital signature in number of bytes. - - Returns: - [bytes]: returns the binary data whose signature verification is to be done. - """ - assert type(request_data) is bytes - assert type(response_data) is bytes - assert type(signature_length) is int - - if not len(response_data) > signature_length: - raise ParsingError( - "The the length of the SPDM GET_MEASUREMENT response message is less than \ - or equal to the length of the signature field, which is not correct." - ) - - data = request_data + response_data - data = data[: len(data) - signature_length] - return data - - def verify_signature(self, certificate, signature_length, hashfunc): - """Performs the signature verification of the attestation report. - - Args: - certificate (OpenSSL.crypto.X509): The GPU attestation leaf certificate. - signature_length (int): the length of the signature field of the attestation report. - hashfunc (_hashlib.HASH): The hashlib hash function. - - Returns: - [bool]: return True if the signature verification is successful - otherwise, return False. - """ - try: - event_log.debug( - "Extracting the public key from the certificate for the attestation report." - ) - public_key = extract_public_key(certificate) - verifying_key = VerifyingKey.from_pem(public_key) - event_log.debug( - "Extracted the public key from the certificate for the the attestation report." - ) - - data_whose_signature_is_to_be_verified = AttestationReport.concatenate( - request_data=self.request_data, - response_data=self.response_data, - signature_length=signature_length, - ) - signature = self.get_response_message().get_signature() - - event_log.debug("Verifying the signature of the attestation report.") - status = verifying_key.verify( - signature, data_whose_signature_is_to_be_verified, hashfunc=hashfunc - ) - return status - except BadSignatureError: - return False - - except Exception as error: - err_msg = ( - "Something went wrong during attestation report signature verification." - ) - info_log.info(err_msg) - return False - - def get_measurements(self): - """Fetches the runtime measurements from the attestation report. - - Raises: - NoMeasurementsError: It is raised in case there are no or blank measurement block. - - Returns: - [list]: list of measurement values. - """ - measurement_list = ( - self.response_message.get_measurement_record().get_measurements() - ) - event_log.debug( - "Runtime measurements are : \n\t\t\t\t\t\t\t{}".format( - "\n\t\t\t\t\t\t\t".join(map(str, measurement_list)) - ) - ) - - if len(measurement_list) == 0: - err_msg = "\tNo GPU runtime measurements found." - info_log.error(err_msg) - raise NoMeasurementsError(err_msg + "\n\tQuitting now.") - - return measurement_list - - def get_request_message(self): - """Fetches the SPDM GET MEASUREMENT request message represented as an object of class SpdmMeasurementRequestMessage. - - Returns: - [SpdmMeasurementRequestMessage]: the object representing the SPDM GET MEASUREMENT request message. - """ - return self.request_message - - def get_response_message(self): - """Fetches the SPDM GET MEASUREMENT response message represented as an object of class SpdmMeasurementResponseMessage. - - Returns: - [SpdmMeasurementResponseMessage]: the object representing the SPDM GET MEASUREMENT response message. - """ - return self.response_message - - def print_obj(self, logger): - """Prints all the fields of the request and response message in the attestation report object. - - Args: - logger (logging.Logger): the logger object which prints the output according to its set level. - """ - self.request_message.print_obj(logger) - self.response_message.print_obj(logger) - - def __init__(self, data, settings): - """The constructor for the attestation report class. - - Args: - data (bytes): the raw attestation report data coming from the nvml api. - settings (config.HopperSettings): the setting object that have the various config info. - """ - assert type(data) is bytes - - self.request_data = self.extract_request_message(data) - self.response_data = self.extract_response_message(data) - self.request_message = SpdmMeasurementRequestMessage(self.request_data) - self.response_message = SpdmMeasurementResponseMessage( - self.response_data, settings - ) diff --git a/packages/verifier/src/verifier/attestation/spdm_msrt_req_msg.py b/packages/verifier/src/verifier/attestation/spdm_msrt_req_msg.py deleted file mode 100644 index 7e946c6c..00000000 --- a/packages/verifier/src/verifier/attestation/spdm_msrt_req_msg.py +++ /dev/null @@ -1,223 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from verifier.config import info_log -from verifier.exceptions import ParsingError - - -class SpdmMeasurementRequestMessage: - """Class representing the SPDM GET_MEASUREMENT request message. - Following is the expected structure of the MEASUREMENTS request message in DMTF's SPDM 1.1 spec. - OFFSET - FIELD - SIZE(in bytes) - 0 - SPDMVersion - 1 - 1 - RequestResponseCode - 1 - 2 - Param1 - 1 - 3 - Param2 - 1 - 4 - Nonce - 32 - 36 - SlotIDParam - 1 - """ - - FieldSize = { - "SPDMVersion": 1, - "RequestResponseCode": 1, - "Param1": 1, - "Param2": 1, - "Nonce": 32, - "SlotIDParam": 1, - } - - def get_spdm_version(self): - """Fetches the spdm version field of the object of SpdmMeasurementRequestMessage. - - Returns: - [bytes]: the spdm version. - """ - return self.SPDMVersion - - def set_spdm_version(self, value): - """Sets the spdm version field of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the spdm version. - """ - self.SPDMVersion = value - - def get_request_response_code(self): - """Fetches the RequestResponseCode field of the object representing the SPDM GET_MEASUREMENT request. - - Returns: - [bytes]: the RequestResponseCode - """ - return self.RequestResponseCode - - def set_request_response_code(self, value): - """Sets the RequestResponseCode field of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the RequestResponse value. - """ - self.RequestResponseCode = value - - def get_param1(self): - """Fetches the Param1 field of the object representing the SPDM GET_MEASUREMENT request. - - Returns: - [bytes]: the Param1 value. - """ - return self.Param1 - - def set_param1(self, value): - """Sets the Param1 field of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the Param1 value. - """ - self.Param1 = value - - def get_param2(self): - """Fetches the Param2 field of the object representing the SPDM GET_MEASUREMENT request. - - Returns: - [bytes]: the Param2 value - """ - return self.Param2 - - def set_param2(self, value): - """Sets the Param2 field of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the Param2 value. - """ - self.Param2 = value - - def get_nonce(self): - """Fetches the Nonce field of the object representing the SPDM GET_MEASUREMENT request. - - Returns: - [bytes]: the nonce value. - """ - return self.Nonce - - def set_nonce(self, value): - """Sets the Nonce field value of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the nonce value. - """ - self.Nonce = value - - def get_slot_id_param(self): - """Fetches the SlotIDParam field value of the object representing the SPDM GET_MEASUREMENT request. - - Returns: - [bytes]: SlotIDParam value. - """ - return self.SlotIDParam - - def set_slot_id_param(self, value): - """Sets the SlotIDParam field value of the object representing the SPDM GET_MEASUREMENT request. - - Args: - value (bytes): the SlotIDParam value. - """ - self.SlotIDParam = value - - def parse(self, request_data): - """Parses the raw SPDM GET_MEASUREMENT request message. - - Args: - request_data (bytes): the raw message data. - - Raises: - ParsingError: it is raised if there is any incorrect data field length. - """ - byte_index = 0 - - value = request_data[byte_index : byte_index + self.FieldSize["SPDMVersion"]] - self.set_spdm_version(value) - byte_index = byte_index + self.FieldSize["SPDMVersion"] - - value = request_data[ - byte_index : byte_index + self.FieldSize["RequestResponseCode"] - ] - self.set_request_response_code(value) - byte_index = byte_index + self.FieldSize["RequestResponseCode"] - - value = request_data[byte_index : byte_index + self.FieldSize["Param1"]] - self.set_param1(value) - byte_index = byte_index + self.FieldSize["Param1"] - - value = request_data[byte_index : byte_index + self.FieldSize["Param2"]] - self.set_param2(value) - byte_index = byte_index + self.FieldSize["Param2"] - - value = request_data[byte_index : byte_index + self.FieldSize["Nonce"]] - self.set_nonce(value) - byte_index = byte_index + self.FieldSize["Nonce"] - - value = request_data[byte_index : byte_index + self.FieldSize["SlotIDParam"]] - self.set_slot_id_param(value) - byte_index = byte_index + self.FieldSize["SlotIDParam"] - - if byte_index != len(request_data): - err_msg = "Something went wrong during parsing the SPDM GET MEASUREMENT request message." - info_log.error(err_msg) - raise ParsingError(err_msg) - - def print_obj(self, logger): - """Prints all the field values of the object representing the SPDM GET_MEASUREMENT request. - - Args: - logger (logging.Logger): the logger object. - """ - logger.debug("GET MEASUREMENT REQUEST MESSAGE") - logger.debug(f"SPDMVersion : {self.SPDMVersion.hex()}") - logger.debug(f"RequestResponseCode : {self.RequestResponseCode.hex()}") - logger.debug(f"Param1 : {self.Param1.hex()}") - logger.debug(f"Param2 : {self.Param2.hex()}") - logger.debug(f"Nonce : {self.Nonce.hex()}") - logger.debug(f"SlotIDParam : {self.SlotIDParam.hex()}") - - def __init__(self, request_data): - """The constructor method for the SpdmMeasurementRequestMessage class representing the SPDM GET_MEASUREMENT - request message. - - Args: - request_data (bytes): raw SPDM GET_MEASUREMENT request message. - """ - assert type(request_data) is bytes - - self.SPDMVersion = None - self.RequestResponseCode = None - self.Param1 = None - self.Param2 = None - self.Nonce = None - self.SlotIDParam = None - self.parse(request_data) diff --git a/packages/verifier/src/verifier/attestation/spdm_msrt_resp_msg.py b/packages/verifier/src/verifier/attestation/spdm_msrt_resp_msg.py deleted file mode 100644 index ce524ed1..00000000 --- a/packages/verifier/src/verifier/attestation/spdm_msrt_resp_msg.py +++ /dev/null @@ -1,749 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from verifier.utils import read_field_as_little_endian -from verifier.exceptions import ( - NoMeasurementBlockError, - MeasurementSpecificationError, - ParsingError, -) - - -class DmtfMeasurement: - """The class to represent the DMTF Measurement. - The structure of the Measurement when MeasurementSpecification field is bit 0 = DMTF in DMTF's SPDM 1.1 spec. - OFFSET - FIELD - SIZE(in bytes) - 0 - DMTFSpecMeasurementValueType - 1 - 1 - DMTFSpecMeasurementValueSize - 2 - 3 - DMTFSpecMeasurementValue - DMTFSpecMeasurementValueSize - """ - - FieldSize = { - "DMTFSpecMeasurementValueType": 1, - "DMTFSpecMeasurementValueSize": 2, - "DMTFSpecMeasurementValue": None, - } - - def get_measurement_value(self): - """Fetches the measurement value. - - Returns: - [bytes]: the measurement value - """ - return self.DMTFSpecMeasurementValue - - def get_measurement_value_type(self): - """Fetches the measurement value type. - - Returns: - [int]: the measurement value type. - """ - return self.DMTFSpecMeasurementValueType - - def get_measurement_value_size(self): - """Fetches the measurement value size in bytes. - - Returns: - [int]: the size of measurement value in bytes. - """ - return self.DMTFSpecMeasurementValueSize - - def set_measurement_value(self, value): - """Sets the measurement value field of the DMTF Measurement object. - - Args: - value (bytes): the measurement value. - """ - self.DMTFSpecMeasurementValue = value - - def set_measurement_value_type(self, value): - """Sets the measurement value type field of the DMTF Measurement object. - - Args: - value (int): the measurement value type as an integer. - """ - self.DMTFSpecMeasurementValueType = value - - def set_measurement_value_size(self, value): - """Sets the measurement values size field. - - Args: - value (int): the measurement value size in bytes. - """ - self.DMTFSpecMeasurementValueSize = value - - def parse(self, measurement_data): - """Parses the raw DMTF Measurement data and sets the various field values of the Measurement. - - Args: - measurement_data (bytes): the raw DMTF Measurement data. - """ - byte_index = 0 - - x = measurement_data[ - byte_index : byte_index + self.FieldSize["DMTFSpecMeasurementValueType"] - ] - value = int(x.hex(), 16) - self.set_measurement_value_type(value) - byte_index = byte_index + self.FieldSize["DMTFSpecMeasurementValueType"] - - x = measurement_data[ - byte_index : byte_index + self.FieldSize["DMTFSpecMeasurementValueSize"] - ] - value = int(read_field_as_little_endian(x), 16) - self.set_measurement_value_size(value) - byte_index = byte_index + self.FieldSize["DMTFSpecMeasurementValueSize"] - - value = measurement_data[ - byte_index : byte_index + self.get_measurement_value_size() - ] - self.set_measurement_value(value) - byte_index = byte_index + self.get_measurement_value_size() - - def print_obj(self, logger): - """Prints all the fields of the object representing the DMTF Measurement. - - Args: - logger (logging.Logger): the logger object. - """ - logger.debug( - f"DMTFSpecMeasurementValueType : {self.DMTFSpecMeasurementValueType}" - ) - logger.debug( - f"DMTFSpecMeasurementValueSize : {self.DMTFSpecMeasurementValueSize}" - ) - logger.debug( - f"DMTFSpecMeasurementValue : {self.DMTFSpecMeasurementValue.hex()}" - ) - - def __init__(self, measurement_data): - """The constructor method for the DmtfMeasurement class representing the DMTF Measurement. - - Args: - measurement_data (bytes): the raw DMTF Measurement data. - """ - assert type(measurement_data) is bytes - - self.DMTFSpecMeasurementValueType = None - self.DMTFSpecMeasurementValueSize = None - self.DMTFSpecMeasurementValue = None - self.parse(measurement_data) - - -class MeasurementRecord: - """Class to represent the Measurement block. - The structure of each of the Measurement block in DMTF's SPDM 1.1 spec is as follows: - OFFSET - FIELD - SIZE(in bytes) - 0 - Index - 1 - 1 - MeasurementSpecification - 1 - 2 - MeasurementSize - 2 - 4 - Measurement - MeasurementSize - """ - - FieldSize = { - "Index": 1, - "MeasurementSpecification": 1, - "MeasurementSize": 2, - } - - DMTF_MEASUREMENT_SPECIFICATION_VALUE = 1 - - def get_measurements(self): - """Fetches all the measurement value and then returns them as a list. - - Returns: - [list]: list of measurement values. - """ - measurement_list = [None] * len(self.MeasurementBlocks) - - for index in self.MeasurementBlocks: - measurement_list[index - 1] = ( - self.MeasurementBlocks[index].get_measurement_value().hex() - ) - - return measurement_list - - def parse(self, binary_data, settings): - """Parses the raw measurement record data and sets the fields of the class MeasurementRecord object - representing the Measurement Record. - - Args: - binary_data (bytes): the raw Measurement Record data - settings (config.HopperSettings): the object containing the various config info. - - Raises: - NoMeasurementBlockError: it is raised when there are zero number of measurement blocks. - MeasurementSpecificationError: it is raised if any measurement block does not follow DMTF specification. - ParsingError: it is raised if there is any issue in the parsing of the data. - """ - assert type(binary_data) is bytes - - if self.NumberOfBlocks == 0: - err_msg = "\tThere are no measurement blocks in the respone message." - raise NoMeasurementBlockError(err_msg) - - byte_index = 0 - - for _ in range(self.NumberOfBlocks): - x = binary_data[byte_index : byte_index + self.FieldSize["Index"]] - index = int(x.hex(), 16) - byte_index = byte_index + self.FieldSize["Index"] - - x = binary_data[ - byte_index : byte_index + self.FieldSize["MeasurementSpecification"] - ] - measurement_specification = int(x.hex(), 16) - if measurement_specification != self.DMTF_MEASUREMENT_SPECIFICATION_VALUE: - raise MeasurementSpecificationError( - "Measurement block at index ", - self.get_index(), - " not following DMTF specification.\n\tQuitting now.", - ) - byte_index = byte_index + self.FieldSize["MeasurementSpecification"] - - x = binary_data[byte_index : byte_index + self.FieldSize["MeasurementSize"]] - measurement_size = int(read_field_as_little_endian(x), 16) - byte_index = byte_index + self.FieldSize["MeasurementSize"] - - measurement_data = binary_data[byte_index : byte_index + measurement_size] - self.MeasurementBlocks[index] = DmtfMeasurement(measurement_data) - byte_index = byte_index + measurement_size - - if byte_index != len(binary_data): - err_msg = "Something went wrong while parsing the MeasurementRecord.\nQuitting now." - raise ParsingError(err_msg) - - count = 0 - for i in range(1, self.NumberOfBlocks + 1): - if ( - self.MeasurementBlocks[i] is not None - and len(self.MeasurementBlocks[i].get_measurement_value()) - == self.MeasurementBlocks[i].get_measurement_value_size() - ): - count = count + 1 - - def print_obj(self, logger): - """Prints all the field value of the class representing the Measurement Records. - - Args: - logger (logging.Logger): the logger object. - """ - - for i in range(1, self.NumberOfBlocks + 1): - logger.debug("----------------------------------------") - logger.debug(f"Measurement Block index : {i}") - self.MeasurementBlocks[i].print_obj(logger) - - def __init__(self, measurement_record_data, number_of_blocks, settings): - """The constructor method for the class MeasurementRecord to represent the measurement records. - - Args: - measurement_record_data (bytes): the raw measurement record data - number_of_blocks (int): the number of measurement blocks - settings (config.HopperSettings): object that contains the config info. - """ - assert type(measurement_record_data) is bytes - assert type(number_of_blocks) is int - - self.MeasurementBlocks = dict() - self.NumberOfBlocks = number_of_blocks - self.parse(measurement_record_data, settings) - - -class OpaqueData: - """This is a class to represent the OpaqueData field in the SPDM GET_MEASUREMENT response message. - The structure of the data in this field is as follows: - [DataType(2 bytes)|DataSize(2 bytes)|Data(DataSize bytes)][DataType(2 bytes)|DataSize(2 bytes)|Data(DataSize bytes)]... - """ - - OPAQUE_DATA_TYPES = { - 1: "OPAQUE_FIELD_ID_CERT_ISSUER_NAME", - 2: "OPAQUE_FIELD_ID_CERT_AUTHORITY_KEY_IDENTIFIER", - 3: "OPAQUE_FIELD_ID_DRIVER_VERSION", - 4: "OPAQUE_FIELD_ID_GPU_INFO", - 5: "OPAQUE_FIELD_ID_SKU", - 6: "OPAQUE_FIELD_ID_VBIOS_VERSION", - 7: "OPAQUE_FIELD_ID_MANUFACTURER_ID", - 8: "OPAQUE_FIELD_ID_TAMPER_DETECTION", - 9: "OPAQUE_FIELD_ID_SMC", - 10: "OPAQUE_FIELD_ID_VPR", - 11: "OPAQUE_FIELD_ID_NVDEC0_STATUS", - 12: "OPAQUE_FIELD_ID_MSRSCNT", - 13: "OPAQUE_FIELD_ID_CPRINFO", - 14: "OPAQUE_FIELD_ID_BOARD_ID", - 15: "OPAQUE_FIELD_ID_CHIP_SKU", - 16: "OPAQUE_FIELD_ID_CHIP_SKU_MOD", - 17: "OPAQUE_FIELD_ID_PROJECT", - 18: "OPAQUE_FIELD_ID_PROJECT_SKU", - 19: "OPAQUE_FIELD_ID_PROJECT_SKU_MOD", - 20: "OPAQUE_FIELD_ID_FWID", - 21: "OPAQUE_FIELD_ID_PROTECTED_PCIE_STATUS", - 22: "OPAQUE_FIELD_ID_SWITCH_PDI", - 23: "OPAQUE_FIELD_ID_FLOORSWEPT_PORTS", - 24: "OPAQUE_FIELD_ID_POSITION_ID", - 25: "OPAQUE_FIELD_ID_LOCK_SWITCH_STATUS", - 32: "OPAQUE_FIELD_ID_GPU_LINK_CONN", - 255: "OPAQUE_FIELD_ID_INVALID", - } - - MSR_COUNT_SIZE = 4 - - FieldSize = { - "DataType": 2, - "DataSize": 2, - "PdiDataSize": 8, - } - - def get_data(self, field_name): - """Fetches the field value of the given field name. - - Args: - field_name (str): the name/data type of the field in the opaque data. - - Returns: - [bytes] : the content of the given field name. - """ - assert type(field_name) is str - - if ( - field_name == "OPAQUE_FIELD_ID_FWID" - and "OPAQUE_FIELD_ID_FWID" not in self.OpaqueDataField - ): - return b"" - - return self.OpaqueDataField[field_name] - - def parse_measurement_count(self, data): - """Parses and creates a list of measurement count values from the OpaqueData field. - - Args: - data (bytes): the raw measurement count data. - - Raises: - ParsingError: it is raised if the length of the data is not a multiple of MSR_COUNT_SIZE. - """ - - if len(data) % self.MSR_COUNT_SIZE != 0: - raise ParsingError("Invalid size of measurement count field data.") - - msr_cnt = list() - number_of_elements = len(data) // self.MSR_COUNT_SIZE - - for i in range(number_of_elements): - start = i * self.MSR_COUNT_SIZE - end = start + self.MSR_COUNT_SIZE - element = data[start:end] - msr_cnt.append(int(read_field_as_little_endian(element), 16)) - - self.OpaqueDataField["OPAQUE_FIELD_ID_MSRSCNT"] = msr_cnt - - def parse_switch_pdis(self, binary_data): - """Parses the raw NvSwitch PDIs data of all the 18 NvLinks of the GPU. - - Args: - binary_data (bytes): the raw NvSwitch PDI data. - - Raises: - ParsingError: it is raised if the length off the data is not a multiple of self.FieldSize["PdiDataSize"] - """ - if len(binary_data) % self.FieldSize["PdiDataSize"] != 0: - raise ParsingError("Invalid size of switch PDI data.") - - byte_index = 0 - self.OpaqueDataField["OPAQUE_FIELD_ID_SWITCH_PDI"] = [] - - while byte_index < len(binary_data): - pdi = binary_data[byte_index : byte_index + self.FieldSize["PdiDataSize"]] - self.OpaqueDataField["OPAQUE_FIELD_ID_SWITCH_PDI"].append(pdi) - byte_index = byte_index + self.FieldSize["PdiDataSize"] - - def parse(self, binary_data): - """Parses the raw OpaqueData field of the SPDM GET_MEASUREMENT response message. - - Args: - binary_data (bytes): the data content of the Opaque Data field. - """ - byte_index = 0 - - while byte_index < len(binary_data): - x = binary_data[byte_index : byte_index + self.FieldSize["DataType"]] - value = int(read_field_as_little_endian(x), 16) - data_type = self.OPAQUE_DATA_TYPES[value] - byte_index = byte_index + self.FieldSize["DataType"] - - x = binary_data[byte_index : byte_index + self.FieldSize["DataSize"]] - data_size = int(read_field_as_little_endian(x), 16) - byte_index = byte_index + self.FieldSize["DataSize"] - - value = binary_data[byte_index : byte_index + data_size] - - if data_type == "OPAQUE_FIELD_ID_MSRSCNT": - self.parse_measurement_count(value) - elif data_type == "OPAQUE_FIELD_ID_SWITCH_PDI": - self.parse_switch_pdis(value) - else: - self.OpaqueDataField[data_type] = value - - byte_index = byte_index + data_size - - def print_obj(self, logger): - """Prints all the field content in the Opaque Data. - - Args: - logger (logging.Logger): the logger object. - """ - - for field in self.OpaqueDataField: - logger.debug(f"{field} : {self.OpaqueDataField[field]}") - - def __init__(self, binary_data): - """The constructor method for the class representing the OpaqueData. - - Args: - binary_data (bytes): the Opaque data content. - """ - assert type(binary_data) is bytes - self.OpaqueDataField = dict() - self.parse(binary_data) - - -class SpdmMeasurementResponseMessage: - """Class to represent the SPDM GET_MEASUREMENT response message. - Following is the expected structure of the Successful MEASUREMENTS response message in DMTF's SPDM 1.1 spec. - OFFSET - FIELD - SIZE(in bytes) - 0 - SPDMVersion - 1 - 1 - RequestResponseCode - 1 - 2 - Param1 - 1 - 3 - Param2 - 1 - 4 - NumberOfBlocks - 1 - 5 - MeasurementRecordLength - 3 - 8 - MeasurementRecord - L1 = MeasurementRecordLength - 8+L1 - Nonce - 32 - 40+L1 - OpaqueLength - 2 - 42+L1 - OpaqueData - L2 = OpaqueLength - 42+L1+L2 - Signature - 64 - """ - - FieldSize = { - "SPDMVersion": 1, - "RequestResponseCode": 1, - "Param1": 1, - "Param2": 1, - "NumberOfBlocks": 1, - "MeasurementRecordLength": 3, - "Nonce": 32, - "OpaqueLength": 2, - } - - def get_spdm_version(self): - """Fetches the SPDMVersion of the object representing the SPDM GET_MEASUREMENT response message. - - Returns: - [bytes]: the SPDM version - """ - return self.SPDMVersion - - def set_spdm_version(self, value): - """Sets the SPDMVersion field of the object representing the SPDM GET_MEASUREMENT response message. - - Args: - value (bytes): the SPDM version - """ - self.SPDMVersion = value - - def get_request_response_code(self): - """Fetches the RequestResponseCode field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [bytes]: the RequestResponse value. - """ - return self.RequestResponseCode - - def set_request_response_code(self, value): - """Sets the RequestResponseCode field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (bytes): the RequestResponse value. - """ - self.RequestResponseCode = value - - def get_param1(self): - """Fetches the Param1 field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [bytes]: the Param1 value. - """ - return self.Param1 - - def set_param1(self, value): - """Sets the Param1 field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (bytes): the Param1 value. - """ - self.Param1 = value - - def get_param2(self): - """Fetches the Param2 field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [bytes]: the Param2 value - """ - return self.Param2 - - def set_param2(self, value): - """Sets the Param2 field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (bytes): the Param2 value. - """ - self.Param2 = value - - def get_number_of_blocks(self): - """Fetches the number of measurement blocks field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [int]: the Number of blocks. - """ - return self.NumberOfBlocks - - def set_number_of_blocks(self, value): - """Sets the number of measurement blocks field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (int): the number of blocks. - """ - self.NumberOfBlocks = value - - def get_measurement_record_length(self): - """Fetches the length of the measurement record length field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [int]: the length of measurement record in bytes. - """ - return self.MeasurementRecordLength - - def set_measurement_record_length(self, value): - """Sets the length of the measurement record length field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (int): the length of measurement records in bytes. - """ - self.MeasurementRecordLength = value - - def get_measurement_record(self): - """Fetches the MeasurementRecord object representing the measurement record of the SPDM GET_MEASUREMENT response. - - Returns: - [MeasurementRecord]: the object representing the measurement record. - """ - return self.MeasurementRecord - - def set_measurement_record(self, value): - """Assigns the MeasurementRecord object to the MeasurementRecord field of the SpdmMeasurementResponseMessage class. - - Args: - value (MeasurementRecord): the MeasurementRecord class object. - """ - self.MeasurementRecord = value - - def get_nonce(self): - """Fetches the Nonce field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [bytes]: the nonce value. - """ - return self.Nonce - - def set_nonce(self, value): - """Sets the Nonce field value of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (bytes): the nonce value. - """ - self.Nonce = value - - def get_opaque_data_length(self): - """Fetches the length of OpaqueData field of the object representing the SPDM GET_MEASUREMENT response. - - Returns: - [int]: the length of Opaque Data in bytes. - """ - return self.OpaqueLength - - def set_opaque_data_length(self, value): - """Sets the length of opaque data field of the object representing the SPDM GET_MEASUREMENT response. - - Args: - value (int): the length of Opaque data in bytes. - """ - self.OpaqueLength = value - - def get_opaque_data(self): - """Fetches the OpaqueData class object representing the Opaque data in the SPDM GET_MEASUREMENT response. - - Returns: - [OpaqueData]: object of class OpaqueData. - """ - return self.OpaqueData - - def get_signature(self): - """Fetches the signature field content of the SpdmMeasurementResponseMessage class object. - - Returns: - [bytes]: the signature value. - """ - return self.Signature - - def set_signature(self, value): - """Assigns the signature field value of the SpdmMeasurementResponseMessage class object. - - Args: - value (bytes): the signature value. - """ - self.Signature = value - - def parse(self, response, settings): - """Parses the raw SPDM GET_MEASUREMENT response message and sets the various fields of the SpdmMeasurementResponseMessage class object. - - Args: - response (bytes): the raw data content of the SPDM GET_MEASUREMENT response message. - settings (config.HopperSettings): object that contains the config info. - """ - assert type(response) is bytes - - byte_index = 0 - - value = response[byte_index : byte_index + self.FieldSize["SPDMVersion"]] - self.set_spdm_version(value) - byte_index = byte_index + self.FieldSize["SPDMVersion"] - - value = response[ - byte_index : byte_index + self.FieldSize["RequestResponseCode"] - ] - self.set_request_response_code(value) - byte_index = byte_index + self.FieldSize["RequestResponseCode"] - - value = response[byte_index : byte_index + self.FieldSize["Param1"]] - self.set_param1(value) - byte_index = byte_index + self.FieldSize["Param1"] - - value = response[byte_index : byte_index + self.FieldSize["Param2"]] - self.set_param2(value) - byte_index = byte_index + self.FieldSize["Param2"] - - x = response[byte_index : byte_index + self.FieldSize["NumberOfBlocks"]] - value = int(x.hex(), 16) - self.set_number_of_blocks(value) - byte_index = byte_index + self.FieldSize["NumberOfBlocks"] - - x = response[ - byte_index : byte_index + self.FieldSize["MeasurementRecordLength"] - ] - value = int(read_field_as_little_endian(x), 16) - self.set_measurement_record_length(value) - byte_index = byte_index + self.FieldSize["MeasurementRecordLength"] - - measurement_record = response[ - byte_index : byte_index + self.get_measurement_record_length() - ] - self.set_measurement_record( - MeasurementRecord(measurement_record, self.get_number_of_blocks(), settings) - ) - byte_index = byte_index + self.get_measurement_record_length() - - value = response[byte_index : byte_index + self.FieldSize["Nonce"]] - self.set_nonce(value) - byte_index = byte_index + self.FieldSize["Nonce"] - - x = response[byte_index : byte_index + self.FieldSize["OpaqueLength"]] - x = read_field_as_little_endian(x) - value = int(x, 16) - self.set_opaque_data_length(value) - byte_index = byte_index + self.FieldSize["OpaqueLength"] - - opaque_data_content = response[ - byte_index : byte_index + self.get_opaque_data_length() - ] - self.OpaqueData = OpaqueData(opaque_data_content) - byte_index = byte_index + self.get_opaque_data_length() - - value = response[byte_index : byte_index + self.FieldSize["Signature"]] - self.set_signature(value) - byte_index = byte_index + self.FieldSize["Signature"] - - def print_obj(self, logger): - """Prints all the fields of the class SpdmMeasurementResponseMessage representing the SPDM GET_MEASUREMENT response message. - - Args: - logger (logging.Logger): the logger object. - """ - logger.debug("GET MEASUREMENT RESPONSE MESSAGE") - logger.debug(f"SPDMVersion : {self.SPDMVersion.hex()}") - logger.debug(f"RequestResponseCode : {self.RequestResponseCode.hex()}") - logger.debug(f"Param1 : {self.Param1.hex()}") - logger.debug(f"Param2 : {self.Param2.hex()}") - logger.debug(f"NumberOfBlocks : {self.NumberOfBlocks}") - logger.debug(f"MeasurementRecordLength : {self.MeasurementRecordLength}") - logger.debug(f"MeasurementRecord :") - self.MeasurementRecord.print_obj(logger) - logger.debug(f"Nonce : {self.Nonce.hex()}") - logger.debug(f"OpaqueLength : {self.OpaqueLength}") - logger.debug(f"OpaqueData :") - self.OpaqueData.print_obj(logger) - logger.debug(f"Signature : {self.Signature.hex()}") - - def __init__(self, response, settings): - """The constructor method for the class SpdmMeasurementResponseMessage representing the SPDM GET_MEASUREMENT response message. - - Args: - response (bytes): The raw SPDM GET_MEASUREMENT response message. - settings (config.HopperSettings): the object containing various config. - - Raises: - ParsingError: _description_ - """ - assert type(response) is bytes - self.SPDMVersion = None - self.RequestResponseCode = None - self.Param1 = None - self.Param2 = None - self.NumberOfBlocks = None - self.MeasurementRecordLength = None - self.MeasurementRecord = None - self.Nonce = None - self.OpaqueLength = None - self.OpaqueData = None - self.Signature = None - self.FieldSize["Signature"] = settings.signature_length - try: - self.parse(response, settings) - except Exception as error: - raise ParsingError("Could not parse the GET MEASUREMENT response message.") diff --git a/packages/verifier/src/verifier/cc_admin.py b/packages/verifier/src/verifier/cc_admin.py deleted file mode 100644 index 2c4de59b..00000000 --- a/packages/verifier/src/verifier/cc_admin.py +++ /dev/null @@ -1,772 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -import argparse -import time -import logging -import jwt -import json -import sys -import base64 - -from cryptography.x509.oid import NameOID - -from verifier.attestation import AttestationReport -from verifier.rim import RIM -from verifier.nvml import ( - NvmlHandler, - NvmlHandlerTest, -) -from verifier.verifier import Verifier -from verifier.config import ( - BaseSettings, - HopperSettings, - event_log, - info_log, - __author__, - __copyright__, - __version__, -) -from verifier.exceptions import ( - Error, - NoGpuFoundError, - UnsupportedGpuArchitectureError, - CertChainVerificationFailureError, - AttestationReportVerificationError, - RIMVerificationFailureError, - UnknownGpuArchitectureError, -) -from verifier.exceptions.utils import is_non_fatal_issue -from verifier.cc_admin_utils import CcAdminUtils -from verifier.utils.claims_utils import ClaimsUtils -from verifier.nvml.gpu_cert_chains import GpuCertificateChains -from verifier.utils import ( - function_wrapper_with_timeout, - format_vbios_version, -) - -arguments_as_dictionary = None -previous_try_status = None -hwmodel = {} -oemid = {} -ueid = {} -gpu_driver_attestation_warning_list = {} -gpu_vbios_attestation_warning_list = {} - - -def main(): - """The main function for the CC admin tool.""" - global arguments_as_dictionary - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - help="Print more detailed output.", - action="store_true", - ) - parser.add_argument( - "--test_no_gpu", - help="""If there is no gpu and we - need to test the verifier, then no nvml apis will be available so, the verifier - will use a hardcoded gpu info.""", - action="store_true", - ) - parser.add_argument( - "--driver_rim", - help="The path to the driver RIM.", - ) - parser.add_argument( - "--vbios_rim", - help="The path to the VBIOS RIM.", - ) - parser.add_argument( - "--user_mode", - help="Runs the gpu attestation in user mode.", - action="store_true", - ) - parser.add_argument( - "--allow_hold_cert", - help="If the user wants to continue the attestation in case of the OCSP revocation status of the certificate in the RIM files is 'certificate_hold'.", - action="store_true", - ) - parser.add_argument( - "--nonce", - help="Nonce (32 Bytes) represented in Hex String format used for Attestation Report", - ) - parser.add_argument( - "--rim_root_cert", - help="The path to the root cert to be used for the cert chain verification of the driver and vbios rim certificate chain.", - ) - parser.add_argument( - "--rim_service_url", - help="If the user wants to override the RIM service base url and provide their own url, then can do so by passing it as a command line argument.", - ) - parser.add_argument( - "--ocsp_service_url", - help="If the user wants to override the OCSP service url and provide their own url, then can do so by passing it as a command line argument.", - ) - parser.add_argument( - "--ocsp_nonce_enabled", - help="Enable the nonce with the provided OCSP service URL.", - action="store_true", - ) - parser.add_argument( - "--ocsp_validity_extension", - help="If the OCSP response is expired within the validity extension in hours, treat the OCSP response as valid and continue the attestation.", - type=int, - ) - parser.add_argument( - "--ocsp_cert_revocation_extension_device", - help="If the OCSP response indicate the device certificate is revoked within the extension grace period in hours, treat the cert as good and continue the attestation.", - type=int, - ) - parser.add_argument( - "--ocsp_cert_revocation_extension_driver_rim", - help="If the OCSP response indicate the driver RIM certificate is revoked within the extension grace period in hours, treat the cert as good and continue the attestation.", - type=int, - ) - parser.add_argument( - "--ocsp_cert_revocation_extension_vbios_rim", - help="If the OCSP response indicate the VBIOS RIM certificate is revoked within the extension grace period in hours, treat the cert as good and continue the attestation.", - type=int, - ) - parser.add_argument( - "--ocsp_attestation_settings", - choices=["default", "strict"], - default="default", - help="""The OCSP attestation settings to be used for the attestation. - The default settings are to allow hold cert, validity extension and cert revocation extension of 7 days. - The strict settings are to not allow hold cert, validity extension and cert revocation extension of 0 days.""", - ) - - args = parser.parse_args() - arguments_as_dictionary = vars(args) - - # nonce is generated / set if cc_admin is run as a standalone-tool - if arguments_as_dictionary["test_no_gpu"]: - nonce = BaseSettings.NONCE - else: - info_log.info("Generating nonce in the local GPU Verifier ..") - nonce = CcAdminUtils.generate_nonce(BaseSettings.SIZE_OF_NONCE_IN_BYTES).hex() - - evidence_list = collect_gpu_evidence(nonce, arguments_as_dictionary["test_no_gpu"]) - result, jwt_token = attest(arguments_as_dictionary, nonce, evidence_list) - info_log.info("\nEntity Attestation Token:") - info_log.info(json.dumps(jwt_token, indent=2)) - - if not result: - sys.exit(1) - - -def collect_gpu_evidence(nonce: str, no_gpu_mode=False): - """Method to Collect GPU Evidence used by Attestation SDK - Args: - nonce (String): Hex string representation of Nonce - no_gpu_mode (Boolean): Represents if the function should run in No GPU (test) mode - Returns: - list of NVMLHandler objects containing GPU Evidence - """ - info_log.debug("collect_gpu_evidence called") - evidence_list = [] - try: - init_nvml() - if no_gpu_mode: - evidence_nonce = BaseSettings.NONCE - number_of_available_gpus = NvmlHandlerTest.get_number_of_gpus() - else: - init_nvml() - evidence_nonce = CcAdminUtils.validate_and_extract_nonce(nonce) - - number_of_available_gpus = NvmlHandler.get_number_of_gpus() - if number_of_available_gpus == 0: - err_msg = "No GPU found" - info_log.critical(err_msg) - raise NoGpuFoundError(err_msg) - info_log.info(f"Number of GPUs available : {number_of_available_gpus}") - - for i in range(number_of_available_gpus): - info_log.info(f"Fetching GPU {i} information from GPU driver.") - if no_gpu_mode: - gpu_info_obj = NvmlHandlerTest(settings=BaseSettings) - else: - gpu_info_obj = NvmlHandler( - index=i, nonce=evidence_nonce, settings=BaseSettings - ) - evidence_list.append(gpu_info_obj) - info_log.info("All GPU Evidences fetched successfully") - - except Exception as error: - info_log.error(error) - finally: - return evidence_list - - -def collect_gpu_evidence_local(nonce: str, no_gpu_mode=False): - """Method to Collect GPU Evidence for Local GPU Attestation workflow - Args: - nonce (String): Hex string representation of Nonce - no_gpu_mode (Boolean): Represents if the function should run in No GPU (test) mode - Returns: - list of NVMLHandler objects containing GPU Evidence - """ - return collect_gpu_evidence(nonce, no_gpu_mode) - - -def collect_gpu_evidence_remote(nonce: str, no_gpu_mode=False): - """Method to Collect GPU Evidence for Remote GPU Attestation workflow - Args: - nonce (String): Hex string representation of Nonce - no_gpu_mode (Boolean): Represents if the function should run in No GPU (test) mode - Returns: - GPU Evidence list containing Base64 Encoded GPU certificate chain and Attestation Report as Hex String - """ - evidence_list = collect_gpu_evidence(nonce, no_gpu_mode) - remote_evidence_list = [] - for gpu_info_obj in evidence_list: - gpu_cert_chain = gpu_info_obj.get_attestation_cert_chain() - gpu_cert_chain_base64 = GpuCertificateChains.extract_gpu_cert_chain_base64( - gpu_cert_chain - ) - evidence_bytes = gpu_info_obj.get_attestation_report() - evidence_base64 = base64.b64encode(evidence_bytes).decode("utf-8") - gpu_evidence = { - "certificate": gpu_cert_chain_base64, - "evidence": evidence_base64, - } - remote_evidence_list.append(gpu_evidence) - return remote_evidence_list - - -def init_nvml(): - """Method to Initialize NVML library""" - event_log.debug("Initializing the nvml library") - NvmlHandler.init_nvml() - # Ensuring that the system is running either in Confidential Compute mode or PPCIE mode - if not NvmlHandler.is_cc_enabled() and not NvmlHandler.is_ppcie_mode_enabled(): - event_log.debug( - "The confidential compute is", - NvmlHandler.is_cc_enabled(), - "and the PPCIE mode is", - NvmlHandler.is_ppcie_mode_enabled(), - ) - err_msg = ( - "The confidential compute feature and PPCIE mode is disabled !! Exiting now. Please enable one of " - "the feature and try again" - ) - raise Error(err_msg) - - if NvmlHandler.is_cc_dev_mode(): - info_log.info("The system is running in CC DevTools mode !!") - - -def attest(arguments_as_dictionary, nonce, gpu_evidence_list): - """Method to perform GPU Attestation and return an Attestation Response. - - Args: - arguments_as_dictionary (Dictionary): the dictionary object containing Attestation Options. - - Raises: - Different Errors regarding GPU Attestation - - Returns: - A tuple containing Attestation result (boolean) and Attestation JWT claims(JWT Object) - """ - overall_status = False - gpu_claims_list = [] # (index, gpu_uuid, gpu_claims) - att_report_nonce_hex = CcAdminUtils.validate_and_extract_nonce(nonce) - - try: - # Set log level to DEBUG if verbose flag is set - if arguments_as_dictionary["verbose"]: - info_log.setLevel(logging.DEBUG) - - # Get Azure VM Region - BaseSettings.get_vm_region() - info_log.debug(f"VM Region : {BaseSettings.AZURE_VM_REGION}") - - # Set RIM service url - if not arguments_as_dictionary["rim_service_url"] is None: - BaseSettings.set_rim_service_base_url( - arguments_as_dictionary["rim_service_url"] - ) - else: - BaseSettings.set_thim_rim_service_base_url() - info_log.debug(f"RIM service url: {BaseSettings.RIM_SERVICE_BASE_URL}") - - # Set OCSP service url - if not arguments_as_dictionary["ocsp_service_url"] is None: - BaseSettings.set_ocsp_service_url( - arguments_as_dictionary["ocsp_service_url"] - ) - BaseSettings.OCSP_NONCE_ENABLED = arguments_as_dictionary.get( - "ocsp_nonce_enabled", False - ) - else: - BaseSettings.set_thim_ocsp_service_url() - info_log.debug( - f"OCSP service url: {BaseSettings.OCSP_URL}\nOCSP Nonce: {'ENABLED' if BaseSettings.OCSP_NONCE_ENABLED else 'DISABLED'}" - ) - - # Set OCSP attestation settings - if arguments_as_dictionary["ocsp_attestation_settings"] == "strict": - BaseSettings.allow_hold_cert = False - BaseSettings.OCSP_VALIDITY_EXTENSION_HRS = 0 - BaseSettings.OCSP_CERT_REVOCATION_DEVICE_EXTENSION_HRS = 0 - BaseSettings.OCSP_CERT_REVOCATION_DRIVER_RIM_EXTENSION_HRS = 0 - BaseSettings.OCSP_CERT_REVOCATION_VBIOS_RIM_EXTENSION_HRS = 0 - elif arguments_as_dictionary["ocsp_attestation_settings"] == "default": - BaseSettings.allow_hold_cert = True - BaseSettings.OCSP_VALIDITY_EXTENSION_HRS = 14 * 24 - BaseSettings.OCSP_CERT_REVOCATION_DEVICE_EXTENSION_HRS = 14 * 24 - BaseSettings.OCSP_CERT_REVOCATION_DRIVER_RIM_EXTENSION_HRS = 14 * 24 - BaseSettings.OCSP_CERT_REVOCATION_VBIOS_RIM_EXTENSION_HRS = 90 * 24 - - # Set allow OCSP cert hold flag - if arguments_as_dictionary["allow_hold_cert"] is not None: - BaseSettings.allow_hold_cert = ( - BaseSettings.allow_hold_cert - or arguments_as_dictionary["allow_hold_cert"] - ) - - # Set OCSP validity extension - if arguments_as_dictionary["ocsp_validity_extension"] is not None: - BaseSettings.OCSP_VALIDITY_EXTENSION_HRS = max( - 0, arguments_as_dictionary["ocsp_validity_extension"] - ) - - # Set OCSP cert revoked extension - if arguments_as_dictionary["ocsp_cert_revocation_extension_device"] is not None: - BaseSettings.OCSP_CERT_REVOCATION_DEVICE_EXTENSION_HRS = max( - 0, arguments_as_dictionary["ocsp_cert_revocation_extension_device"] - ) - if ( - arguments_as_dictionary["ocsp_cert_revocation_extension_driver_rim"] - is not None - ): - BaseSettings.OCSP_CERT_REVOCATION_DRIVER_RIM_EXTENSION_HRS = max( - 0, arguments_as_dictionary["ocsp_cert_revocation_extension_driver_rim"] - ) - if ( - arguments_as_dictionary["ocsp_cert_revocation_extension_vbios_rim"] - is not None - ): - BaseSettings.OCSP_CERT_REVOCATION_VBIOS_RIM_EXTENSION_HRS = max( - 0, arguments_as_dictionary["ocsp_cert_revocation_extension_vbios_rim"] - ) - - # Set the RIM root certificate path - if not arguments_as_dictionary["rim_root_cert"] is None: - BaseSettings.set_rim_root_certificate( - arguments_as_dictionary["rim_root_cert"] - ) - - # Log the arguments and BaseSettings - base_settings_dict = dict( - (k, v) - for k, v in vars(BaseSettings).items() - if not ( - k.startswith("_") - or callable(v) - or k in dir(BaseSettings.__class__) - or isinstance(v, classmethod) - ) - ) - event_log.debug(f"Arguments: {arguments_as_dictionary}") - event_log.debug(f"BaseSettings: {base_settings_dict}") - - # Run attestation for each GPU - for i, gpu_info_obj in enumerate(gpu_evidence_list): - info_log.info("-----------------------------------") - - if gpu_info_obj.get_gpu_architecture() == "HOPPER": - event_log.debug(f"The architecture of the GPU with index {i} is HOPPER") - settings = HopperSettings() - - HopperSettings.set_driver_rim_path( - arguments_as_dictionary["driver_rim"] - ) - HopperSettings.set_vbios_rim_path(arguments_as_dictionary["vbios_rim"]) - - if arguments_as_dictionary["test_no_gpu"]: - HopperSettings.set_driver_rim_path( - HopperSettings.TEST_NO_GPU_DRIVER_RIM_PATH - ) - HopperSettings.set_vbios_rim_path( - HopperSettings.TEST_NO_GPU_VBIOS_RIM_PATH - ) - else: - err_msg = "Unknown GPU architecture." - event_log.error(err_msg) - raise UnknownGpuArchitectureError(err_msg) - - event_log.debug("GPU info fetched successfully.") - info_log.info(f"Verifying GPU: {str(gpu_info_obj.get_uuid())}") - - if gpu_info_obj.get_gpu_architecture() != settings.GpuArch: - err_msg = "\tGPU architecture is not supported." - event_log.error(err_msg) - raise UnsupportedGpuArchitectureError(err_msg) - - event_log.debug("\tGPU architecture is correct.") - settings.mark_gpu_arch_is_correct() - - driver_version = gpu_info_obj.get_driver_version() - vbios_version = gpu_info_obj.get_vbios_version() - vbios_version = vbios_version.lower() - - info_log.info(f"\tDriver version fetched : {driver_version}") - info_log.info(f"\tVBIOS version fetched : {vbios_version}") - settings.mark_gpu_driver_version(driver_version) - settings.mark_gpu_vbios_version(vbios_version) - - event_log.debug(f"GPU info fetched : \n\t\t{vars(gpu_info_obj)}") - - # Parsing the attestation report. - attestation_report_data = gpu_info_obj.get_attestation_report() - attestation_report_obj = AttestationReport( - attestation_report_data, settings - ) - settings.mark_attestation_report_parsed() - - info_log.info("\tValidating GPU certificate chains.") - gpu_attestation_cert_chain = gpu_info_obj.get_attestation_cert_chain() - - for certificate in gpu_attestation_cert_chain: - cert = certificate.to_cryptography() - issuer = cert.issuer.public_bytes() - subject = cert.subject.public_bytes() - - if issuer == subject: - event_log.debug("Root certificate is a available.") - - if len(gpu_attestation_cert_chain) > 1: - common_name = ( - gpu_attestation_cert_chain[1] - .to_cryptography() - .subject.get_attributes_for_oid(NameOID.COMMON_NAME)[0] - .value - ) - hwmodel[gpu_info_obj.get_uuid()] = common_name - ueid[gpu_info_obj.get_uuid()] = gpu_attestation_cert_chain[ - 0 - ].get_serial_number() - - gpu_leaf_cert = gpu_attestation_cert_chain[0] - event_log.debug("\t\tverifying attestation certificate chain.") - cert_verification_status = CcAdminUtils.verify_gpu_certificate_chain( - gpu_attestation_cert_chain, - settings, - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_FWID") - .hex(), - ) - - if not cert_verification_status: - err_msg = ( - "\t\tGPU attestation report certificate chain validation failed." - ) - event_log.error(err_msg) - raise CertChainVerificationFailureError(err_msg) - else: - info_log.info( - "\t\tGPU attestation report certificate chain validation successful." - ) - - cert_chain_revocation_status, gpu_attestation_warning = ( - CcAdminUtils.ocsp_certificate_chain_validation( - gpu_attestation_cert_chain, - settings, - BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION, - ) - ) - - if not cert_chain_revocation_status: - err_msg = "\t\tGPU attestation report certificate chain revocation validation failed." - event_log.error(err_msg) - raise CertChainVerificationFailureError(err_msg) - - settings.mark_gpu_attestation_report_cert_chain_validated() - - info_log.info("\tAuthenticating attestation report") - attestation_report_obj.print_obj(info_log) - attestation_report_verification_status = ( - CcAdminUtils.verify_attestation_report( - attestation_report_obj=attestation_report_obj, - gpu_leaf_certificate=gpu_leaf_cert, - nonce=att_report_nonce_hex, - driver_version=driver_version, - vbios_version=vbios_version, - settings=settings, - ) - ) - - if attestation_report_verification_status: - info_log.info("\t\tAttestation report verification successful.") - else: - err_msg = "\t\tAttestation report verification failed." - event_log.error(err_msg) - raise AttestationReportVerificationError(err_msg) - - info_log.info("\tAuthenticating the RIMs.") - - # performing the schema validation and signature verification of the driver RIM. - info_log.info("\t\tAuthenticating Driver RIM") - - # Use local RIM file if provided, else fetch from RIM service - if ( - arguments_as_dictionary.get("driver_rim") - or arguments_as_dictionary["test_no_gpu"] - ): - info_log.info( - "\t\t\tUsing the local driver rim file : " - + settings.DRIVER_RIM_PATH - ) - driver_rim = RIM( - rim_name="driver", - settings=settings, - rim_path=settings.DRIVER_RIM_PATH, - ) - else: - info_log.info("\t\t\tFetching the driver RIM from the RIM service.") - driver_rim_file_id = CcAdminUtils.get_driver_rim_file_id(driver_version) - driver_rim_content = CcAdminUtils.fetch_rim_file( - driver_rim_file_id, BaseSettings.RIM_SERVICE_RETRY_COUNT - ) - driver_rim = RIM( - rim_name="driver", settings=settings, content=driver_rim_content - ) - try: - driver_rim_manufacturer_id = driver_rim.get_manufacturer_id( - driver_rim_content - ) - except Exception as error: - event_log.error( - f"Error while fetching manufacturer id from driver RIM : {error}" - ) - driver_rim_manufacturer_id = None - oemid[gpu_info_obj.get_uuid()] = driver_rim_manufacturer_id - - driver_rim_verification_status, gpu_driver_attestation_warning = ( - driver_rim.verify(version=driver_version, settings=settings) - ) - gpu_driver_attestation_warning_list[gpu_info_obj.get_uuid()] = ( - gpu_driver_attestation_warning - ) - - if driver_rim_verification_status: - settings.mark_driver_rim_signature_verified() - info_log.info("\t\t\tDriver RIM verification successful") - else: - event_log.error("\t\t\tDriver RIM verification failed.") - raise RIMVerificationFailureError( - "\t\t\tDriver RIM verification failed.\n\t\t\tQuitting now." - ) - - # performing the schema validation and signature verification of the vbios RIM. - info_log.info("\t\tAuthenticating VBIOS RIM.") - if ( - arguments_as_dictionary.get("vbios_rim") - or arguments_as_dictionary["test_no_gpu"] - ): - info_log.info( - "\t\t\tUsing the local VBIOS rim file : " + settings.VBIOS_RIM_PATH - ) - driver_rim = RIM( - rim_name="vbios", - settings=settings, - rim_path=settings.VBIOS_RIM_PATH, - ) - - else: - info_log.info("\t\t\tFetching the VBIOS RIM from the RIM service.") - project = ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_PROJECT") - ) - project_sku = ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_PROJECT_SKU") - ) - chip_sku = ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_CHIP_SKU") - ) - vbios_version = format_vbios_version( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_VBIOS_VERSION") - ) - vbios_version_for_id = vbios_version.replace(".", "").upper() - vbios_version = vbios_version.lower() - - project = project.decode("ascii").strip().strip("\x00") - project = project.upper() - project_sku = project_sku.decode("ascii").strip().strip("\x00") - project_sku = project_sku.upper() - chip_sku = chip_sku.decode("ascii").strip().strip("\x00") - chip_sku = chip_sku.upper() - vbios_rim_file_id = CcAdminUtils.get_vbios_rim_file_id( - project, project_sku, chip_sku, vbios_version_for_id - ) - event_log.debug(f"vbios_rim_file_id is {vbios_rim_file_id}") - vbios_rim_content = CcAdminUtils.fetch_rim_file( - vbios_rim_file_id, BaseSettings.RIM_SERVICE_RETRY_COUNT - ) - vbios_rim = RIM( - rim_name="vbios", settings=settings, content=vbios_rim_content - ) - - vbios_rim_verification_status, gpu_attestation_warning = vbios_rim.verify( - version=vbios_version, settings=settings - ) - gpu_vbios_attestation_warning_list[gpu_info_obj.get_uuid()] = ( - gpu_attestation_warning - ) - - if vbios_rim_verification_status: - settings.mark_vbios_rim_signature_verified() - info_log.info("\t\t\tVBIOS RIM verification successful") - else: - event_log.error("\t\tVBIOS RIM verification failed.") - raise RIMVerificationFailureError( - "\t\tVBIOS RIM verification failed.\n\tQuitting now." - ) - - verifier_obj = Verifier( - attestation_report_obj, driver_rim, vbios_rim, settings=settings - ) - verifier_obj.verify(settings) - - # Checking the attestation status. - if settings.check_status(): - info_log.info( - f"\tGPU {i} with UUID {gpu_info_obj.get_uuid()} verified successfully." - ) - else: - info_log.info( - f"The verification of GPU {i} with UUID {gpu_info_obj.get_uuid()} resulted in failure." - ) - - if i == 0: - overall_status = settings.check_status() - else: - overall_status = overall_status and settings.check_status() - - # Set current gpu_claims - current_gpu_uuid = gpu_info_obj.get_uuid() - current_gpu_claims = ClaimsUtils.get_current_gpu_claims( - settings, current_gpu_uuid - ) - gpu_claims_list.append((i, current_gpu_uuid, current_gpu_claims)) - - except Exception as error: - info_log.error(error) - - if arguments_as_dictionary["test_no_gpu"]: - return - else: - current_gpu_uuid = gpu_info_obj.get_uuid() - current_gpu_claims = ClaimsUtils.get_current_gpu_claims( - settings, current_gpu_uuid - ) - gpu_claims_list.append((i, current_gpu_uuid, current_gpu_claims)) - - finally: - # Checking the attestation status. - if overall_status: - if ( - not arguments_as_dictionary["user_mode"] - and not arguments_as_dictionary["test_no_gpu"] - ): - if not NvmlHandler.get_gpu_ready_state(): - info_log.info("\tSetting the GPU Ready State to READY") - NvmlHandler.set_gpu_ready_state(True) - else: - info_log.info("\tGPU Ready State is already READY") - info_log.info(f"All GPUs verified successfully.") - elif arguments_as_dictionary["test_no_gpu"]: - pass - - jwt_claims = ClaimsUtils.create_detached_eat_claims( - overall_status, - gpu_claims_list, - nonce, - hwmodel, - oemid, - ueid, - gpu_driver_attestation_warning_list, - gpu_vbios_attestation_warning_list, - ) - event_log.debug("-----------------------------------") - event_log.debug("-----------ENDING-----------") - return overall_status, jwt_claims - - -def create_jwt_token(gpu_claims_list: any): - """Method to create a JWT token from JSON claims object - Args: - gpu_claims_list: list of Attestation Claims in JSON. - Returns: - JWT token that corresponds to the Claims. - """ - encoded_data = jwt.encode(gpu_claims_list, "secret", "HS256") - return encoded_data - - -def retry(nonce): - """This function is used to retry the GPU attestation again in case of occurrence of - certain types of exceptions. - """ - global arguments_as_dictionary - - # Clean-up - NvmlHandler.close_nvml() - - if BaseSettings.is_retry_allowed(): - info_log.info("Retrying the GPU attestation.") - attest(arguments_as_dictionary) - time.sleep(BaseSettings.MAX_TIME_DELAY) - else: - if NvmlHandler.is_cc_dev_mode(): - info_log.info("\tGPU is running in DevTools mode!!") - if not arguments_as_dictionary["user_mode"]: - if not NvmlHandler.get_gpu_ready_state(): - info_log.info("\tSetting the GPU Ready State to READY") - NvmlHandler.set_gpu_ready_state(True) - else: - info_log.info("\tGPU Ready State is already READY") - - -if __name__ == "__main__": - main() diff --git a/packages/verifier/src/verifier/cc_admin_utils.py b/packages/verifier/src/verifier/cc_admin_utils.py deleted file mode 100644 index bcea6cd1..00000000 --- a/packages/verifier/src/verifier/cc_admin_utils.py +++ /dev/null @@ -1,959 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -import os -import time -import secrets -import string -from datetime import datetime, timezone, timedelta -from urllib import request -from urllib.error import HTTPError -import json -import base64 - - -from OpenSSL import crypto -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.hashes import SHA384 -from cryptography.hazmat.primitives.asymmetric import ec -from cryptography.exceptions import InvalidSignature -from cryptography.x509 import ocsp, OCSPNonce -from cryptography import x509 - -from verifier.attestation import AttestationReport -from verifier.config import ( - BaseSettings, - info_log, - event_log, -) -from verifier.utils import ( - format_vbios_version, - function_wrapper_with_timeout, -) -from verifier.exceptions import ( - NoCertificateError, - IncorrectNumberOfCertificatesError, - NonceMismatchError, - DriverVersionMismatchError, - SignatureVerificationError, - VBIOSVersionMismatchError, - RIMFetchError, - OCSPFetchError, - InvalidNonceError, -) - - -class CcAdminUtils: - """A class to provide the required functionalities for the CC ADMIN to perform the GPU attestation.""" - - @staticmethod - def extract_fwid(cert): - """A static function to extract the FWID data from the given certificate. - Args: - cert (OpenSSL.crypto.X509): The certificate whose FWID data is needed to be fetched. - Returns: - [str]: the FWID as a hex string extracted from the certificate if - it is present otherwise returns an empty string. - """ - result = "" - # The OID for the FWID extension. - TCG_DICE_FWID_OID = "2.23.133.5.4.1" - cryptography_cert = cert.to_cryptography() - - for i in range(len(cryptography_cert.extensions)): - oid_obj = (vars(cryptography_cert.extensions)["_extensions"][i]).oid - if getattr(oid_obj, "dotted_string") == TCG_DICE_FWID_OID: - # The FWID data is the last 48 bytes. - result = vars( - (vars(cryptography_cert.extensions)["_extensions"][i]).value - )["_value"][-48:].hex() - - return result - - @staticmethod - def verify_gpu_certificate_chain(cert_chain, settings, attestation_report_fwid): - """A static function to perform the GPU device certificate chain verification. - Args: - cert_chain (list): A list containing the certificate objects of the device certificate chain. - settings (config.HopperSettings): the object containing the various config info. - attestation_report_fwid (str): the hexadecimal string of the FWID in the attestation report. - Returns: - [bool]: True if the verification is successful, otherwise False. - """ - # Skipping the comparision of FWID in the attestation certificate if the Attestation report does not contains the FWID. - if attestation_report_fwid != "": - if attestation_report_fwid != CcAdminUtils.extract_fwid(cert_chain[0]): - info_log.error( - "\t\tThe firmware ID in the device certificate chain is not matching with the one in the attestation report." - ) - event_log.info( - f"\t\tThe FWID read from the attestation report is : {attestation_report_fwid}" - ) - return False - - info_log.info( - "\t\tThe firmware ID in the device certificate chain is matching with the one in the attestation report." - ) - - return CcAdminUtils.verify_certificate_chain( - cert_chain, - settings, - BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION, - ) - - @staticmethod - def verify_certificate_chain(cert_chain, settings, mode): - """Performs the certificate chain verification. - - Args: - cert_chain (list): the certificate chain as a list with the root - cert at the end of the list. - settings (config.HopperSettings): the object containing the various config info. - mode (): Used to determine if the certificate chain - verification is for the GPU attestation certificate chain or RIM certificate chain - or the ocsp response certificate chain. - - Raises: - NoCertificateError: it is raised if the cert_chain list is empty. - IncorrectNumberOfCertificatesError: it is raised if the number of - certificates in cert_chain list is unexpected. - - Returns: - [bool]: True if the verification is successful, otherwise False. - """ - assert isinstance(cert_chain, list) - - number_of_certificates = len(cert_chain) - - event_log.debug(f"verify_certificate_chain() called for {str(mode)}") - event_log.debug(f"Number of certificates : {number_of_certificates}") - - if number_of_certificates < 1: - event_log.error("\t\tNo certificates found in certificate chain.") - raise NoCertificateError("\t\tNo certificates found in certificate chain.") - - if ( - number_of_certificates != settings.MAX_CERT_CHAIN_LENGTH - and mode == BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION - ): - event_log.error( - "\t\tThe number of certificates fetched from the GPU is unexpected." - ) - raise IncorrectNumberOfCertificatesError( - "\t\tThe number of certificates fetched from the GPU is unexpected." - ) - - store = crypto.X509Store() - index = number_of_certificates - 1 - while index > -1: - if index == number_of_certificates - 1: - # The root CA certificate is stored at the end in the cert chain. - store.add_cert(cert_chain[index]) - index = index - 1 - else: - store_context = crypto.X509StoreContext(store, cert_chain[index]) - try: - store_context.verify_certificate() - store.add_cert(cert_chain[index]) - index = index - 1 - except crypto.X509StoreContextError as e: - event_log.info( - f"Cert chain verification is failing at index : {index}" - ) - event_log.error(e) - return False - return True - - @staticmethod - def convert_cert_from_cryptography_to_pyopenssl(cert): - """A static method to convert the "Cryptography" X509 certificate object to "pyOpenSSL" - X509 certificate object. - - Args: - cert (cryptography.hazmat.backends.openssl.x509._Certificate): the input certificate object. - - Returns: - [OpenSSL.crypto.X509]: the converted X509 certificate object. - """ - return crypto.load_certificate( - type=crypto.FILETYPE_ASN1, - buffer=cert.public_bytes(serialization.Encoding.DER), - ) - - @staticmethod - def build_ocsp_request(cert, issuer, nonce=None): - """A static method to build the ocsp request message. - - Args: - cert (OpenSSL.crypto.X509): the input certificate object. - issuer (OpenSSL.crypto.X509): the issuer certificate object. - nonce (bytes, optional): the nonce to be added in the ocsp request message. Defaults to None. - - Returns: - [bytes]: the raw ocsp request message. - """ - request_builder = ocsp.OCSPRequestBuilder() - request_builder = request_builder.add_certificate(cert, issuer, SHA384()) - if nonce is not None: - request_builder = request_builder.add_extension( - extval=OCSPNonce(nonce), critical=True - ) - return request_builder.build() - - @staticmethod - def ocsp_certificate_chain_validation(cert_chain, settings, mode): - """A static method to perform the ocsp status check of the input certificate chain along with the - signature verification and the cert chain verification if the ocsp response message received. - - Args: - cert_chain (list): the list of the input certificates of the certificate chain. - settings (config.HopperSettings): the object containing the various config info. - mode (): Used to determine if the certificate chain - verification is for the GPU attestation certificate chain or RIM certificate chain - or the ocsp response certificate chain. - - Returns: - [Bool]: True if the ocsp status of all the appropriate certificates in the - certificate chain, otherwise False. - """ - assert isinstance(cert_chain, list) - revoked_status = False - start_index = 0 - gpu_attestation_warning_msg_list = [] - - if mode == BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION: - start_index = 1 - - end_index = len(cert_chain) - 1 - - for i, cert in enumerate(cert_chain): - cert_chain[i] = cert.to_cryptography() - - for i in range(start_index, end_index): - cert_common_name = ( - cert_chain[i] - .subject.get_attributes_for_oid(x509.oid.NameOID.COMMON_NAME)[0] - .value - ) - - # Fetch OCSP Response from provided OCSP Service - nonce = ( - CcAdminUtils.generate_nonce(BaseSettings.SIZE_OF_NONCE_IN_BYTES) - if BaseSettings.OCSP_NONCE_ENABLED - else None - ) - ocsp_request = CcAdminUtils.build_ocsp_request( - cert_chain[i], cert_chain[i + 1], nonce - ) - try: - ocsp_response = function_wrapper_with_timeout( - [ - CcAdminUtils.fetch_ocsp_response_from_url, - ocsp_request.public_bytes(serialization.Encoding.DER), - BaseSettings.OCSP_URL, - BaseSettings.OCSP_RETRY_COUNT, - "send_ocsp_request", - ], - BaseSettings.MAX_OCSP_REQUEST_TIME_DELAY - * BaseSettings.OCSP_RETRY_COUNT, - ) - except Exception as e: - event_log.error( - f"Exception occurred while fetching OCSP response from provided OCSP service: {str(e)}" - ) - ocsp_response = None - - # Fallback to Nvidia OCSP Service if the fetch fails - if ocsp_response is None: - nonce = CcAdminUtils.generate_nonce(BaseSettings.SIZE_OF_NONCE_IN_BYTES) - ocsp_request = CcAdminUtils.build_ocsp_request( - cert_chain[i], cert_chain[i + 1], nonce - ) - try: - ocsp_response = function_wrapper_with_timeout( - [ - CcAdminUtils.fetch_ocsp_response_from_url, - ocsp_request.public_bytes(serialization.Encoding.DER), - BaseSettings.OCSP_URL_NVIDIA, - BaseSettings.OCSP_RETRY_COUNT, - "send_ocsp_request", - ], - BaseSettings.MAX_OCSP_REQUEST_TIME_DELAY - * BaseSettings.OCSP_RETRY_COUNT, - ) - except Exception as e: - event_log.error( - f"Exception occurred while fetching OCSP response from Nvidia OCSP service: {str(e)}" - ) - ocsp_response = None - - # Raise error if OCSP response is not fetched from both OCSP services - if ocsp_response is None: - error_msg = f"Failed to fetch the ocsp response for certificate {cert_common_name}" - info_log.error(f"\t\t\t{error_msg}") - raise OCSPFetchError(error_msg) - - # Verify the OCSP response status - if ocsp_response.response_status != ocsp.OCSPResponseStatus.SUCCESSFUL: - error_msg = "Couldn't receive a proper response from the OCSP server." - info_log.error(f"\t\t{error_msg}") - return False, error_msg - - # Verify the Nonce in the OCSP response - if ( - nonce is not None - and nonce - != ocsp_response.extensions.get_extension_for_class( - OCSPNonce - ).value.nonce - ): - error_msg = "The nonce in the OCSP response message is not matching with the one passed in the OCSP request message." - info_log.error(f"\t\t{error_msg}") - return False, error_msg - elif i == end_index - 1: - info_log.debug("\t\tGPU Certificate OCSP Nonce is matching") - - # Verify the OCSP response is within the validity period - timestamp_format = "%Y/%m/%d %H:%M:%S UTC" - this_update = ocsp_response.this_update_utc - next_update = ocsp_response.next_update_utc - next_update_extended = next_update + timedelta( - hours=BaseSettings.OCSP_VALIDITY_EXTENSION_HRS - ) - utc_now = datetime.now(timezone.utc) - event_log.debug(f"Current time: {utc_now.strftime(timestamp_format)}") - event_log.debug( - f"OCSP this update: {this_update.strftime(timestamp_format)}" - ) - event_log.debug( - f"OCSP next update: {next_update.strftime(timestamp_format)}" - ) - event_log.debug( - f"OCSP next update extended: {next_update_extended.strftime(timestamp_format)}" - ) - - # Outside validity period, print warning - if not (this_update <= utc_now <= next_update): - ocsp_outside_validity_msg = f"OCSP FOR {cert_common_name} IS EXPIRED AFTER {next_update.strftime(timestamp_format)}." - event_log.warning(ocsp_outside_validity_msg) - gpu_attestation_warning_msg_list.append(ocsp_outside_validity_msg) - - # Outside extended validity period - if not (this_update <= utc_now <= next_update_extended): - ocsp_outside_extended_validity_msg = ( - f"OCSP FOR {cert_common_name} IS EXPIRED AND IS NO LONGER VALID FOR ATTESTATION " - f"AFTER {next_update_extended.strftime(timestamp_format)}." - ) - event_log.error(ocsp_outside_extended_validity_msg) - info_log.error(f"\t\tERROR: {ocsp_outside_extended_validity_msg}") - return False, ocsp_outside_extended_validity_msg - - # Verifying the ocsp response certificate chain. - ocsp_response_leaf_cert = crypto.load_certificate( - type=crypto.FILETYPE_ASN1, - buffer=ocsp_response.certificates[0].public_bytes( - serialization.Encoding.DER - ), - ) - ocsp_cert_chain = [ocsp_response_leaf_cert] - - for j in range(i, len(cert_chain)): - ocsp_cert_chain.append( - CcAdminUtils.convert_cert_from_cryptography_to_pyopenssl( - cert_chain[j] - ) - ) - ocsp_cert_chain_verification_status = CcAdminUtils.verify_certificate_chain( - ocsp_cert_chain, - settings, - BaseSettings.Certificate_Chain_Verification_Mode.OCSP_RESPONSE, - ) - - if not ocsp_cert_chain_verification_status: - error_msg = f"The ocsp response certificate chain verification failed for {cert_common_name}." - info_log.error(f"\t\t{error_msg}") - return False, error_msg - elif i == end_index - 1: - info_log.debug("\t\tGPU Certificate OCSP Cert chain is verified") - - # Verifying the signature of the ocsp response message. - if not CcAdminUtils.verify_ocsp_signature(ocsp_response): - error_msg = f"The ocsp response response for certificate {cert_common_name} failed due to signature verification failure." - info_log.error(f"\t\t{error_msg}") - return False, error_msg - elif i == end_index - 1: - info_log.debug("\t\tGPU Certificate OCSP Signature is verified") - - # The OCSP response certificate status is unknown - if ocsp_response.certificate_status == ocsp.OCSPCertStatus.UNKNOWN: - error_msg = ( - f"The {cert_common_name} certificate revocation status is UNKNOWN" - ) - info_log.error(f"\t\t\t{error_msg}") - return False, error_msg - - # The OCSP response certificate status is revoked - if ocsp_response.certificate_status == ocsp.OCSPCertStatus.REVOKED: - # Get cert revoke timestamp - cert_revocation_extension_hrs = 0 - if ( - mode - == BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION - ): - cert_revocation_extension_hrs = ( - BaseSettings.OCSP_CERT_REVOCATION_DEVICE_EXTENSION_HRS - ) - elif ( - mode - == BaseSettings.Certificate_Chain_Verification_Mode.DRIVER_RIM_CERT - ): - cert_revocation_extension_hrs = ( - BaseSettings.OCSP_CERT_REVOCATION_DRIVER_RIM_EXTENSION_HRS - ) - elif ( - mode - == BaseSettings.Certificate_Chain_Verification_Mode.VBIOS_RIM_CERT - ): - cert_revocation_extension_hrs = ( - BaseSettings.OCSP_CERT_REVOCATION_VBIOS_RIM_EXTENSION_HRS - ) - - cert_revocation_time = ocsp_response.revocation_time_utc - cert_revocation_reason = ocsp_response.revocation_reason - cert_revocation_time_extended = cert_revocation_time + timedelta( - hours=cert_revocation_extension_hrs - ) - - # Cert is revoked, print warning - cert_revocation_msg = ( - f"THE CERTIFICATE {cert_common_name} IS REVOKED FOR '{cert_revocation_reason.value}' " - f"AT {cert_revocation_time.strftime(timestamp_format)}." - ) - event_log.warning(cert_revocation_msg) - gpu_attestation_warning_msg_list.append(cert_revocation_msg) - - # Cert is revoked but certificate_hold is allowed - if ( - x509.ReasonFlags.certificate_hold == cert_revocation_reason - and BaseSettings.allow_hold_cert - ): - cert_revocation_hold_allowed_msg = ( - f"THE CERTIFICATE {cert_common_name} IS REVOKED FOR '{cert_revocation_reason.value}' " - f"BUT STILL GOOD FOR ATTESTATION WITH allow_hold_cert ENABLED." - ) - event_log.warning(cert_revocation_hold_allowed_msg) - gpu_attestation_warning_msg_list.append( - cert_revocation_hold_allowed_msg - ) - - # Cert is revoked but within the extension period - elif datetime.now(timezone.utc) <= cert_revocation_time_extended: - cert_revocation_within_extension_msg = ( - f"THE CERTIFICATE {cert_common_name} IS REVOKED FOR '{cert_revocation_reason.value}' " - f"BUT STILL GOOD FOR ATTESTATION UNTIL {cert_revocation_time_extended.strftime(timestamp_format)} WITH " - f"{cert_revocation_extension_hrs} HOURS OF GRACE PERIOD." - ) - event_log.warning(cert_revocation_within_extension_msg) - gpu_attestation_warning_msg_list.append( - cert_revocation_within_extension_msg - ) - - # Cert is revoked and outside the extension period - else: - cert_revocation_novalid_msg = ( - f"THE CERTIFICATE {cert_common_name} IS REVOKED FOR '{cert_revocation_reason.value}' " - f"AND NO LONGER GOOD FOR ATTESTATION AFTER {cert_revocation_time_extended.strftime(timestamp_format)}." - ) - event_log.error(cert_revocation_novalid_msg) - gpu_attestation_warning_msg_list.append(cert_revocation_novalid_msg) - info_log.error(f"\t\t\tERROR: {cert_revocation_novalid_msg}") - info_log.error( - "\t\t\tThe certificate chain revocation status verification was not successful" - ) - return False, "\n".join(gpu_attestation_warning_msg_list) - - info_log.info( - f"\t\t\tThe certificate chain revocation status verification successful." - ) - return True, "\n".join(gpu_attestation_warning_msg_list) - - @staticmethod - def fetch_ocsp_response_from_url(ocsp_request_data, url, max_retries): - """A static method to prepare http request and send it to the ocsp server - and returns the ocsp response message. - - Args: - ocsp_request_data (bytes): the raw ocsp request message. - url (str): the url of the ocsp service. - max_retries (int, optional): the maximum number of retries to be performed in case of any error. - - Returns: - [cryptography.hazmat.backends.openssl.ocsp._OCSPResponse]: the ocsp response message object. - """ - # OCSP service URL should start with https - if not url.lower().startswith("https"): - info_log.error(f"The OCSP service url {url} does not start with https") - return None - - # Sending the ocsp request to the given url - try: - ocsp_request = request.Request(url, ocsp_request_data) - ocsp_request.add_header("Content-Type", "application/ocsp-request") - - with request.urlopen(ocsp_request) as ocsp_response_data: - ocsp_response = ocsp.load_der_ocsp_response(ocsp_response_data.read()) - event_log.debug(f"Successfully fetched the ocsp response from {url}") - return ocsp_response - - except Exception as e: - event_log.error(f"Error while fetching the ocsp response from {url}") - if isinstance(e, HTTPError): - event_log.error(f"HTTP Error code : {e.code}") - if max_retries > 0: - time.sleep(BaseSettings.OCSP_RETRY_DELAY) - return CcAdminUtils.fetch_ocsp_response_from_url( - ocsp_request_data, url, max_retries - 1 - ) - else: - return None - - @staticmethod - def verify_ocsp_signature(ocsp_response): - """A static method to perform the signature verification of the ocsp response message. - - Args: - ocsp_response (cryptography.hazmat.backends.openssl.ocsp._OCSPResponse): the input ocsp response message object. - - Returns: - [Bool]: returns True if the signature verification is successful, otherwise returns False. - """ - try: - signature = ocsp_response.signature - data = ocsp_response.tbs_response_bytes - leaf_certificate = ocsp_response.certificates[0] - leaf_certificate.public_key().verify(signature, data, ec.ECDSA(SHA384())) - return True - - except InvalidSignature: - return False - - except Exception as error: - err_msg = "Something went wrong during ocsp signature verification." - info_log.error(error) - info_log.info(err_msg) - return False - - @staticmethod - def fetch_rim_file_from_url(rim_id, url, max_retries): - """A static method to fetch the RIM file with the given file id from the given url. - If the fetch fails, it retries for the maximum number of times specified by the max_retries parameter. - If the max_retries is set to 0, it does not retry on failure and return None. - - Args: - rim_id (str): the RIM file id which need to be fetched from the given url. - url (str): the url from which the RIM file needs to be fetched. - max_retries (int, optional): the maximum number of retries to be performed in case of any error. - - Returns: - [str]: the content of the required RIM file as a string. - """ - # RIM service URL should start with https - if not url.lower().startswith("https"): - info_log.error(f"The RIM service url {url} does not start with https") - return None - - # Fetching the RIM file from the given url - try: - with request.urlopen(url + rim_id) as https_response: - data = https_response.read() - json_object = json.loads(data) - base64_data = json_object["rim"] - decoded_str = base64.b64decode(base64_data).decode("utf-8") - event_log.debug( - f"Successfully fetched the RIM file from {url + rim_id}" - ) - return decoded_str - except Exception as e: - event_log.error(f"Error while fetching the RIM file from {url + rim_id}") - if isinstance(e, HTTPError): - event_log.error(f"HTTP Error code : {e.code}") - if max_retries > 0: - time.sleep(BaseSettings.RIM_SERVICE_RETRY_DELAY) - return CcAdminUtils.fetch_rim_file_from_url( - rim_id, url, max_retries - 1 - ) - else: - return None - - @staticmethod - def fetch_rim_file(rim_id, max_retries=BaseSettings.RIM_SERVICE_RETRY_COUNT): - """A static method to fetch the RIM file with the given file id from the RIM service. - It tries to fetch the RIM file from provided RIM service, and fallback to the Nvidia RIM service if the fetch fails. - - Args: - rim_id (str): the RIM file id which need to be fetched from the RIM service. - - Raises: - RIMFetchError: it is raised in case the RIM fetch is failed. - - Returns: - [str]: the content of the required RIM file as a string. - """ - # Fetching the RIM file from the provided RIM service - try: - rim_result = function_wrapper_with_timeout( - [ - CcAdminUtils.fetch_rim_file_from_url, - rim_id, - BaseSettings.RIM_SERVICE_BASE_URL, - max_retries, - "fetch_rim_file_from_url", - ], - BaseSettings.MAX_RIM_REQUEST_TIME_DELAY * max_retries, - ) - except Exception as e: - event_log.error( - f"Exception occurred while fetching RIM {rim_id} from provided RIM service: {str(e)}" - ) - rim_result = None - - # RIM is successfully fetched from the provided RIM service - if rim_result is not None: - return rim_result - - # Log error if RIM file is not fetched from the provided RIM service - event_log.error( - f"Failed to fetch RIM {rim_id} from provided RIM service: {BaseSettings.RIM_SERVICE_BASE_URL}" - ) - - # Fallback to the Nvidia RIM service if the fetch fails - if ( - BaseSettings.RIM_SERVICE_BASE_URL_NVIDIA - != BaseSettings.RIM_SERVICE_BASE_URL - ): - event_log.info( - f"Falling back to Nvidia RIM service {BaseSettings.RIM_SERVICE_BASE_URL_NVIDIA}" - ) - try: - rim_result = function_wrapper_with_timeout( - [ - CcAdminUtils.fetch_rim_file_from_url, - rim_id, - BaseSettings.RIM_SERVICE_BASE_URL_NVIDIA, - max_retries, - "fetch_rim_file_from_url", - ], - BaseSettings.MAX_RIM_REQUEST_TIME_DELAY * max_retries, - ) - except Exception as e: - event_log.error( - f"Exception occurred while fetching RIM {rim_id} from Nvidia RIM service: {str(e)}" - ) - rim_result = None - - # RIM is successfully fetched from the Nvidia RIM service - if rim_result is not None: - return rim_result - - # Log error if RIM file is not fetched from the Nvidia RIM service - event_log.error( - f"Failed to fetch RIM {rim_id} from Nvidia RIM service: {BaseSettings.RIM_SERVICE_BASE_URL_NVIDIA}" - ) - - # Raise error if RIM file is not fetched from both the RIM services - raise RIMFetchError( - f"Could not fetch the required RIM file : {rim_id} from the RIM service." - ) - - @staticmethod - def get_vbios_rim_file_id(project, project_sku, chip_sku, vbios_version): - """A static method to generate the required VBIOS RIM file id which needs to be fetched from the RIM service - according to the vbios flashed onto the system. - - Args: - attestation_report (AttestationReport): the object representing the attestation report. - - Returns: - [str]: the VBIOS RIM file id. - """ - base_str = "NV_GPU_VBIOS_" - - return ( - base_str - + project - + "_" - + project_sku - + "_" - + chip_sku - + "_" - + vbios_version - ) - - @staticmethod - def get_driver_rim_file_id(driver_version): - """A static method to generate the driver RIM file id to be fetched from the RIM service corresponding to - the driver installed onto the system. - - Args: - driver_version (str): the driver version of the installed driver. - - Returns: - [str]: the driver RIM file id. - """ - base_str = "NV_GPU_DRIVER_GH100_" - return base_str + driver_version - - @staticmethod - def get_vbios_rim_path(settings, attestation_report): - """A static method to determine the path of the appropriate VBIOS RIM file. - - Args: - settings (config.HopperSettings): the object containing the various config info. - attestation_report (AttestationReport): the object representing the attestation report - - Raises: - RIMFetchError: it is raised in case the required VBIOS RIM file is not found. - - Returns: - [str] : the path to the VBIOS RIM file. - """ - project = ( - attestation_report.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_PROJECT") - ) - project_sku = ( - attestation_report.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_PROJECT_SKU") - ) - chip_sku = ( - attestation_report.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_CHIP_SKU") - ) - vbios_version = format_vbios_version( - attestation_report.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_VBIOS_VERSION") - ) - vbios_version = vbios_version.replace(".", "").upper() - - project = project.decode("ascii").strip().strip("\x00") - project = project.lower() - project_sku = project_sku.decode("ascii").strip().strip("\x00") - project_sku = project_sku.lower() - chip_sku = chip_sku.decode("ascii").strip().strip("\x00") - chip_sku = chip_sku.lower() - - rim_file_name = ( - project - + "_" - + project_sku - + "_" - + chip_sku - + "_" - + vbios_version - + "_" - + settings.get_sku() - + ".swidtag" - ) - list_of_files = os.listdir(settings.RIM_DIRECTORY_PATH) - rim_path = os.path.join(settings.RIM_DIRECTORY_PATH, rim_file_name) - - if rim_file_name in list_of_files: - return rim_path - - raise RIMFetchError(f"Could not find the required VBIOS RIM file : {rim_path}") - - @staticmethod - def verify_attestation_report( - attestation_report_obj, - gpu_leaf_certificate, - nonce, - driver_version, - vbios_version, - settings, - ): - """Performs the verification of the attestation report. This contains matching the nonce in the attestation report with - the one generated by the cc admin, matching the driver version and vbios version in the attestation report with the one - fetched from the driver. And then performing the signature verification of the attestation report. - - Args: - attestation_report_obj (SpdmMeasurementResponseMessage): the object representing the attestation report. - gpu_leaf_certificate (OpenSSL.crypto.X509): the gpu leaf attestation certificate. - nonce (bytes): the nonce generated by the cc_admin. - driver_version (str): the driver version fetched from the GPU. - vbios_version (str): the vbios version fetched from the GPU. - settings (config.HopperSettings): the object containing the various config info. - - Raises: - NonceMismatchError: it is raised in case the nonce generated by cc admin does not match with the one in the attestation report. - DriverVersionMismatchError: it is raised in case of the driver version does not matches with the one in the attestation report. - VBIOSVersionMismatchError: it is raised in case of the vbios version does not matches with the one in the attestation report. - SignatureVerificationError: it is raised in case the signature verification of the attestation report fails. - - Returns: - [bool]: return True if the signature verification is successful. - """ - assert isinstance(attestation_report_obj, AttestationReport) - assert isinstance(gpu_leaf_certificate, crypto.X509) - assert ( - isinstance(nonce, bytes) and len(nonce) == settings.SIZE_OF_NONCE_IN_BYTES - ) - - # Here the attestation report is the concatenated SPDM GET_MEASUREMENTS request with the SPDM GET_MEASUREMENT response message. - request_nonce = attestation_report_obj.get_request_message().get_nonce() - - if ( - len(nonce) > settings.SIZE_OF_NONCE_IN_BYTES - or len(request_nonce) > settings.SIZE_OF_NONCE_IN_BYTES - ): - err_msg = "\t\t Length of Nonce is greater than max nonce size allowed." - event_log.error(err_msg) - raise InvalidNonceError(err_msg) - - # compare the generated nonce with the nonce of SPDM GET MEASUREMENT request message in the attestation report. - if request_nonce != nonce: - err_msg = "\t\tThe nonce in the SPDM GET MEASUREMENT request message is not matching with the generated nonce." - event_log.error(err_msg) - raise NonceMismatchError(err_msg) - else: - info_log.info( - "\t\tThe nonce in the SPDM GET MEASUREMENT request message is matching with the generated nonce." - ) - settings.mark_nonce_as_matching() - - # Checking driver version. - driver_version_from_attestation_report = ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_DRIVER_VERSION") - ) - driver_version_from_attestation_report = ( - driver_version_from_attestation_report.decode() - ) - - if driver_version_from_attestation_report[-1] == "\0": - driver_version_from_attestation_report = ( - driver_version_from_attestation_report[:-1] - ) - - info_log.info( - f"\t\tDriver version fetched from the attestation report : {driver_version_from_attestation_report}" - ) - - if driver_version_from_attestation_report != driver_version: - err_msg = "\t\tThe driver version in attestation report is not matching with the driver version fetched from the driver." - event_log.error(err_msg) - raise DriverVersionMismatchError(err_msg) - - event_log.debug("Driver version in attestation report is matching.") - settings.mark_attestation_report_driver_version_as_matching() - - # Checking vbios version. - vbios_version_from_attestation_report = ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_VBIOS_VERSION") - ) - vbios_version_from_attestation_report = format_vbios_version( - vbios_version_from_attestation_report - ) - info_log.info( - f"\t\tVBIOS version fetched from the attestation report : {vbios_version_from_attestation_report}" - ) - - if vbios_version_from_attestation_report != vbios_version: - err_msg = "\t\tThe vbios version in attestation report is not matching with the vbios verison fetched from the driver." - event_log.error(err_msg) - raise VBIOSVersionMismatchError(err_msg) - - event_log.debug("VBIOS version in attestation report is matching.") - settings.mark_attestation_report_vbios_version_as_matching() - - # Performing the signature verification. - attestation_report_verification_status = ( - attestation_report_obj.verify_signature( - gpu_leaf_certificate.to_cryptography(), - settings.signature_length, - settings.HashFunction, - ) - ) - if attestation_report_verification_status: - info_log.info("\t\tAttestation report signature verification successful.") - settings.mark_attestation_report_signature_verified() - - else: - err_msg = "\t\tAttestation report signature verification failed." - event_log.error(err_msg) - raise SignatureVerificationError(err_msg) - - return attestation_report_verification_status - - @staticmethod - def generate_nonce(size): - """Generates cryptographically strong nonce to be sent to the SPDM requester via the nvml api for the attestation report. - - Args: - size (int): the number of random bytes to be generated. - - Returns: - [bytes]: the bytes of length "size" generated randomly. - """ - random_bytes = secrets.token_bytes(size) - return random_bytes - - @staticmethod - def validate_and_extract_nonce(nonce_hex_string): - """Validate and convert Nonce to bytes format - - Args: - nonce_hex_string (string): 32 Bytes Nonce represented as Hex String - - Returns: - [bytes]: Nonce represented as Bytes - """ - if len(nonce_hex_string) == BaseSettings.SIZE_OF_NONCE_IN_HEX_STR and set( - nonce_hex_string - ).issubset(string.hexdigits): - return bytes.fromhex(nonce_hex_string) - else: - raise InvalidNonceError( - "Invalid Nonce Size. The nonce should be 32 bytes in length represented as Hex String" - ) - - def __init__(self, number_of_gpus): - """It is the constructor for the CcAdminUtils. - - Args: - number_of_gpus (int): The number of the available GPUs. - """ - self.number_of_gpus = number_of_gpus diff --git a/packages/verifier/src/verifier/certs/verifier_RIM_root.pem b/packages/verifier/src/verifier/certs/verifier_RIM_root.pem deleted file mode 100644 index 277a6dc3..00000000 --- a/packages/verifier/src/verifier/certs/verifier_RIM_root.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= ------END CERTIFICATE----- \ No newline at end of file diff --git a/packages/verifier/src/verifier/certs/verifier_device_root.pem b/packages/verifier/src/verifier/certs/verifier_device_root.pem deleted file mode 100644 index 00db2d93..00000000 --- a/packages/verifier/src/verifier/certs/verifier_device_root.pem +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICCzCCAZCgAwIBAgIQLTZwscoQBBHB/sDoKgZbVDAKBggqhkjOPQQDAzA1MSIw -IAYDVQQDDBlOVklESUEgRGV2aWNlIElkZW50aXR5IENBMQ8wDQYDVQQKDAZOVklE -SUEwIBcNMjExMTA1MDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMDUxIjAgBgNVBAMM -GU5WSURJQSBEZXZpY2UgSWRlbnRpdHkgQ0ExDzANBgNVBAoMBk5WSURJQTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABA5MFKM7+KViZljbQSlgfky/RRnEQScW9NDZF8SX -gAW96r6u/Ve8ZggtcYpPi2BS4VFu6KfEIrhN6FcHG7WP05W+oM+hxj7nyA1r1jkB -2Ry70YfThX3Ba1zOryOP+MJ9vaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwHQYDVR0OBBYEFFeF/4PyY8xlfWi3Olv0jUrL+0lfMB8GA1UdIwQY -MBaAFFeF/4PyY8xlfWi3Olv0jUrL+0lfMAoGCCqGSM49BAMDA2kAMGYCMQCPeFM3 -TASsKQVaT+8S0sO9u97PVGCpE9d/I42IT7k3UUOLSR/qvJynVOD1vQKVXf0CMQC+ -EY55WYoDBvs2wPAH1Gw4LbcwUN8QCff8bFmV4ZxjCRr4WXTLFHBKjbfneGSBWwA= ------END CERTIFICATE----- \ No newline at end of file diff --git a/packages/verifier/src/verifier/config.py b/packages/verifier/src/verifier/config.py deleted file mode 100644 index e0839cd2..00000000 --- a/packages/verifier/src/verifier/config.py +++ /dev/null @@ -1,560 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -from hashlib import sha384 -import os -from enum import Enum -import logging -import sys -import json -import requests -from verifier.__about__ import __author__, __copyright__, __version__ -import fcntl - -info_log = logging.getLogger("gpu-verifier-info") -info_log.setLevel(logging.INFO) -shandler = logging.StreamHandler(sys.stdout) -info_log.addHandler(shandler) - -parent_dir = os.path.dirname(os.path.abspath(__file__)) -logger_file_path = os.path.join(os.getcwd(), "verifier.log") - -# Ensure only one gunicorn worker executes this section of code -lock_file_path = os.path.join(os.getcwd(), "verifier.lock") -with open(lock_file_path, "w") as lock_file: - try: - fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) - if os.path.exists(logger_file_path): - os.remove(logger_file_path) - except BlockingIOError: - # Another worker has the lock, so skip this section - pass - -event_log = logging.getLogger("gpu-verifier-event") -event_log.setLevel(logging.DEBUG) -fhandler = logging.FileHandler(logger_file_path) -fhandler.setFormatter( - logging.Formatter("%(asctime)s:%(levelname)s: %(message)s", "%m-%d-%Y %H:%M:%S") -) -event_log.addHandler(fhandler) - -event_log.debug("----------STARTING----------") - - -class BaseSettings: - AZURE_VM_REGION = "" - AZURE_IMDS_URL = "http://169.254.169.254/metadata/instance?api-version=2021-02-01" - AZURE_THIM_ENDPOINT_DICT = { - "eastus2": "https://useast2.thim.azure.net", - "centraluseuap": "https://uscentraleuap.thim.azure.net", - "westeurope": "https://europewest.thim.azure.net", - "lab": "", - } - SIZE_OF_NONCE_IN_BYTES = 32 - SIZE_OF_NONCE_IN_HEX_STR = 64 - gpu_availability = False - attestation_report_availability = False - TEST_NO_GPU_NUMBER_OF_GPUS = 1 - NONCE = "4cff7f5380ead8fad8ec2c531c110aca4302a88f603792801a8ca29ee151af2e" - # The maximum number of times the CC ADMIN will retry the GPU attestation. - MAX_RETRY_COUNT = 3 - current_retry_count = 0 - # The Timeout duration in seconds. - MAX_NVML_TIME_DELAY = 5 - MAX_OCSP_REQUEST_TIME_DELAY = 10 - MAX_RIM_REQUEST_TIME_DELAY = 10 - OCSP_URL = "" - OCSP_URL_NVIDIA = os.getenv("NV_OCSP_URL", "https://ocsp.ndis.nvidia.com/") - OCSP_NONCE_ENABLED = False - OCSP_HASH_FUNCTION = sha384 - OCSP_RETRY_COUNT = 3 - OCSP_RETRY_DELAY = 0.1 - OCSP_VALIDITY_EXTENSION_HRS = 14 * 24 - OCSP_CERT_REVOCATION_DEVICE_EXTENSION_HRS = 14 * 24 - OCSP_CERT_REVOCATION_DRIVER_RIM_EXTENSION_HRS = 14 * 24 - OCSP_CERT_REVOCATION_VBIOS_RIM_EXTENSION_HRS = 90 * 24 - RIM_SERVICE_BASE_URL = "" - RIM_SERVICE_BASE_URL_NVIDIA = os.getenv( - "NV_RIM_URL", "https://rim.attestation.nvidia.com/v1/rim/" - ) - RIM_SERVICE_RETRY_COUNT = 3 - RIM_SERVICE_RETRY_DELAY = 0.1 - Certificate_Chain_Verification_Mode = Enum( - "CERT CHAIN VERIFICATION MODE", - ["GPU_ATTESTATION", "OCSP_RESPONSE", "DRIVER_RIM_CERT", "VBIOS_RIM_CERT"], - ) - NVDEC_STATUS = Enum("NVDEC0 status", [("ENABLED", 0xAA), ("DISABLED", 0x55)]) - INDEX_OF_IK_CERT = 1 - SKU = "PROD" - claims = {} - allow_hold_cert = False - ROOT_CERT_DIR = os.path.join(parent_dir, "certs") - RIM_ROOT_CERT = os.path.join(ROOT_CERT_DIR, "verifier_RIM_root.pem") - DEVICE_ROOT_CERT = os.path.join(ROOT_CERT_DIR, "verifier_device_root.pem") - - EXECUTION_SEQUENCE_INDEX = { - "GPU_AVAILABILITY": 0, - "ATTESTATION_REPORT_AVAILABILITY": 1, - "GPU_INFO_FETCH": 2, - "CORRECT_GPU_ARCH": 3, - "ROOT_CERT_AVAILABILITY": 4, - "GPU_CERT_CHAIN_VERIFIED": 5, - "GPU_CERT_OCSP_CERT_CHAIN_VERIFICATION": 6, - "GPU_CERT_OCSP_SIGNATURE_VERIFICATION": 7, - "GPU_CERT_OCSP_NONCE_MATCH": 8, - "GPU_CERT_CHECK_COMPLETE": 9, - "ATTESTATION_REPORT_MSR_AVAILABILITY": 10, - "ATTESTATION_REPORT_PARSED": 11, - "NONCE_MATCH": 12, - "ATTESTATION_REPORT_DRV_VERSION_MATCH": 13, - "ATTESTATION_REPORT_VBIOS_VERSION_MATCH": 14, - "ATTESTATION_REPORT_VERIFICATION": 15, - "DRIVER_RIM_FETCH": 16, - "DRIVER_RIM_MEASUREMENT_AVAILABILITY": 17, - "DRIVER_RIM_SCHEMA_VALIDATION": 18, - "DRIVER_RIM_VERSION_MATCH": 19, - "DRIVER_RIM_CERT_EXTRACT": 20, - "DRIVER_RIM_SIGNATURE_VERIFICATION": 21, - "VBIOS_RIM_FETCH": 22, - "VBIOS_RIM_MEASUREMENT_AVAILABILITY": 23, - "VBIOS_RIM_SCHEMA_VALIDATION": 24, - "VBIOS_RIM_VERSION_MATCH": 25, - "VBIOS_RIM_CERT_EXTRACT": 26, - "VBIOS_RIM_SIGNATURE_VERIFICATION": 27, - "DRV_VBIOS_MSR_INDEX_CONFLICT": 28, - "MEASUREMENT_MATCH": 29, - } - - @classmethod - def set_rim_service_base_url(cls, url): - if not isinstance(url, str): - raise ValueError("Incorrect data type for the URL.") - cls.RIM_SERVICE_BASE_URL = url - - @classmethod - def set_ocsp_service_url(cls, url): - if not isinstance(url, str): - raise ValueError("Incorrect data type for the URL.") - cls.OCSP_URL = url - - @classmethod - def get_sku(cls): - return cls.SKU - - @classmethod - def set_sku(cls, sku): - cls.SKU = sku - - @classmethod - def is_retry_allowed(cls): - if cls.current_retry_count < cls.MAX_RETRY_COUNT: - cls.current_retry_count += 1 - return True - else: - return False - - @classmethod - def reset(cls): - cls.NONCE = bytes.fromhex( - "4cff7f5380ead8fad8ec2c531c110aca4302a88f603792801a8ca29ee151af2e" - ) - cls.current_retry_count = 0 - cls.claims = {} - - @classmethod - def set_nonce(cls, nonce): - cls.NONCE = nonce - - @classmethod - def get_vm_region(cls): - if not cls.AZURE_VM_REGION: - # Fetch the VM region from IMDS - try: - headers = {"Metadata": "true"} - response = requests.get(cls.AZURE_IMDS_URL, headers=headers) - if response.status_code == 200: - data = json.loads(response.text) - cls.AZURE_VM_REGION = data.get("compute", {}).get("location", "") - event_log.debug("VM region is " + cls.AZURE_VM_REGION) - except Exception as e: - event_log.error("IMDS exception: " + str(e)) - - # If the VM region is still not fetched, set it to lab - if not cls.AZURE_VM_REGION: - event_log.error("Unable to fetch the VM region") - cls.AZURE_VM_REGION = "lab" - - @classmethod - def set_thim_rim_service_base_url(cls): - thim_endpoint = cls.AZURE_THIM_ENDPOINT_DICT.get(cls.AZURE_VM_REGION, "") - if thim_endpoint: - cls.RIM_SERVICE_BASE_URL = f"{thim_endpoint}/nvidia/v1/rim/" - else: - cls.RIM_SERVICE_BASE_URL = cls.RIM_SERVICE_BASE_URL_NVIDIA - - @classmethod - def set_thim_ocsp_service_url(cls): - thim_endpoint = cls.AZURE_THIM_ENDPOINT_DICT.get(cls.AZURE_VM_REGION, "") - if thim_endpoint: - cls.OCSP_URL = f"{thim_endpoint}/nvidia/ocsp/" - cls.OCSP_NONCE_ENABLED = False - else: - cls.OCSP_URL = cls.OCSP_URL_NVIDIA - cls.OCSP_NONCE_ENABLED = True - - def __init__(self): - self.measurement_comparison = False - self.gpu_arch_is_correct = False - self.attestation_report_measurements_availability = False - self.gpu_info_fetch = False - self.gpu_cert_chain_verification = False - self.root_cert_availability = False - self.attestation_report_verification = False - self.parse_attestation_report = False - self.nonce_comparison = False - self.attestation_report_driver_version_match = False - self.attestation_report_vbios_version_match = False - self.rim_driver_version_match = False - self.rim_vbios_version_match = False - self.rim_driver_measurements_availability = False - self.rim_vbios_measurements_availability = False - self.driver_rim_schema_validation = False - self.vbios_rim_schema_validation = False - self.driver_rim_signature_verification = False - self.vbios_rim_signature_verification = False - self.driver_rim_certificate_extraction = False - self.vbios_rim_certificate_extraction = False - self.fetch_driver_rim = False - self.fetch_vbios_rim = False - self.no_driver_vbios_measurement_index_conflict = False - self.gpu_certificate_ocsp_nonce_match = False - self.gpu_certificate_ocsp_signature_verification = False - self.gpu_certificate_ocsp_cert_chain_verification = False - self.gpu_cert_check_complete = False - self.gpu_attestation_report_cert_chain_validated = False - self.driver_rim_certificate_validated = False - self.vbios_rim_certificate_validated = False - self.attestation_report_signature_verification = False - self.gpu_driver_version = "" - self.gpu_vbios_version = "" - - @classmethod - def mark_attestation_report_as_available(cls): - event_log.debug("mark_attestation_report_as_available called.") - cls.attestation_report_availability = True - - def check_if_gpu_attestation_report_cert_chain_validated(self): - event_log.debug( - f"check_if_gpu_attestation_report_cert_chain_validated: {self.gpu_attestation_report_cert_chain_validated}" - ) - return self.gpu_attestation_report_cert_chain_validated - - def mark_gpu_attestation_report_cert_chain_validated(self): - event_log.debug("mark_gpu_attestation_report_cert_chain_validated called") - self.gpu_attestation_report_cert_chain_validated = True - - def check_if_attestation_report_signature_verified(self): - event_log.debug( - f"check_if_attestation_report_signature_verified: {self.attestation_report_signature_verification}" - ) - return self.attestation_report_signature_verification - - def mark_attestation_report_signature_verified(self): - event_log.debug("mark_attestation_report_signature_verified called") - self.attestation_report_signature_verification = True - - def check_if_driver_rim_fetched(self): - event_log.debug(f"check_if_driver_rim_fetched: {self.fetch_driver_rim}") - return self.fetch_driver_rim - - def mark_driver_rim_fetched(self): - event_log.debug("mark_driver_rim_fetched called") - self.fetch_driver_rim = True - - def check_if_vbios_rim_fetched(self): - event_log.debug(f"check_if_vbios_rim_fetched: {self.fetch_vbios_rim}") - return self.fetch_vbios_rim - - def mark_vbios_rim_fetched(self): - event_log.debug("mark_vbios_rim_fetched called.") - self.fetch_vbios_rim = True - - def check_if_driver_rim_signature_verified(self): - event_log.debug( - f"check_if_driver_rim_signature_verified: {self.driver_rim_signature_verification}" - ) - return self.driver_rim_signature_verification - - def mark_driver_rim_signature_verified(self): - event_log.debug("mark_driver_rim_signature_verified called.") - self.driver_rim_signature_verification = True - - def check_if_vbios_rim_signature_verified(self): - event_log.debug( - f"check_if_vbios_rim_signature_verified: {self.vbios_rim_signature_verification}" - ) - return self.vbios_rim_signature_verification - - def mark_vbios_rim_signature_verified(self): - event_log.debug("mark_vbios_rim_signature_verified called.") - self.vbios_rim_signature_verification = True - - def check_if_driver_rim_schema_validated(self): - event_log.debug( - f"check_if_driver_rim_schema_validated: {self.driver_rim_schema_validation}" - ) - return self.driver_rim_schema_validation - - def mark_driver_rim_schema_validated(self): - event_log.debug("mark_driver_rim_schema_validated called.") - self.driver_rim_schema_validation = True - - def check_gpu_driver_version(self): - event_log.debug(f"check_gpu_driver_version called.{self.gpu_driver_version}") - return self.gpu_driver_version - - def mark_gpu_driver_version(self, driver_version): - event_log.debug("mark_gpu_driver_version called.") - self.gpu_driver_version = driver_version - - def check_gpu_vbios_version(self): - event_log.debug(f"check_gpu_vbios_version called.{self.gpu_vbios_version}") - return self.gpu_vbios_version - - def mark_gpu_vbios_version(self, vbios_version): - event_log.debug("mark_gpu_vbios_version called.") - if vbios_version is not None: - self.gpu_vbios_version = vbios_version.upper() - - def check_if_vbios_rim_schema_validated(self): - event_log.debug( - f"check_if_vbios_rim_schema_validated: {self.vbios_rim_schema_validation}" - ) - return self.vbios_rim_schema_validation - - def mark_vbios_rim_schema_validated(self): - event_log.debug("mark_vbios_rim_schema_validated called.") - self.vbios_rim_schema_validation = True - - def check_rim_driver_measurements_availability(self): - event_log.debug( - f"check_rim_driver_measurements_availability: {self.rim_driver_measurements_availability}" - ) - return self.rim_driver_measurements_availability - - def mark_rim_driver_measurements_as_available(self): - event_log.debug("mark_rim_driver_measurements_as_available called.") - self.rim_driver_measurements_availability = True - - def check_rim_vbios_measurements_availability(self): - event_log.debug( - f"check_rim_vbios_measurements_availability: {self.rim_vbios_measurements_availability}" - ) - return self.rim_vbios_measurements_availability - - def mark_rim_vbios_measurements_as_available(self): - event_log.debug("mark_rim_vbios_measurements_as_available called.") - self.rim_vbios_measurements_availability = True - - def check_if_measurements_are_matching(self): - if self.measurement_comparison: - return "success" - else: - return "fail" - - def mark_measurements_as_matching(self): - event_log.debug("mark_measurements_as_matching called.") - self.measurement_comparison = True - - def check_if_rim_driver_version_matches(self): - event_log.debug( - f"check_if_rim_driver_version_matches: {self.rim_driver_version_match}" - ) - return self.rim_driver_version_match - - def mark_rim_driver_version_as_matching(self): - event_log.debug("mark_rim_driver_version_as_matching called.") - self.rim_driver_version_match = True - - def check_if_rim_vbios_version_matches(self): - event_log.debug( - f"check_if_rim_vbios_version_matches: {self.rim_vbios_version_match}" - ) - return self.rim_vbios_version_match - - def mark_rim_vbios_version_as_matching(self): - event_log.debug("mark_rim_vbios_version_as_matching called.") - self.rim_vbios_version_match = True - - def check_if_driver_rim_cert_validated(self): - event_log.debug( - f"check_if_driver_rim_cert_validated: {self.driver_rim_certificate_validated}" - ) - return self.driver_rim_certificate_validated - - def mark_driver_rim_cert_validated_successfully(self): - event_log.debug("mark_driver_rim_cert_validatedd_successfully called.") - self.driver_rim_certificate_validated = True - - def check_if_vbios_rim_cert_extracted(self): - event_log.debug( - f"check_if_vbios_rim_cert_extracted: {self.vbios_rim_certificate_extraction}" - ) - return self.vbios_rim_certificate_extraction - - def mark_vbios_rim_cert_extracted_successfully(self): - event_log.debug("mark_vbios_rim_cert_extracted_successfully called.") - self.vbios_rim_certificate_extraction = True - - def check_if_vbios_rim_cert_validated(self): - event_log.debug( - f"check_if_vbios_rim_cert_extracted: {self.vbios_rim_certificate_validated}" - ) - return self.vbios_rim_certificate_validated - - def mark_vbios_rim_cert_validated_successfully(self): - event_log.debug("mark_vbios_rim_cert_validated_successfully called.") - self.vbios_rim_certificate_validated = True - - def check_if_gpu_arch_is_correct(self): - event_log.debug(f"check_if_gpu_arch_is_correct: {self.gpu_arch_is_correct}") - return self.gpu_arch_is_correct - - def mark_gpu_arch_is_correct(self): - event_log.debug("mark_gpu_arch_is_correct called.") - self.gpu_arch_is_correct = True - - def check_if_nonce_are_matching(self): - event_log.debug(f"check_if_nonce_are_matching: {self.nonce_comparison}") - return self.nonce_comparison - - def mark_nonce_as_matching(self): - event_log.debug("mark_nonce_as_matching called.") - self.nonce_comparison = True - - def check_if_attestation_report_parsed_successfully(self): - event_log.debug( - f"check_if_attestation_report_parsed_successfully: {self.parse_attestation_report}" - ) - return self.parse_attestation_report - - def mark_attestation_report_parsed(self): - event_log.debug("mark_attestation_report_parsed called.") - self.parse_attestation_report = True - - def check_if_attestation_report_driver_version_matches(self): - event_log.debug( - f"check_if_attestation_report_vbios_version_matches: {self.attestation_report_vbios_version_match}" - ) - return self.attestation_report_driver_version_match - - def mark_attestation_report_driver_version_as_matching(self): - event_log.debug("mark_attestation_report_driver_version_as_matching called.") - self.attestation_report_driver_version_match = True - - def check_if_attestation_report_vbios_version_matches(self): - return self.attestation_report_vbios_version_match - - def mark_attestation_report_vbios_version_as_matching(self): - event_log.debug("mark_attestation_report_vbios_version_as_matching called.") - self.attestation_report_vbios_version_match = True - - def check_if_no_driver_vbios_measurement_index_conflict(self): - event_log.debug( - f"check_if_no_driver_vbios_measurement_index_conflict: {self.no_driver_vbios_measurement_index_conflict}" - ) - return self.no_driver_vbios_measurement_index_conflict - - def mark_no_driver_vbios_measurement_index_conflict(self): - event_log.debug("mark_no_driver_vbios_measurement_conflict called.") - self.no_driver_vbios_measurement_index_conflict = True - - def check_status(self): - if ( - self.check_if_gpu_arch_is_correct() - and self.check_if_gpu_attestation_report_cert_chain_validated() - and self.check_if_attestation_report_parsed_successfully() - and self.check_if_nonce_are_matching() - and self.check_if_attestation_report_driver_version_matches() - and self.check_if_attestation_report_vbios_version_matches() - and self.check_if_attestation_report_signature_verified() - and self.check_if_driver_rim_fetched() - and self.check_if_driver_rim_schema_validated() - and self.check_if_driver_rim_cert_validated() - and self.check_if_driver_rim_signature_verified() - and self.check_rim_driver_measurements_availability() - and self.check_if_vbios_rim_fetched() - and self.check_if_vbios_rim_schema_validated() - and self.check_if_vbios_rim_signature_verified() - and self.check_rim_vbios_measurements_availability() - and self.check_if_no_driver_vbios_measurement_index_conflict() - and self.check_if_measurements_are_matching() == "success" - ): - BaseSettings.test_result = True - return True - else: - BaseSettings.test_result = False - return False - - -class HopperSettings(BaseSettings): - signature_length = 96 - HashFunction = sha384 - MAX_CERT_CHAIN_LENGTH = 5 - HashFunctionNamespace = "{http://www.w3.org/2001/04/xmlenc#sha384}" - GpuArch = "HOPPER" - RIM_DIRECTORY_PATH = os.path.join(parent_dir, "samples") - TEST_NO_GPU_DRIVER_RIM_PATH = os.path.join( - RIM_DIRECTORY_PATH, "Driver_RIM_test_no_gpu.swidtag" - ) - DRIVER_RIM_PATH = "" - TEST_NO_GPU_VBIOS_RIM_PATH = os.path.join( - RIM_DIRECTORY_PATH, "1010_0200_882_96005E0001_test_no_gpu.swidtag" - ) - VBIOS_RIM_PATH = "" - ATTESTATION_REPORT_PATH = os.path.join(RIM_DIRECTORY_PATH, "attestationReport.txt") - GPU_ATTESTATION_CERTIFICATES_PATH = os.path.join( - RIM_DIRECTORY_PATH, "gpuAkCertChain.txt" - ) - - @classmethod - def set_driver_rim_path(cls, path): - cls.DRIVER_RIM_PATH = path - - @classmethod - def set_vbios_rim_path(cls, path): - cls.VBIOS_RIM_PATH = path - - @classmethod - def set_attestation_report_path(cls, path): - cls.ATTESTATION_REPORT_PATH = path - - @classmethod - def set_gpu_attestation_certificates_path(cls, path): - cls.GPU_ATTESTATION_CERTIFICATES_PATH = path diff --git a/packages/verifier/src/verifier/exceptions/__init__.py b/packages/verifier/src/verifier/exceptions/__init__.py deleted file mode 100644 index f18db59d..00000000 --- a/packages/verifier/src/verifier/exceptions/__init__.py +++ /dev/null @@ -1,309 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - - -class Error(Exception): - """Base class for other exceptions.""" - - pass - - -class IncorrectProjectError(Error): - """It is raised in case of wrong project name is provided as command line - argument. - """ - - pass - - -class AttestationReportError(Error): - """Base class for all exceptions related to attestation report.""" - - pass - - -class SignatureVerificationError(AttestationReportError): - """It is raised when the signature verification of attestation report fails.""" - - pass - - -class NoMeasurementsError(AttestationReportError): - """It is raised in case there are no or blank measurement block.""" - - pass - - -class ParsingError(AttestationReportError): - """It is raised in case of any issues during parsing of the attestation - report data. - """ - - pass - - -class NoMeasurementBlockError(AttestationReportError): - """It is raised when there are zero number of measurement blocks.""" - - pass - - -class MeasurementSpecificationError(AttestationReportError): - """It is raised if any measurement block does not follow DMTF - specification. - """ - - pass - - -class NoCertificateError(AttestationReportError): - """It is raised in case there are no certificates in the GPU attestation - certificate chain. - """ - - pass - - -class IncorrectNumberOfCertificatesError(AttestationReportError): - """It is raised in case there are unexpected number of certificates in the - GPU attestation certificate chain. - """ - - pass - - -class CertChainVerificationFailureError(AttestationReportError): - """It is raised in case of the GPU attestation certificate chain - verification failure. - """ - - pass - - -class AttestationReportVerificationError(AttestationReportError): - """It is raised in case of attestation report signature verification - failure. - """ - - pass - - -class NonceMismatchError(AttestationReportError): - """It is raised in case the nonce in the SPDM GET MEASUREMENT request - message is not matching with the generated nonce. - """ - - pass - - -class DriverVersionMismatchError(AttestationReportError): - """It is raised in case the driver version in attestation report is not - matching with the driver verison fetched from the driver. - """ - - pass - - -class VBIOSVersionMismatchError(AttestationReportError): - """It is raised in case the vbios version in attestation report is not - matching with the vbios verison fetched from the driver. - """ - - pass - - -class PynvmlError(Error): - """It is the base class for all exceptions related to pynvml.""" - - pass - - -class AttestationReportFetchError(PynvmlError): - """It is raised in case there is a failure in fetching the Attestation - report. - """ - - pass - - -class CertChainFetchError(PynvmlError): - """It is raised in case there is a failure in fetching the GPU attestation - certificate chain. - """ - - pass - - -class CertExtractionError(PynvmlError): - """It is raised in case there is any issue in extracting the individual - certificates from the certificate chain. - """ - - pass - - -class UnknownGpuArchitectureError(PynvmlError): - """It is raised if the GPU architecture is not correct.""" - - pass - - -class UnsupportedGpuArchitectureError(PynvmlError): - """It is raised if the GPU architecture is not supported.""" - - pass - - -class NoGpuFoundError(PynvmlError): - """It is raised in case the number of available GPU is zero.""" - - pass - - -class TimeoutError(PynvmlError): - """It is raised in case the pynvml api call exceeds the threshold limit.""" - - pass - - -class RIMError(Error): - """It is a base class for exceptions related to the RIM.""" - - pass - - -class RIMFetchError(RIMError): - """It is raised in case the required RIM file could not be fetched.""" - - pass - - -class ElementNotFoundError(RIMError): - """It is raised in case the reqired element is not found in the RIM file.""" - - pass - - -class EmptyElementError(RIMError): - """It is raised in case the content of an element in the RIM file is empty.""" - - pass - - -class RIMSignatureVerificationError(RIMError): - """It is raised in case the signature verification of RIM file fails.""" - - pass - - -class InvalidCertificateError(RIMError): - """It is raised in case there is a problem in extracting the X509 - certificate from the RIM file. - """ - - pass - - -class RIMCertChainVerificationError(RIMError): - """It is raised in case of the RIM certificate chain verification fails.""" - - pass - - -class RIMCertChainOCSPVerificationError(RIMError): - """It is raised in case the RIM certificate chain OCSP status verification fails.""" - - pass - - -class NoRIMMeasurementsError(RIMError): - """It is raised in case there are no measurement values in the RIM file.""" - - pass - - -class FileNotFoundError(RIMError): - """It is raised in case the required file is not found.""" - - pass - - -class RIMVerificationFailureError(RIMError): - """It is raised in case the verification of RIM fails.""" - - pass - - -class RIMSchemaValidationError(RIMError): - """It is raised in case the RIM schema validation fails.""" - - pass - - -class InvalidRIMNameError(RIMError): - """It is raised in case the name assigned to the RIM class is something - other than "driver" or "vbios". - """ - - pass - - -class VerifierError(Error): - """It is the base class for the exceptions related to the verifier.""" - - pass - - -class MeasurementMismatchError(VerifierError): - """It is raised in case any runtime measurement does not matches with the - golden value. - """ - - pass - - -class InvalidMeasurementIndexError(VerifierError): - """It is raised in case the same measurement value index is active in both - driver and vbios RIM file. - """ - - pass - - -class InvalidNonceError(Error): - """It is raised if user specified Nonce is not 32 bytes in length.""" - - pass - - -class OCSPFetchError(VerifierError): - """It is raised in case of any issues in fetching the OCSP response.""" - - pass diff --git a/packages/verifier/src/verifier/exceptions/utils.py b/packages/verifier/src/verifier/exceptions/utils.py deleted file mode 100644 index 03adead8..00000000 --- a/packages/verifier/src/verifier/exceptions/utils.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from pynvml import ( - NVML_ERROR_UNINITIALIZED, - NVML_ERROR_TIMEOUT, - NVML_ERROR_RESET_REQUIRED, - NVML_ERROR_IN_USE, - NVML_ERROR_MEMORY, - NVML_ERROR_NO_DATA, - NVML_ERROR_INSUFFICIENT_RESOURCES, - NVMLError, -) - -from verifier.exceptions import ( - NonceMismatchError, - TimeoutError, -) - - -def is_non_fatal_issue(error): - """The function to check if the given error is non fatal or not. - - Args: - error (Exception): any exception that may be raised. - - Returns: - [bool]: returns True if the error is non fatal. Otherwise returns - False. - """ - - if ( - isinstance(error, type(NVMLError(NVML_ERROR_UNINITIALIZED))) - or isinstance(error, type(NVMLError(NVML_ERROR_TIMEOUT))) - or isinstance(error, type(NVMLError(NVML_ERROR_RESET_REQUIRED))) - or isinstance(error, type(NVMLError(NVML_ERROR_IN_USE))) - or isinstance(error, type(NVMLError(NVML_ERROR_MEMORY))) - or isinstance(error, type(NVMLError(NVML_ERROR_NO_DATA))) - or isinstance(error, type(NVMLError(NVML_ERROR_INSUFFICIENT_RESOURCES))) - or isinstance(error, NonceMismatchError) - or isinstance(error, TimeoutError) - ): - return True - - return False diff --git a/packages/verifier/src/verifier/nvml/__init__.py b/packages/verifier/src/verifier/nvml/__init__.py deleted file mode 100644 index ac44d68f..00000000 --- a/packages/verifier/src/verifier/nvml/__init__.py +++ /dev/null @@ -1,412 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -"""A module to handle all the nvml api calls for the verifier.""" - -import ctypes - -from pynvml import ( - nvmlInit, - nvmlDeviceGetArchitecture, - nvmlDeviceGetBoardId, - nvmlDeviceGetCount, - nvmlDeviceGetHandleByIndex, - nvmlDeviceGetUUID, - nvmlDeviceGetVbiosVersion, - nvmlShutdown, - nvmlSystemGetDriverVersion, - nvmlDeviceGetConfComputeGpuAttestationReport, - nvmlSystemSetConfComputeGpusReadyState, - nvmlSystemGetConfComputeGpusReadyState, - nvmlSystemGetConfComputeState, - nvmlSystemGetConfComputeSettings, - NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE, - NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE, -) - -from verifier.utils import ( - get_gpu_architecture_value, - function_wrapper_with_timeout, -) -from verifier.config import ( - BaseSettings, - info_log, - event_log, - __author__, - __copyright__, - __version__, -) -from verifier.nvml.gpu_cert_chains import GpuCertificateChains -from verifier.nvml.nvmlHandlerTest import NvmlHandlerTest -from verifier.exceptions import ( - AttestationReportFetchError, - TimeoutError, -) - -NVML_SYSTEM_CONF_COMPUTE_VERSION = 0x1000014 - - -class NvmlHandler: - """Class to handle all the pynvml api calls and fetching the GPU information.""" - - Handles = None - - @classmethod - def get_number_of_gpus(cls): - """A class method to get the number of available gpus and create a - list of GPU device handles for the available GPUs. - - Returns: - [int]: number of available GPUs. - """ - number_of_gpus = function_wrapper_with_timeout( - [nvmlDeviceGetCount, "nvmlDeviceGetCount"], BaseSettings.MAX_NVML_TIME_DELAY - ) - cls.Handles = list() - - for i in range(number_of_gpus): - cls.Handles.append( - function_wrapper_with_timeout( - [nvmlDeviceGetHandleByIndex, i, "nvmlDeviceGetHandleByIndex"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - ) - return number_of_gpus - - @staticmethod - def close_nvml(): - """Static method to close the pynvml library.""" - function_wrapper_with_timeout( - [nvmlShutdown, "nvmlShutdown"], BaseSettings.MAX_NVML_TIME_DELAY - ) - - @staticmethod - def init_nvml(): - """Static method to initialize the pynvml library.""" - function_wrapper_with_timeout( - [nvmlInit, "nvmlInit"], BaseSettings.MAX_NVML_TIME_DELAY - ) - - @staticmethod - def set_gpu_ready_state(state): - """Static method to set GPU state as ready if the input is True otherwise set as not ready to accept workload.""" - assert type(state) is bool - - if state: - ready_state = NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE - else: - ready_state = NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE - - function_wrapper_with_timeout( - [ - nvmlSystemSetConfComputeGpusReadyState, - ready_state, - "nvmlSystemSetConfComputeGpusReadyState", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - @staticmethod - def is_cc_enabled(): - """Static method to check if the confidential compute feature is enabled or not. - - Returns: - [bool]: returns True if the cc feature is enabled in driver, otherwise - returns False. - """ - state = function_wrapper_with_timeout( - [nvmlSystemGetConfComputeState, "nvmlSystemGetConfComputeState"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - return state.ccFeature != 0 - - @staticmethod - def is_ppcie_mode_enabled(): - """Static method to check if the ppcie mode is enabled or not. - - Returns: - [bool]: returns True if the ppcie mode is enabled in driver, otherwise - returns False. - """ - settings = NvmlSystemConfComputeSettings() - state = function_wrapper_with_timeout( - [ - nvmlSystemGetConfComputeSettings, - ctypes.byref(settings), - "nvmlSystemGetConfComputeSettings", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - return settings.multiGpuMode != 0 - - @staticmethod - def is_cc_dev_mode(): - """Static method to check if the driver is in "CC DEV" mode or not. - - Returns: - [bool]: returns True if the driver is in CC DEV mode, otherwise - returns False. - """ - state = function_wrapper_with_timeout( - [nvmlSystemGetConfComputeState, "nvmlSystemGetConfComputeState"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - return state.devToolsMode != 0 - - @staticmethod - def get_gpu_ready_state(): - """Static method to check the GPU state. - - Returns: - [int]: returns 0 for not ready 1 for ready state. - """ - state = function_wrapper_with_timeout( - [ - nvmlSystemGetConfComputeGpusReadyState, - "nvmlSystemGetConfComputeGpusReadyState", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - return state - - def fetch_attestation_report(self, index, nonce): - """Fetches the attestation report of the GPU. - - Args: - index (int): index of the GPU. - nonce (bytes): then nonce. - - Raises: - AttestationReportFetchError: it is raised if the attestation report - could not be fetched. - - Returns: - [bytes]: the raw attestation report data. - """ - - try: - attestation_report_struct = function_wrapper_with_timeout( - [ - nvmlDeviceGetConfComputeGpuAttestationReport, - self.Handles[index], - nonce, - "nvmlDeviceGetConfComputeGpuAttestationReport", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - length_of_attestation_report = ( - attestation_report_struct.attestationReportSize - ) - attestation_report = attestation_report_struct.attestationReport - attestation_report_data = list() - - for i in range(length_of_attestation_report): - attestation_report_data.append(attestation_report[i]) - - bin_attestation_report_data = bytes(attestation_report_data) - - BaseSettings.mark_attestation_report_as_available() - return bin_attestation_report_data - - except TimeoutError as err: - raise TimeoutError("\tThe call to fetch attestation report timed out.") - except Exception as err: - info_log.error(err) - err_msg = "\tSomething went wrong while fetching the attestation report from the gpu." - event_log.error(err_msg) - raise AttestationReportFetchError(err_msg) - - def get_driver_version(self): - """Fetches the DriverVersion field of the NvmlHandler class object. - - Returns: - [str]: the driver version. - """ - return self.DriverVersion - - def get_uuid(self): - """Fetches the UUID field of the NvmlHandler class object. - - Returns: - [str]: the UUID - """ - return self.UUID - - def get_vbios_version(self): - """Fetches the VbiosVersion field of the NvmlHandler class object. - - Returns: - [str]: the vbios version - """ - return self.VbiosVersion - - def get_attestation_cert_chain(self): - """Fetches the GPU attestation certificate chain from the - GpuCertificateChains class object. - - Returns: - [list]: the list of x509 certificates of the certificate chain. - """ - return self.CertificateChains.GpuAttestationCertificateChain - - def get_attestation_report(self): - """Fetches the attestation report data of the NvmlHandler class object. - - Returns: - [bytes]: the attestation report data. - """ - return self.AttestationReport - - def get_gpu_architecture(self): - """Fetches the name of the current GPU. - architecture. - - Returns: - [str]: the GPU architecture. - """ - return get_gpu_architecture_value(self.GPUArchitecture) - - def init_handle(self): - """Fetches the GPU handle for the current GPU index value.""" - self.Handles[self.Index] = function_wrapper_with_timeout( - [nvmlDeviceGetHandleByIndex, self.Index, "nvmlDeviceGetHandleByIndex"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def init_driver_version(self): - """Fetches and assigns the Driver Version from the driver via pynvml - api. - """ - self.DriverVersion = function_wrapper_with_timeout( - [nvmlSystemGetDriverVersion, "nvmlSystemGetDriverVersion"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def init_board_id(self): - """Fetches and assigns the BoardId from the driver via pynvml api.""" - self.BoardId = function_wrapper_with_timeout( - [nvmlDeviceGetBoardId, self.Handles[self.Index], "nvmlDeviceGetBoardId"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def init_uuid(self): - """Fetches and assigns the UUID of the GPU to the UUID field.""" - self.UUID = function_wrapper_with_timeout( - [nvmlDeviceGetUUID, self.Handles[self.Index], "nvmlDeviceGetUUID"], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def init_gpu_architecture(self): - """Fetches and assigns the GPU device architecture field.""" - self.GPUArchitecture = function_wrapper_with_timeout( - [ - nvmlDeviceGetArchitecture, - self.Handles[self.Index], - "nvmlDeviceGetArchitecture", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def init_vbios_version(self): - """Fetches and assigns the VbiosVersion field via pynvml api.""" - self.VbiosVersion = function_wrapper_with_timeout( - [ - nvmlDeviceGetVbiosVersion, - self.Handles[self.Index], - "nvmlDeviceGetVbiosVersion", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - - def __init__(self, index, nonce, settings): - """Constructor method for the NvmlHandler class that initializes the - various field values. - - Args: - index (int): the index of the NvmlHandler class object. - nonce (bytes): the nonce for the attestation report. - settings (config.HopperSettings): the object containing the various config info. - """ - assert type(index) is int - assert ( - type(nonce) is bytes and len(nonce) == BaseSettings.SIZE_OF_NONCE_IN_BYTES - ) - - self.Index = index - self.init_handle() - self.init_driver_version() - self.init_board_id() - self.init_uuid() - self.init_gpu_architecture() - self.init_vbios_version() - self.CertificateChains = GpuCertificateChains(self.Handles[index]) - self.AttestationReport = self.fetch_attestation_report(index, nonce) - settings.mark_attestation_report_as_available() - - -class NvmlSystemConfComputeSettings(ctypes.Structure): - """ - C-like structure that represents the - nvmlSystemConfComputeSettings structure. - - This class is used to retrieve the compute settings of the system. - - Attributes: - version (ctypes.c_uint): The version of the device. - environment (ctypes.c_uint): The current environment. - ccFeature (ctypes.c_uint): The CC feature mode. - devToolsMode (ctypes.c_uint): The developer tools mode. - multiGpuMode (ctypes.c_uint): The multi-GPU mode. - """ - - _fields_ = [ - ("version", ctypes.c_uint), - ("environment", ctypes.c_uint), - ("ccFeature", ctypes.c_uint), - ("devToolsMode", ctypes.c_uint), - ("multiGpuMode", ctypes.c_uint), - ] - - def __init__(self): - super().__init__(version=NVML_SYSTEM_CONF_COMPUTE_VERSION) - - @property - def get_cc_feature(self): - """ - A getter method for retrieving the ccFeature property. - """ - return self.ccFeature - - @property - def get_multi_gpu_mode(self): - """ - Return the multi-gpu mode of the device. - """ - return self.multiGpuMode diff --git a/packages/verifier/src/verifier/nvml/gpu_cert_chains.py b/packages/verifier/src/verifier/nvml/gpu_cert_chains.py deleted file mode 100644 index 81b4109c..00000000 --- a/packages/verifier/src/verifier/nvml/gpu_cert_chains.py +++ /dev/null @@ -1,181 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from OpenSSL import crypto -import re -import base64 -from pynvml import nvmlDeviceGetConfComputeGpuCertificate -from verifier.config import ( - BaseSettings, - info_log, - event_log, -) -from verifier.exceptions import ( - CertExtractionError, - CertChainFetchError, - TimeoutError, -) -from .test_handle import TestHandle -from verifier.utils import function_wrapper_with_timeout -from verifier.cc_admin_utils import CcAdminUtils - - -class GpuCertificateChains: - """A class to handle the fetching and processing of the GPU attestation certificate chain.""" - - @classmethod - def get_gpu_certificate_chains(cls, handle): - """A class method that fetches the GPU attestation certificate chain data in PEM format. - - Args: - handle (pynvml.nvml.LP_struct_c_nvmlDevice_t): handle of the GPU. - - Raises: - CertChainFetchError: raises exception if there is any problem while fetching the certificate chains. - - Returns: - [bytes]: attestation certificate chain data. - """ - try: - cert_struct = function_wrapper_with_timeout( - [ - nvmlDeviceGetConfComputeGpuCertificate, - handle, - "nvmlDeviceGetConfComputeGpuCertificate", - ], - BaseSettings.MAX_NVML_TIME_DELAY, - ) - # fetching the attestation cert chain. - length_of_attestation_cert_chain = cert_struct.attestationCertChainSize - attestation_cert_chain = cert_struct.attestationCertChain - attestation_cert_data = list() - - for i in range(length_of_attestation_cert_chain): - attestation_cert_data.append(attestation_cert_chain[i]) - - bin_attestation_cert_data = bytes(attestation_cert_data) - - return bin_attestation_cert_data - except TimeoutError as err: - raise TimeoutError("\tThe call to fetch GPU Cert chain timed out.") - except Exception as err: - info_log.error(err) - err_msg = "\tSomething went wrong while fetching the certificate chains from the gpu." - event_log.error(err_msg) - raise CertChainFetchError(err_msg) - - @classmethod - def extract_cert_chain(cls, bin_cert_chain_data): - """A class method that takes in the raw data coming in from the nvml api as the gpu certificate chain in PEM format - and then parse it to extract the individual certificates from the certificate chain. - - Args: - bin_cert_chain_data (bytes): the certificate chain in PEM format. - - Returns: - [list] : List of the certificates extracted from the given cert chain. - """ - try: - assert type(bin_cert_chain_data) is bytes - - PEM_CERT_END_DELIMITER = "-----END CERTIFICATE-----" - start_index = 0 - end_index = None - - str_data = bin_cert_chain_data.decode() - cert_obj_list = list() - - for itr in re.finditer(PEM_CERT_END_DELIMITER, str_data): - end_index = itr.start() - cert_obj_list.append( - crypto.load_certificate( - crypto.FILETYPE_PEM, - str_data[start_index : end_index + len(PEM_CERT_END_DELIMITER)], - ) - ) - - start_index = end_index + len(PEM_CERT_END_DELIMITER) + len("\n") - - if len(str_data) < start_index: - break - return cert_obj_list - - except Exception as err: - info_log.error(err) - err_msg = "\tSomething went wrong while extracting the individual certificates from the certificate chain." - event_log.error(err_msg) - raise CertExtractionError(err_msg) - - @staticmethod - def extract_gpu_cert_chain_base64(gpu_attestation_cert_chain): - """Method to extract GPU Certificate Chain and convert that to base64 encoded string - - Args: - gpu_attestation_cert_chain: GPU Certificate Chain from the Attestation Report - - Returns: - base64 encoded GPU Certificate Chain - """ - cert_chain_data = "" - for certificate in gpu_attestation_cert_chain: - cert = certificate.to_cryptography() - pyopenSSLCert = CcAdminUtils.convert_cert_from_cryptography_to_pyopenssl( - cert - ) - cert_chain_data += crypto.dump_certificate( - crypto.FILETYPE_PEM, pyopenSSLCert - ).decode() - cert_chain_bytes = cert_chain_data.encode("ascii") - encoded_cert_chain = base64.b64encode(cert_chain_bytes) - encoded_cert_chain = encoded_cert_chain.decode("utf-8") - return encoded_cert_chain - - def __init__(self, handle): - """Constructor method for the GpuCertificateChains class. - - Args: - handle (pynvml.LP_struct_c_nvmlDevice_t): the GPU device handle. - """ - # Removing the last certificate from the certificate as it is the root certificate for the GPU device certificate chain. - # The verifier_device_root.pem cert in certs directory is used as the root cert for the GPU device certificate chain. - if isinstance(handle, TestHandle): - self.GpuAttestationCertificateChain = self.extract_cert_chain( - handle.get_test_gpu_certificate_chain() - )[:-1] - else: - self.GpuAttestationCertificateChain = self.extract_cert_chain( - self.get_gpu_certificate_chains(handle) - )[:-1] - - with open(BaseSettings.DEVICE_ROOT_CERT, "r") as f: - data = f.read() - self.GpuAttestationCertificateChain.append( - crypto.load_certificate(type=crypto.FILETYPE_PEM, buffer=data) - ) diff --git a/packages/verifier/src/verifier/nvml/nvmlHandlerTest.py b/packages/verifier/src/verifier/nvml/nvmlHandlerTest.py deleted file mode 100644 index 7cdf854e..00000000 --- a/packages/verifier/src/verifier/nvml/nvmlHandlerTest.py +++ /dev/null @@ -1,152 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from OpenSSL import crypto -import re - -from pynvml import ( - NVML_DEVICE_ARCH_HOPPER, -) - -from verifier.utils import ( - get_gpu_architecture_value, - convert_string_to_blob, -) -from verifier.config import ( - BaseSettings, - HopperSettings, - __author__, - __copyright__, - __version__, -) -from verifier.nvml import GpuCertificateChains -from verifier.nvml.test_handle import TestHandle -from verifier.exceptions import ( - CertExtractionError, - UnsupportedGpuArchitectureError, -) - - -class NvmlHandlerTest: - @classmethod - def get_number_of_gpus(cls): - return BaseSettings.TEST_NO_GPU_NUMBER_OF_GPUS - - def extract_cert_chain(self, bin_cert_chain_data): - try: - assert type(bin_cert_chain_data) is bytes - - PEM_CERT_END_DELIMITER = "-----END CERTIFICATE-----" - start_index = 0 - end_index = None - - # length of \n is 1 - length_of_new_line = 1 - - str_data = bin_cert_chain_data.decode() - cert_obj_list = list() - - for itr in re.finditer(PEM_CERT_END_DELIMITER, str_data): - end_index = itr.start() - cert_obj_list.append( - crypto.load_certificate( - crypto.FILETYPE_PEM, - str_data[start_index : end_index + len(PEM_CERT_END_DELIMITER)], - ) - ) - - start_index = ( - end_index + len(PEM_CERT_END_DELIMITER) + length_of_new_line - ) - - if len(str_data) < start_index: - break - - return cert_obj_list - except Exception as err: - raise CertExtractionError( - "\tSomething went wrong while extracting the individual certificates from the certificate chain.\n\tQuitting now." - ) - - def fetch_attestation_report(self): - if self.GPUArchitecture == NVML_DEVICE_ARCH_HOPPER: - path = HopperSettings.ATTESTATION_REPORT_PATH - else: - raise UnsupportedGpuArchitectureError( - "Only HOPPER architecture is supported." - ) - - with open(path, "r") as f: - data = convert_string_to_blob(f.read()) - return data - - def get_driver_version(self): - return self.DriverVersion - - def get_vbios_version(self): - return self.VbiosVersion - - def get_test_attestation_cert_chain(self): - if self.GPUArchitecture == NVML_DEVICE_ARCH_HOPPER: - path = HopperSettings.GPU_ATTESTATION_CERTIFICATES_PATH - else: - raise UnsupportedGpuArchitectureError( - "Only HOPPER architecture is supported." - ) - - with open(path, "rb") as f: - data = f.read() - - return data - - def get_attestation_cert_chain(self): - return self.CertificateChains.GpuAttestationCertificateChain - - def get_attestation_report(self): - return self.AttestationReport - - def get_gpu_architecture(self): - return get_gpu_architecture_value(self.GPUArchitecture) - - def get_uuid(self): - return self.UUID - - def __init__(self, settings): - self.GPUArchitecture = NVML_DEVICE_ARCH_HOPPER - self.BoardId = 11111 - self.Index = 0 - self.UUID = "GPU-11111111-2222-3333-4444-555555555555" - self.VbiosVersion = "96.00.5e.00.01" - self.DriverVersion = "545.00" - self.AttestationReport = self.fetch_attestation_report() - settings.mark_attestation_report_as_available() - cert_data = self.get_test_attestation_cert_chain() - handle = TestHandle(cert_data) - self.CertificateChains = GpuCertificateChains(handle) diff --git a/packages/verifier/src/verifier/nvml/test_handle.py b/packages/verifier/src/verifier/nvml/test_handle.py deleted file mode 100644 index 2b5cc3d9..00000000 --- a/packages/verifier/src/verifier/nvml/test_handle.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - - -class TestHandle: - """A class to feed the hard coded GPU attestation certificate chains - during testing. - """ - - def get_test_gpu_certificate_chain(self): - """Fetches the hardcoded GPU attestation certificate chain data. - - Returns: - [bytes]: the GPU attestation certificate chain data. - """ - return self.test_cert_chain - - def __init__(self, test_cert_chain_data): - """Constructor method for the TestHandle class. - - Args: - test_cert_chain_data (bytes): the hardcoded GPU attestation - certificate chain data. - """ - self.test_cert_chain = test_cert_chain_data diff --git a/packages/verifier/src/verifier/rim/__init__.py b/packages/verifier/src/verifier/rim/__init__.py deleted file mode 100644 index feac5b4a..00000000 --- a/packages/verifier/src/verifier/rim/__init__.py +++ /dev/null @@ -1,534 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -import os -import io - -from signxml import XMLVerifier -from signxml.exceptions import InvalidSignature -from lxml import etree -from OpenSSL import crypto - -from .golden_measurement import GoldenMeasurement -from verifier.config import ( - BaseSettings, - event_log, - info_log, - __author__, - __copyright__, - __version__, -) -from verifier.cc_admin_utils import CcAdminUtils -from verifier.exceptions import ( - ElementNotFoundError, - EmptyElementError, - InvalidCertificateError, - NoRIMMeasurementsError, - RIMSchemaValidationError, - RIMFetchError, - RIMSignatureVerificationError, - InvalidMeasurementIndexError, - InvalidRIMNameError, - RIMCertChainVerificationError, - RIMCertChainOCSPVerificationError, -) - - -class RIM: - """A class to process and manage all the processing of the RIM files. - RIM module Trusted Computing Group Reference Integrity Manifest of the - Verifier is used to perform the authentication and access of the golden - measurements. - """ - - @staticmethod - def get_element(parent_element, name_of_element): - """A static method that gives the child element of the parent_element with the given name. - - Args: - parent_element (lxml.etree._Element): the parent of the required element. - name_of_element (str): the name of the required element. - - Returns: - [lxml.etree._Element]: the required element. - """ - assert isinstance(parent_element, etree._Element) - assert type(name_of_element) is str - - for child in parent_element.getchildren(): - if (child.tag).find(name_of_element) != -1: - return child - - return None - - @staticmethod - def get_all_elements(parent_element, name_of_element): - assert isinstance(parent_element, etree._Element) - assert type(name_of_element) is str - - list_of_elements = list() - for child in parent_element.getchildren(): - if (child.tag).find(name_of_element) != -1: - list_of_elements.append(child) - return list_of_elements - - @staticmethod - def read(base_RIM_path=None, content=None): - """Static method that reads the signed base RIM from the disk. - - Argument: - base_RIM_path (str) : the path to the signed base RIM. - content (str) : the content of the RIM file as a string. - Returns: - root (lxml.etree._Element) : the root element of the base RIM. - """ - if base_RIM_path is not None and content is None: - try: - assert type(base_RIM_path) is str - - with open(base_RIM_path, "rb") as f: - read_data = f.read() - - except OSError: - event_log.error( - f"Unable to read {base_RIM_path} \nPlease provide a valid RIM file." - ) - raise RIMFetchError( - f"Unable to read {base_RIM_path} \nPlease provide a valid RIM file." - ) - - file_stream = io.BytesIO(read_data) - - elif base_RIM_path is None and content is not None: - file_stream = io.StringIO(content) - - else: - raise RIMFetchError("Invalid parameters!!") - - parser = etree.XMLParser(resolve_entities=False) - new_swidtag_tree = etree.parse(file_stream, parser) - new_root = new_swidtag_tree.getroot() - return new_root - - def validate_schema(self, schema_path): - """Performs the schema validation of the base RIM against a given schema. - - Args: - schema_path (str): the path to the swidtag schema xsd file. - - Returns: - [bool]: Ture if the schema validation is successful otherwise, returns False. - """ - try: - parser = etree.XMLParser(resolve_entities=False) - xml_schema_document = etree.parse(schema_path, parser) - - xml_schema = etree.XMLSchema(xml_schema_document) - - result = xml_schema.validate(self.root) - except Exception: - err_msg = "\t\tRIM Schema validation failed." - event_log.error(err_msg) - - raise RIMSchemaValidationError(err_msg) - - return result - - def get_colloquial_version(self): - """Parses RIM to return the driver/vbios version which is present in the RIM as - colloquial version. - - Raises: - ElementNotFoundError: Raises exception if the Meta element is not present. - EmptyElementError: Raises exception if the colloquialVersion field is empty. - - Returns: - [str]: The colloquialVersion attribute of Meta element. - """ - Meta = RIM.get_element(self.root, "Meta") - if Meta is None: - err_msg = "\t\tNo Meta element found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - version = Meta.attrib["colloquialVersion"] - - if version is None or version == "": - err_msg = "Driver version not found in the RIM." - info_log.error(err_msg) - raise EmptyElementError(err_msg) - - event_log.debug(f"The driver version in the RIM file is {version}") - version = version.lower() - return version - - def extract_certificates(self): - """Extracts all the x509 certificate in PEM format from the base RIM. - - Raises: - ElementNotFoundError: it is raised if the required element is not present. - InvalidCertificateError: it is raised if there is any problem in - extracting the X509 certificate from the RIM file. - - Returns: - [bytes]: the X509 PEM certificate data. - """ - try: - Signature = RIM.get_element(self.root, "Signature") - - if Signature is None: - err_msg = "No Signature found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - KeyInfo = RIM.get_element(Signature, "KeyInfo") - if KeyInfo is None: - err_msg = "No KeyInfor found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - X509Data = RIM.get_element(KeyInfo, "X509Data") - if X509Data is None: - err_msg = "X509Data not found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - X509Certificates = RIM.get_all_elements(X509Data, "X509Certificate") - - if len(X509Certificates) == 0: - err_msg = "X509Certificates not found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - result = list() - for i in range(len(X509Certificates) - 1): - header = "-----BEGIN CERTIFICATE-----\n" - cert_string = X509Certificates[i].text - cert_string = cert_string.replace(" ", "") - tail = "-----END CERTIFICATE-----\n" - final = header + cert_string + tail - cert_bytes = final.encode() - x509_cert_object = crypto.load_certificate( - type=crypto.FILETYPE_PEM, buffer=cert_bytes - ) - - if not isinstance(x509_cert_object, crypto.X509): - raise ValueError() - result.append(x509_cert_object) - - except Exception as error: - info_log.error(error) - err_msg = "\t\tThere was a problem while extracting the X509 certificate from the RIM." - info_log.info(err_msg) - raise InvalidCertificateError(err_msg) - - return result - - def verify_signature(self, settings): - """Verifies the signature of the base RIM. - - Arguments: - settings (config.HopperSettings): the object containing the various config info. - - Returns: - [bool] : If signature verification is successful, then return the True. Otherwise, - raises RIMSignatureVerificationError. - """ - if self.rim_name == "driver": - event_log.info("Driver rim cert has been extracted successfully") - else: - event_log.info("Vbios rim cert has been extracted successfully") - try: - # performs the signature verification of the RIM. We will get the root of the RIM - # if the signature verification is successful otherwise, it raises InvalidSignature exception. - verified_root = ( - XMLVerifier() - .verify( - self.root, - ca_pem_file=settings.RIM_ROOT_CERT, - ca_path=settings.ROOT_CERT_DIR, - ) - .signed_xml - ) - - if verified_root is None: - err_msg = "\t\t\tRIM signature verification failed." - event_log.error(err_msg) - raise RIMSignatureVerificationError(err_msg) - - except InvalidSignature as error: - err_msg = "\t\t\tRIM signature verification failed." - event_log.error(err_msg) - raise RIMSignatureVerificationError(err_msg) - - except Exception as error: - info_log.error(error) - err_msg = "\t\t\tRIM signature verification failed." - event_log.error(err_msg) - raise RIMSignatureVerificationError(err_msg) - - info_log.info(f"\t\t\t{self.rim_name} RIM signature verification successful.") - self.root = verified_root - if self.rim_name == "driver": - settings.mark_driver_rim_cert_validated_successfully() - else: - settings.mark_vbios_rim_cert_validated_successfully() - return True - - def get_measurements(self): - """Returns the dictionary object that contains the golden measurement. - - Returns: - [dict]: the dictionary containing the golden measurement. - """ - return self.measurements_obj - - def parse_measurements(self, settings): - """Lists the measurements of the Resource tags in the base RIM. - - Args: - settings (config.HopperSettings): the object containing the various config info. - - Raises: - ElementNotFoundError: it is raised if a required element is not found. - InvalidMeasurementIndexError: it is raised in case multiple measurement are assigned same index. - NoRIMMeasurementsError: it is raised in case there are no golden measurements in the RIM file. - """ - self.measurements_obj = dict() - Payload = RIM.get_element(self.root, "Payload") - - if Payload is None: - err_msg = "Payload not found in the RIM." - info_log.error(err_msg) - raise ElementNotFoundError(err_msg) - - for child in Payload: - if child.attrib["active"] == "False": - active = False - else: - active = True - - index = int(child.attrib["index"]) - alternatives = int(child.attrib["alternatives"]) - measurements_values = list() - - for i in range(alternatives): - measurements_values.append( - child.attrib[settings.HashFunctionNamespace + "Hash" + str(i)] - ) - - golden_measurement = GoldenMeasurement( - component=self.rim_name, - values=measurements_values, - name=child.attrib["name"], - index=index, - size=int(child.attrib["size"]), - alternatives=alternatives, - active=active, - ) - if index in self.measurements_obj: - raise InvalidMeasurementIndexError( - f"Multiple measurement are assigned same index in {self.rim_name} rim." - ) - - self.measurements_obj[index] = golden_measurement - - if len(self.measurements_obj) == 0: - raise NoRIMMeasurementsError( - f"\tNo golden measurements found in {self.rim_name} rim.\n\tQuitting now." - ) - - event_log.debug(f"{self.rim_name} golden measurements are : \n\t\t\t\t\t\t\t") - - for idx in self.measurements_obj: - event_log.debug(f"\n\t\t\t\t\t\t\t index : {idx}") - event_log.debug( - f"\t\t\t\t\t\t\t number of alternative values : {self.measurements_obj[idx].get_number_of_alternatives()}" - ) - for i in range(self.measurements_obj[idx].get_number_of_alternatives()): - event_log.debug( - f"\t\t\t\t\t\t\t\t value {i + 1} : {self.measurements_obj[idx].get_value_at_index(i)}" - ) - - if self.rim_name == "driver": - settings.mark_rim_driver_measurements_as_available() - else: - settings.mark_rim_vbios_measurements_as_available() - - def get_manufacturer_id(self, driver_rim_content): - """Returns the manufacturer id of the RIM. - Returns: - [str]: the manufacturer id of the RIM. - """ - root = etree.fromstring(driver_rim_content) - - ns = { - "ns0": "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", - "ns1": "https://trustedcomputinggroup.org/resource/tcg-reference-integrity-manifest-rim-information-model/", - } - meta = root.find(".//ns0:Meta", ns) - if meta is None: - event_log.error("Meta element not found in the RIM.") - return "" - - firmware_manufacturer_id = meta.attrib.get( - "{https://trustedcomputinggroup.org/resource/tcg-reference-integrity-manifest-rim-information-model/}FirmwareManufacturerId", - "", - ) - if not firmware_manufacturer_id: - event_log.error( - "FirmwareManufacturerId attribute not found in Meta element." - ) - return firmware_manufacturer_id - - def verify(self, version, settings, schema_path=""): - """Performs the schema validation if it is successful then signature verification is done. - If both tests passed then returns True, otherwise returns False. - - Arguments: - version (str) : the driver/vbios version of the required RIM. - settings (config.HopperSettings): the object containing the various config info. - base_RIM_path (str) : the path to the base RIM. Default value is None. - schema_path (str) : the path to the swidtag schema xsd file. Default value is "swid_schema_2015.xsd". - - Returns : - [bool] : True if schema validation and signature verification passes, otherwise returns False. - """ - assert type(version) is str - assert type(schema_path) is str - - if schema_path == "": - schema_path = os.path.join(os.path.dirname(__file__), "swidSchema2015.xsd") - - if not schema_path or not os.path.isfile(schema_path): - info_log.error( - "There is a problem in the path to the swid schema. Please provide a valid the path to the swid schema." - ) - raise FileNotFoundError("\t\tSWID schema file not found.") - - if self.validate_schema(schema_path=schema_path): - info_log.info("\t\t\tRIM Schema validation passed.") - - if self.rim_name == "driver": - settings.mark_driver_rim_schema_validated() - else: - settings.mark_vbios_rim_schema_validated() - - if version != self.colloquialVersion.lower(): - info_log.warning( - f"\t\t\tThe {self.rim_name} version in the RIM file is not matching with the installed {self.rim_name} version." - ) - else: - if self.rim_name == "driver": - settings.mark_rim_driver_version_as_matching() - else: - settings.mark_rim_vbios_version_as_matching() - - event_log.debug( - f"The {self.rim_name} version in the RIM file is matching with the installed {self.rim_name} version." - ) - - rim_cert_chain = self.extract_certificates() - # Reading the RIM root certificate. - with open( - os.path.join(settings.ROOT_CERT_DIR, settings.RIM_ROOT_CERT), "r" - ) as root_cert_file: - root_cert_data = root_cert_file.read() - - if self.rim_name == "driver": - mode = BaseSettings.Certificate_Chain_Verification_Mode.DRIVER_RIM_CERT - else: - mode = BaseSettings.Certificate_Chain_Verification_Mode.VBIOS_RIM_CERT - - rim_cert_chain.append( - crypto.load_certificate(type=crypto.FILETYPE_PEM, buffer=root_cert_data) - ) - rim_cert_chain_verification_status = CcAdminUtils.verify_certificate_chain( - rim_cert_chain, settings, mode - ) - if not rim_cert_chain_verification_status: - raise RIMCertChainVerificationError( - f"\t\t\t{self.rim_name} RIM cert chain verification failed" - ) - - info_log.info( - f"\t\t\t{self.rim_name} RIM certificate chain verification successful." - ) - - rim_cert_chain_ocsp_revocation_status, gpu_attestation_warning = ( - CcAdminUtils.ocsp_certificate_chain_validation( - rim_cert_chain, settings, mode - ) - ) - - if not rim_cert_chain_ocsp_revocation_status: - raise RIMCertChainOCSPVerificationError( - f"\t\t\t{self.rim_name} RIM cert chain ocsp status verification failed." - ) - - return self.verify_signature(settings), gpu_attestation_warning - - else: - raise RIMSchemaValidationError( - f"\t\t\tSchema validation of {self.rim_name} RIM failed." - ) - - def __init__(self, rim_name, settings, rim_path="", content=""): - """The constructor method for the RIM class handling all the RIM file processing. - - Args: - rim_name (str): the name of the RIM, can be either "driver" or "vbios" - settings (config.HopperSettings): the object containing various config. - rim_path (str): the path to the RIM file - content (str): the content of the RIM file as a string. - Raises: - InvalidRIMNameError: it is raised if the rim_path is invalid. - """ - assert type(rim_path) is str - assert type(rim_name) is str - - if rim_name != "driver" and rim_name != "vbios": - raise InvalidRIMNameError( - f"Invalid rim name '{rim_name}' provided, valid names can be 'driver'/'vbios'." - ) - - self.rim_name = rim_name - if content == "": - self.root = RIM.read(base_RIM_path=rim_path) - else: - self.root = RIM.read(content=content) - - if rim_name == "driver": - settings.mark_driver_rim_fetched() - else: - settings.mark_vbios_rim_fetched() - - self.colloquialVersion = self.get_colloquial_version() - self.parse_measurements(settings) diff --git a/packages/verifier/src/verifier/rim/golden_measurement.py b/packages/verifier/src/verifier/rim/golden_measurement.py deleted file mode 100644 index 6d3959f2..00000000 --- a/packages/verifier/src/verifier/rim/golden_measurement.py +++ /dev/null @@ -1,203 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -from verifier.config import info_log - - -class GoldenMeasurement: - """A class to represent the individual golden measurement values from the RIM files.""" - - def __init__(self, component, values, name, index, size, alternatives, active): - """Constructor method to create the object for the individual golden measurement. - - Args: - component (str): the component name for which the golden - measurement belongs "driver" or "vbios". - values (list): the list of valid/alternative golden measurement. - name (str): the name of the measurement. - index (int): the index of the measurement. - size (int): the size of the measurement value in number of bytes. - alternatives (int): number of valid/alternative measurements. - active (bool): True if the measurement is to be used for - comparision with the runtime measurement else False. - """ - self.set_component(component) - self.set_value(values) - self.set_name(name) - self.set_index(index) - self.set_size(size) - self.set_number_of_alternatives(alternatives) - self.set_active(active) - - def get_component(self): - """Fetches the component name for which the measurement belongs, - either "driver" or "vbios". - - Returns: - [str]: the component name, one of the value "driver"/"vbios". - """ - return self.component - - def set_component(self, component): - """Sets the component name to the golden measurement. It can be either - "driver" or "vbios". - - Args: - component (str): component name. It can be either "driver" for - driver measurement or "vbios" for vbios measurement. - """ - self.component = component - - def get_value_at_index(self, index): - """Fetches the golden measurement value at the given index among the - alternative values of the golden measurement at a particular - measurement index. - - Args: - index (int): the position of the value in the list of alternative - measurement values. - - Returns: - [str]: the measurement value. - """ - assert type(index) is int - return self.values[index] - - def set_value(self, values): - """Sets the list of measurement values to the GoldenMeasurement class - object. - - Args: - values (list): the list of valid golden measurement at an index. - """ - assert type(values) is list - self.values = values - - def get_name(self): - """Fetches the name of the golden measurement. - - Returns: - [str]: the name of the golden measurement. - """ - return self.name - - def set_name(self, name): - """Sets the name of measurement values to the GoldenMeasurement class - object. - - Args: - name (str): the name of the golden measurement. - """ - self.name = name - - def get_index(self): - """Fetches the index of the golden measurement. - - Returns: - [int]: the index of the golden measurement. - """ - return self.index - - def set_index(self, index): - """Sets the index of the golden measurement. - - Args: - index (int): the index of the golden measurement. - """ - self.index = index - - def get_size(self): - """Fetches the size of the golden measurement value in number of bytes. - - Returns: - [int]: the size of the measurement. - """ - return self.size - - def set_size(self, size): - """Sets the size of the golden measurement value in number of bytes. - - Args: - size (int): the size of the measurement. - """ - self.size = size - - def get_number_of_alternatives(self): - """Fetches the number of valid alternative values for the golden - measurement. - - Returns: - [int]: the number of valid values. - """ - return self.alternatives - - def set_number_of_alternatives(self, value): - """Sets the number of valid alternative values for the golden - measurement. - - Args: - value (int): the numner of valid values. - """ - self.alternatives = value - - def is_active(self): - """Checks if the given golden measurement needs to be compared with - the corresponding run time measurement. - - Returns: - [bool]: True if being used for comparison with runtime - measurement otherwise returns False. - """ - return self.active - - def set_active(self, active): - """Sets wether the given golden measurement needs to be compared with - the corresponding run time measurement or not. - - Args: - active (bool): True if being used for comparison with runtime - measurement otherwise returns False. - """ - self.active = active - - def print_obj(self, logger): - """This method prints the various fields of the GoldenMeasurement - class object representing the individual golden measurement. - - Args: - logger (logging.Logger): the logger object. - """ - logger.info("-----------------------------------") - logger.info(f"\tcomponent : {self.component}") - logger.info(f"\tvalue : {self.value}") - logger.info(f"\tname : {self.name}") - logger.info(f"\tindex : {self.index}") - logger.info(f"\tsize : {self.size}") - logger.info(f"\tnullable : {self.nullable}") - logger.info(f"\tactive : {self.active}") diff --git a/packages/verifier/src/verifier/rim/signSchema.xsd b/packages/verifier/src/verifier/rim/signSchema.xsd deleted file mode 100644 index e35571b9..00000000 --- a/packages/verifier/src/verifier/rim/signSchema.xsd +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - ]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/verifier/src/verifier/rim/swidSchema2015.xsd b/packages/verifier/src/verifier/rim/swidSchema2015.xsd deleted file mode 100644 index f367cb6a..00000000 --- a/packages/verifier/src/verifier/rim/swidSchema2015.xsd +++ /dev/null @@ -1 +0,0 @@ - Schema for ISO-IEC 19770-2 Software Identification Tags http://standards.iso.org/iso/19770/-2/2015/schema.xsd Copyright 2015 ISO/IEC, all rights reserved Copyright notice: ISO and IEC grant the users of this Standard the right to use this XSD file free of charge for the purpose of implementing the present Standard. Disclaimer: In no event shall ISO and/or IEC be liable for any damages whatsoever (including, but not limited to, damages for loss of profits, business interruption, loss of information, or any other pecuniary loss) arising out of or related to the use of or inability to use the XSD file. ISO and IEC disclaim all warranties, express or implied, including but not limited to warranties of merchantability and fitness for a particular purpose. 2.0 Represents the root element specifying data about a software component Attributes common to all Elements in this schema Allows any undeclared attributes on any element as long as the attribute is placed in a different namespace. Specifies the organizations related to the software component referenced by this SWID tag. An open-ended collection of elements that can be used to attach arbitrary metadata to an Entity. The name of the organization claiming a particular role in the SWID tag. The regid of the organization. If the regid is unknown, the value "invalid.unavailable" is provided by default (see RFC 6761 for more details on the default value). The relationship between this organization and this tag e.g. tag, softwareCreator, licensor, tagCreator, etc. The role of tagCreator is required for every SWID tag. EntityRole may include any role value, but the pre-defined roles include: aggregator, distributor, licensor, softwareCreator, tagCreator Other roles will be defined as the market uses the SWID tags. this value provides a hexadecimal string that contains a hash (or thumbprint) of the signing entities certificate. The element is used to provide results from a scan of a system where software that does not have a SWID tag is discovered. This information is not provided by the software creator, and is instead created when a system is being scanned and the evidence for why software is believed to be installed on the device is provided in the Evidence element. Date and time the evidence was gathered. Identifier for the device the evidence was gathered from. Represents an individual file Files that are considered important or required for the use of a software component. Typical key files would be those which, if not available on a system, would cause the software not to execute. Key files will typically be used to validate that software referenced by the SWID tag is actually installed on a specific computing device The directory or location where a file was found or can expected to be located. does not include the filename itself. This can be relative path from the 'root' attribute. The filename without any path characters A system-specific root folder that the 'location' attribute is an offset from. If this is not specified the assumption is the 'root' is the same folder as the location of the SWIDTAG. Permits any user-defined attributes in file tags Provides the ability to apply a directory structure to the files defined in a Payload or Evidence element. A Directory element allows one or more directories to be defined in the file structure. A File element that allows one or more files to be specified for a given location. Represents an individual file The file size in bytes of the file The file version Provides process information for data that will show up in a devices process table. The process name as it will be found in the devices process table. The process ID for the executing process - note that this will typically only be provided when the Process element is included as part of Evidence. A container that can be used to provide arbitrary resource information about an application installed on a device, or evidence collected from a device. The type of resource (ie, registrykey, port, rootUrl) This type is used by Payload to provide details on what may rbe installed on a device, and by Evidence to indicate what an inventory process discovered on a device. One or more directory elements One or more File elements One or more Process elements One or more generic resource elements A reference to any another item (can include details that are related to the SWID tag such as details on where software downloads can be found, vulnerability database associations, use rights, etc). This is modeled directly to match the HTML [LINK] element; it is critical for streamlining software discovery scenarios that these are kept consistent. For installation media (rel="installationmedia") - dictates the canonical name for the file. Items with the same artifact name should be considered mirrors of each other (so download from wherever works). The link to the item being referenced. The href can point to several different things, and can be any of the following: - a RELATIVE URI (no scheme) - which is interpreted depending on context (ie, "./folder/supplemental.swidtag" ) - a physical file location with any system-acceptable URI scheme (ie, file:// http:// https:// ftp:// ... etc ) - an URI with "swid:" as the scheme, which refers to another swid by tagId. This URI would need to be resolved in the context of the system by software that can lookup other swidtags.( ie, "swid:2df9de35-0aff-4a86-ace6-f7dddd1ade4c" ) - an URI with "swidpath:" as the scheme, which refers to another swid by an XPATH query. This URI would need to be resolved in the context of the system by software that can lookup other swidtags, and select the appropriate one based on an XPATH query. Examples: swidpath://SoftwareIdentity[Entity/@regid='http://contoso.com'] would retrieve all swidtags that had an entity where the regid was Contoso swidpath://SoftwareIdentity[Meta/@persistentId='b0c55172-38e9-4e36-be86-92206ad8eddb'] would retrieve swidtags that matched the persistentId See XPATH query standard : http://www.w3.org/TR/xpath20/ An attribute defined by the W3C Media Queries Recommendation (see http://www.w3.org/TR/css3-mediaqueries/). A hint to the consumer of the link to what the target item is applicable for. Determines the relative strength of ownership of the target piece of software. The relationship between this SWID and the target file. Relationships can be identified by referencing the IANA registration library - https://www.iana.org/assignments/link-relations/link-relations.xhtml. The IANA MediaType for the target file; this provides the consumer with intelligence of what to expect. See http://www.iana.org/assignments/media-types/media-types.xhtml for more details on link type. Determines if the target software is a hard requirement or not An open-ended collection of key/value data related to this SWID. Permits any user-defined attributes in Meta tags Specifies the organizations related to the software component referenced by this SWID tag. This has a minOccurs of 1 because the spec declares that you must have at least a Entity with role='tagCreator' This element is used to provide results from a scan of a system where software that does not have a SWID tag is discovered. This information is not provided by the software creator, but is instead created when a system is being scanned and the evidence for why software is believed to be installed on the device is provided in the Evidence element. A reference to any another item (can include details that are related to the SWID tag such as details on where software downloads can be found, vulnerability database associations, use rights, etc). Note: This is modelled directly to match the HTML [LINK] element; it is critical for streamlining software discovery scenarios that these are kept consistent. An open-ended collection of key/value data related to this SWID. The items that may be installed on a device when the software is installed. Note that Payload may be a superset of the items installed and, depending on optimization systems for a device, may or may not include every item that could be created or executed on a device when software is installed. In general, payload will be used to indicate the files that may be installed with a software product and will often be a superset of those files (i.e. if a particular optional component is not installed, the files associated with that component may be included in payload, but not installed on the device). Allows any undeclared elements in the SoftwareIdentity element as long as the element is placed in a different namespace. As xs:any supercedes an xs:element declaration, this continues to support digital signatures using the ds:Signature element: Signatures are not a mandatory part of the software identification tag standard, and can be used as required by any tag producer to ensure that sections of a tag are not modified and/or to provide authentication of the signer. If signatures are included in the software identification tag, they shall follow the W3C recommendation defining the XML signature syntax which provides message integrity authentication as well as signer authentication services for data of any type. Set to true, if this attribute specifies that this SWID tag is a collection of information that describes the pre-installation data of software component. Set to true if this SWID describes a product patch or modification to a different software element. media is a hint to the tag consumer to understand what this SWID tag applies to (see the [Link] tags media attribute). This attribute provides the software component name as it would typically be referenced. For example, what would be seen in the add/remove dialog on a Windows device, or what is specified as the name of a packaged software product or a patch identifier name on a Linux device. Specifies that this tag provides supplemental tag data that can be merged with primary tag data to create a complete record of the software information. Supplemental tags will often be provided at install time and may be provided by different entities (such as the tag consumer, or a Value Added Reseller). tagId shall be a globally unique identifier and should be assigned a GUID reference (see ISO/IEC 19770-5 definition for GUID). The tagID provides a unique reference for the specific product, version, edition, revision, etc (essentially, the same binary distribution). If two tagIDs match and the tagCreator is the same, the underlying products they represent are expected to be exactly the same. This allows IT systems to identify if a software item (for example, a patch) is installed simply by referencing the specific tagID value which is likely to be readily available in a software inventory. It is recommended, when possible, that a 16 byte GUID be used for this field as this provides global uniqueness without a significant amount of overhead for space. If use of a 16 byte GUID is not possible, a text based globally unique ID may be constructed, this ID should include a unique naming authority for the tagCreator and sufficient additional details that the tagId is unique for the software product, version, edition, revision, etc. This would likely look as follows (+ is used as a string concatenation symbol): regid + productName + version + edition + revision + ... The tagVersion indicates if a specific release of a software product has more than one tag that can represent that specific release. This may be the case if a software tag producer creates and releases an incorrect tag that they subsequently want to fix, but with no underlying changes to the product the SWID tag represents. This could happen if, for example, a patch is distributed that has a Link reference that does not cover all the various software releases it can patch. A newer SWID tag for that patch can be generated and the tagVersion value incremented to indicate that the data is updated. Underlying development version for the software component. Scheme used for the version number. Some possible common values are: value="alphanumeric" Strictly a string, sorting alphanumericaly value="decimal" A floating point number : ( ie, 1.25 is less than 1.3 ) value="multipartnumeric" Numbers seperated by dots, where the numbers are interpreted as integers (ie, 1.2.3 , 1.4.5.6 , 1.2.3.4.5.6.7 ) value="multipartnumeric+suffix" Numbers seperated by dots, where the numbers are interpreted as integers with an additional string suffix: (ie, 1.2.3a) value="semver" Follows the semver.org spec value="unknown" Unknown, no attempt should be made to order these An open-ended collection of key/value data related to this SWID. The attributes included in this Element are predefined attributes to ensure common usage across the industry. The schema allows for any additional attribute to be included in a SWID tag, though it is recommended that industry norms for new attributes are defined and followed to the degree possible. Identification of the activation status of this software title (e.g. Trial, Serialized, Licensed, Unlicensed, etc). Typically, this is used in supplemental tags. Provides information on which channel this particular software was targeted for (e.g. Volume, Retail, OEM, Academic, etc). Typically used in supplemental tags. The informal or colloquial version of the product (i.e. 2013). Note that this version may be the same through multiple releases of a software product where the version specified in SoftwareEntity is much more specific and will change for each software release. Note that this representation of version is typically used to identify a group of specific software releases that are part of the same release/support infrastructure (i.e. Fabrikam Office 2013). This version is used for string comparisons only and is not compared to be an earlier or later release (that is done via the SoftwareEntity version). A longer, detailed description of the software. This description can be multiple sentences (differentiated from summary which is a very short, one-sentence description). The variation of the product (Extended, Enterprise, Professional, Standard etc) An indicator to determine if there should be accompanying proof of entitlement when a software license reconciliation is completed. A vendor-specific textual key that can be used to reconcile the validity of an entitlement. (e.g. serial number, product or license key). The name of the software tool that created a SWID tag. This element is typically used if tags are created on the fly, or based on a catalogue based analysis for data found on a computing device. A GUID used to represent products installed where the products are related, but may be different versions. See one representation of this value through the use of what, in a windows installation process is referred to as an upgradeCode - http://msdn.microsoft.com/en-us/library/aa372375(v=vs.85).aspx as one example of the use of this value. The base name of the product (e.g. Office, Creative Suites, Websphere, etc). The overall product family this software belongs to. Product family is not used to identify that a product is part of a suite, but is instead used when a set of products that are all related may be installed on multiple different devices. For example, an Enterprise backup system may consist of a backup server, multiple different backup systems that support mail servers, databases and ERP systems as well as individual software items that backup client devices. In this case all software titles that are part of the backup system would have the same productFamily name so they can be grouped together in reporting systems. The informal or colloquial representation of the sub-version of the given product (ie, SP1, R2, RC1, Beta 2, etc). Note that the SoftwareIdentity.version will provide very exact version details, the revision is intended for use in environments where reporting on the informal or colloquial representation of the software is important (for example, if for a certain business process, an organization recognizes that it must have ServicePack 1 or later of a specific product installed on all devices, they can use the revision data value to quickly identify any devices that do not meet this requirement). Depending on how a software organizations distributes revisions, this value could be specified in a primary (if distributed as an upgrade) or supplemental (if distributed as a patch) SWID tag. A short (one-sentence) description of the software. An 8 digit code that provides UNSPSC classification of the software product this SWID tag identifies. For more information see, http://www.unspsc.org/ The version of the UNSPSC code used to define the UNSPSC code value. For more information see, http://www.unspsc.org/. An expression that the document evaluator can use to determine if the target of the link is applicable to the current platform (the host environment) Used as an optimization hint to notify a system that it can ignore something when it's not likely to be used. The format of this string is modeled upon the MediaQuery definition at http://www.w3.org/TR/css3-mediaqueries/ This is one or more EXPRESSIONs where the items are connected with an OPERATOR: media="EXPRESSION [[OPERATOR] [EXPRESSION]...]" EXPRESSION is processed case-insensitive and defined either : (ENVIRONMENT) indicates the presence of the environment or ([PREFIX-]ENVIRONMENT.ATTRIBUTE:VALUE) indicates a comparison of an attribute of the environment. ENVIRONMENT is a text identifier that specifies any software,hardware feature or aspect of the system the software is intended to run in. Common ENVIRONMENTs include (but not limited to): linux windows java powershell ios chipset peripheral ATTRIBUTE is a property of an ENVIRONMENT with a specific value. Common attributes include (but not limited to): version vendor architecture PREFIX is defined as one of: MIN # property has a minimum value of VALUE MAX # property has a maximum value of VALUE if a PREFIX is not provided, then the property should equal VALUE OPERATOR is defined of one of: AND NOT Examples: media="(windows)" # applies to only systems that identify themselves as 'Windows' media="(windows) not (windows.architecture:x64)" # applies to only systems that identify # themselves as windows and are not for an x64 cpu media="(windows) and (min-windows.version:6.1)" # applies to systems that identify themselves as # windows and at least version 6.1 media="(linux) and (linux.vendor:redhat) and (min-linux.kernelversion:3.0)" # applies to systems that identify themselves as # linux, made by redhat and with a kernel version of at least 3.0 media="(freebsd) and (min-freebsd.kernelversion:6.6)" # applies to systems that identify themselves as # freebsd, with a kernel version of at least 6.6 media="(powershell) and (min-powershell.version:3.0)" # applies to systems that have powershell 3.0 or greater Properties are expected to be able to be resolved by the host environment without having to do significant computation. The IANA MediaType for the target href; this provides the SWID tag consumer with intelligence of what to expect. See http://www.iana.org/assignments/media-types/media-types.xhtml for more details on link type. Determines the relative strength of ownership of the target piece of software. If this is uninstalled, then the [Link]'d software should be removed too. If this is uninstalled, then the [Link]'d software should be removed if nobody else is sharing it Determines if the target software is a hard requirement. The [Link]'d software is absolutely required for installation Not absolutely required, but install unless directed not to Not absolutely required, install only when asked \ No newline at end of file diff --git a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_PROD.swidtag deleted file mode 100644 index f50e0e73..00000000 --- a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -D3Bc48ZT3n3afFJR1MEyzTtpwbpOAugxwZeWlMtVpB1sNqj9c+sx5biKZGnMPB/bs5JY0M09yXBW53B1GPI4dduuK0MjkwDK/adY82sT6Kmag+lzsapVDKJCMuLF5NF/DyRU3JaGeZqyfrWqYITllIGb7Os+7mzRndc8232uMaK11xyjF31ro/hkQRKPgdJYMIICkTCCAhagAwIBAgIJAOgRIwjIjGzSMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDYyMzA5MzAzM1oX -DTI1MDYyMjA5MzAzM1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BMju37VJbMhfUx5t4YZzK/u9GgyxQK8CvrLcq9fXX7omH9pGvc6tPwGZj/2xaOYt -Tan7rhui3ef+8qGHTtKXmqotvSp0iYtylR1fmEwjdo/jWzad1KAWiob6fd7/9q73 -2qOBmjCBlzAdBgNVHQ4EFgQU69B6n/BK3h5cceq65umQVI89kQcwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAM49z5w0hAfUtv8bNDh+ -tFblBAbRtH168ICturKRFnBopW/LpIz93F1KFtQRnurTpQIxAIA26IWfJaGRlyIF -lLtaAagCWr7OOaFd6EDoax7cBgH2mxj15HuhwDsAag3Ag2Lm8A== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_test_no_gpu.swidtag b/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_test_no_gpu.swidtag deleted file mode 100644 index f64f894b..00000000 --- a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0001_test_no_gpu.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -weKq8ILiv/4rR4gub1t7345zux1p4jbQQ1WdyCdHrEBsK4QamWzNaCyLmUDA2Hst4ndNE4/FYMkiT8juojNCtthtTtG+XN8ONd3ztQxkrNg4fg9TmGxSMd20PSH6WK3GmlM97xSWeyR6GGuKM4T7lu5em50JxRF+IYkMp2OGxUG4ezDjiOE9OBtFWJ7ZDZcWMIICkDCCAhagAwIBAgIJALEem5hoeLiXMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDYyMzA5Mzg1NFoX -DTI1MDYyMjA5Mzg1NFowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BGD+EAx66O6kmYv9vdUaT6Gbq+JVs5kqFWCdaupWJRTrOZdvQ5GxmT2hN75LaT+I -Ttkqe5aw2M23M4OXQVs4seWW6qv3nla7u+tU/TbxfuOG5EsMZ/lF4KjoswbDrw+T -z6OBmjCBlzAdBgNVHQ4EFgQUdrwKrbPHjeCpgF97FqYkUusQBbIwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAI7LV/ld8mVtYclxf7o1 -0BjIJXtC5C6508L4mRgnUNBKZaghtCwA+dFEiGt98uutFQIwT+kELWsyQnKI48IB -C17fxCZKu40Mx1LTbHujCGqtxbRVgh2xA932groLV59dovDH -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0003_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0200_882_96005E0003_PROD.swidtag deleted file mode 100644 index d483eb99..00000000 --- a/packages/verifier/src/verifier/samples/1010_0200_882_96005E0003_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Km/Ekw0nIier8IUW3O8CHRGMnxecLyVMNMBqM7+emm4ooCOP9u2r1/YXd87+pcZmZFDSgtZpBnQp0hPbFY17knKt14zsuSn31WO89z5FEv6uiwdoEUO2m1XQlL6Dlnb6iglIXD1H/CRHJjQFYxc2sblry15jPHbuZf1c5/Skj9E1w18vkWj/05peksSWCWuoMIICkTCCAhagAwIBAgIJAOxqXZUalw9fMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4Mjg1MloX -DTI1MDkwNTA4Mjg1MlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BNZ8AAqZ7DGWZYKIPduEVkeO+dDWqHkOto0BwkFbTggiLmzBirR/f/cL3Pi01o8y -COQ2tIuQP2bHfd2YGBycliOn9IANU4YvBXplg9GKO0N8rngO6wp8XnOLgfEePrsX -3qOBmjCBlzAdBgNVHQ4EFgQUskMvOgalD37aiJe/q8bAyNYtyGwwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAJOXaTrl6+LO5Q61SB/g -p0DiC/cpyu2ioXviRH2rGZv7CGYEkQfxouMQV5ikMl9K0gIxAODnRcKJXvCAs0Sd -2oHV6HpbCXz87fsd0j0bC7x/yKPfPcH7KnrCAZfEDDh+lqZDkQ== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0200_882_960074001A_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0200_882_960074001A_PROD.swidtag deleted file mode 100644 index ebd42284..00000000 --- a/packages/verifier/src/verifier/samples/1010_0200_882_960074001A_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i6l73drDPojjqDnxnTpfaC9y9WY8z4ABpOsRar/ZPvYDBpmazUWzGjvr9yYA26uTxWqfxhp+gL5BO0jDoIlOBV8a/Mnqkk8xqzRM6V1tEQCXnS0syTk4IFfANOpKfK9n6PolqwugHyQYBEVAxksTudMhsidsH8mRkNUh9kgMV0HPsZ9B6mlOvZqS6R2EEdOCMIICkDCCAhagAwIBAgIJANbs8HycuJrMMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4MzUyMloX -DTI1MDkwNTA4MzUyMlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BPH/mWF1EbaIQjjw7JOASJM2gHZcJJ9kVf05MTwy1sK3LaWpB/4h2U6F94GnAL1D -qJXB1W4iK+YYwX/hQg280k6c7lD4aqpT8YGuEPhOf0LZ4xwTKrhbYW2CSNeFosgR -RqOBmjCBlzAdBgNVHQ4EFgQUDSsaqMagKsyQuOLnH/aAiURKqbswHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwamhzCiThb9/Ry5BPDhUN -SopEbIEPm27abpG4DDdg4fKeQhn+oFdm5RHhmV8dRGOgAjEA59Agt59FDOgnJLfZ -Q2QEQSmd06o5G/khpfnPjO5q6UN8BnKxPtgqdrf+kX6bEP1H -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0200_882_960074001C_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0200_882_960074001C_PROD.swidtag deleted file mode 100644 index cb692544..00000000 --- a/packages/verifier/src/verifier/samples/1010_0200_882_960074001C_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0YiE/zfOw1qVZ/qlCmr6qMTPL6p724Y7XIoEL9mwLK3EDgDTpIthYHaY48tHYBA12Xe7IBE8PvIr5RqZCjdJC+Mlv03ChS4bfUSCIi0UVnZdx+XJ2v+KImv3pJH0Ns75bnUGuAEODH7RLKreBnEMKwSJiDbwBllCo3ksxr9JcRE7GXsYOE1h7m1Nuu4GL29gMIICkTCCAhagAwIBAgIJAPN6uEdPC+N/MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4MzcyOVoX -DTI1MDkwNTA4MzcyOVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BHM+NvXQW4f66EBrgQsO0Da64zsRmofqzsmVHO3nppvBZ9xXfkBm0O4lbfnEXwGM -Acf0nMPqvLtfY7S6w3sOckpAqfoNrT3e82z92OEUduji0zTqJjn+s89eqsqVcM1E -+aOBmjCBlzAdBgNVHQ4EFgQU/zUWpzrk91w55TY4Y/omkntOfsEwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAMmppQYel4Mb7hvD0fkB -UIxo98A17EedtyeDqdCtgZxTXGq2/9h8H+xOcxFifrf34AIxANuseT0bsBPwbLsC -m9UxUK/rhYKA9vIoDQWBv8ce9Znu8aF7BoHfKt9KD7pSSIGE3A== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0205_862_96005E0002_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0205_862_96005E0002_PROD.swidtag deleted file mode 100644 index 13fd8c91..00000000 --- a/packages/verifier/src/verifier/samples/1010_0205_862_96005E0002_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -FSX5aR62fduY1Ds/kg4RWkUY2FU1XLcVIxW9/7m0W6iok/V5VlpKfzfdlPCS26U/CTaaa4I/ZaYawi0sHuJasIe/TIOdPKda6J1mgoVD2BF0DPAm2fjAL4GJUG0nwH7olZLcTyuxDnUcF4lRCPDHRco/wRxu7DJ6pBC8lGRvc/HLiuVrtcNNVgiK3emYDBhLMIICkDCCAhagAwIBAgIJALbEYoy3IIjuMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDYyODExMjY1MVoX -DTI1MDYyNzExMjY1MVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BBMYVl3QMkpdMyGnu+kU1vEsQXNqJx7J8VOCq+DxDDexdWdYiki/jHCvBvKkVzhX -gy9jZ5pPKFax6G1h+DWTrQW5SbTRhhOAdu5vhVXgpeGJjLYmEM5tvpqZ2vXohYLQ -caOBmjCBlzAdBgNVHQ4EFgQUO528795qhwA/TDw8wDZAyZvQcfswHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwO/M1nQfsbUqJYop/Fsfr -YDjgfRKU6qJQKSPdUfz3fkAKBRF7EIWx/vJ1fn6Ofs7DAjEA0GMtZARBgOVt0I2x -F25d7x//eiq4GLJhwfxpD5w1a9B1qXyufaCi5S4vdpuMQ1N+ -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0205_862_96005E0004_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0205_862_96005E0004_PROD.swidtag deleted file mode 100644 index 6040ecbb..00000000 --- a/packages/verifier/src/verifier/samples/1010_0205_862_96005E0004_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -rR5lO5lSfvoiAT47KAqTFu5KlA9frDfQi8AlCEmgmGHv7xTPEbdUx0BXknrNe4YEVzKdD4sqCluq9B/r5QznRfJr+B+TyRIULuKTb7lDGE/IUjgOMjeRP888SfN8/DDUBRTebPG4HDwpvwa7p9LipiaXzWGpRqykMnNavMTnJI7cRZoBBOAi8u4LICnKacGuMIICkDCCAhagAwIBAgIJAI0Go9c5gqAkMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4MzkwOVoX -DTI1MDkwNTA4MzkwOVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BO31rAlWvFv2bpvWlgUUTWGeIh6EGMragsu/ijmRuad4T4kvaWKWVLMaxjqHx+RZ -JKXFeL51qqfx9mwr77Eamqci38PyfCpb8CKhE+roHWDbdwFZAaORKiTRq9XmPf2s -BKOBmjCBlzAdBgNVHQ4EFgQUP4tzakNVQm1wIDjRu0sz4trx/towHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAMALQvp1wE3VTjD24m1B -jpkwmllzhQ19NV/5ss14BKuJdViSyBE+6p9aL+0BumSCPQIwPSZyZjIn3wfRAtAG -8Wg2MDjjK5hNF146KQMknpsAPLg2b4YK6zYdmmMhbKwhf8xR -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0205_862_960074001F_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0205_862_960074001F_PROD.swidtag deleted file mode 100644 index 47f9b3aa..00000000 --- a/packages/verifier/src/verifier/samples/1010_0205_862_960074001F_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -hHb2ycs/mFElit5zAArI49EflAWHnk+iYXiMYOAe+7jM1L5nKfNQKsty1wegSXEec51n7vRpFNVInxx2znqjKlZ9q++nKr3mJ3tiRJxn1acVZV2nbOTT0LSU9gKedMxGkJtZ+GP3WHi1e9w34ZwWWgx1ukwOHdWyW2acWGQdbWPhtVW/0WA/L2+xW6+gz9S/MIICkDCCAhagAwIBAgIJAOGtGNcZCWiPMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4NDUyMVoX -DTI1MDkwNTA4NDUyMVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BPMU0r0HdqCQC7dOz9xE3LU1J1IIf3jKn+SfhLYvd4/cvoHiEFyguXOtuOhOdyjv -dlNgaBFqArQlgAWpYKy353MlrzwgeXczcGtPWIbTpdfxzkE4C/uquFGaeaii22xd -WaOBmjCBlzAdBgNVHQ4EFgQUTBN8LzMgB54Gy3c72gTLhOBp8WYwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwVsZFImrnbORQCFe1aWkh -SFVlHjBVnCBfUH2YpZn7Ht9zNL1iAo91wZGiww7KnuqgAjEAk1uv1JDOBRpjhvYA -5nsxKKKpxPKC19jkpNP2jT4Gpa2zQeBovAQgvVqaHb8j64/x -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0205_862_9600740020_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0205_862_9600740020_PROD.swidtag deleted file mode 100644 index 57647f9a..00000000 --- a/packages/verifier/src/verifier/samples/1010_0205_862_9600740020_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -a1VWHGeU6MMvAWelsCct9wz8DIdwrzctINx6ezLJgtT2GdTLsNobc0B6YlUOElHPzOG+Mljmn6pb5V2NgwpmLaeKw+yJHe5y5uv6I5fqjNBzCUvNUWTlo1KQbCQnj2RYCnVVY3R3tNAIENcibEkbjcPE0lZ5w65sI+0IDuKvYTjFdqnqNJrV4bi5Zl4b1/mNMIICjzCCAhagAwIBAgIJAJRKMx4O80IEMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4NDY0NVoX -DTI1MDkwNTA4NDY0NVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BBSUvKDiWl9Guwta4nQ71fxfrHD2TzZJZMYLA4gYM5nPNOxXEk+Ciyhetg5N+LKU -Tzstc/TGeqO8HOS+es6OMAgJWAlWycU0J1ipM1ptXiptrbZKZBTE0niRZzaRmujZ -0KOBmjCBlzAdBgNVHQ4EFgQU0Ri2KbTrDdCKjlCV6LIuXfAn0HkwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDZwAwZAIwMjDNxe9BRf99MKJDtQQp -X+Y2BpbWz9BpUEydMzXRc9dcYul57d/K8DICLZ7dDywoAjANP3dnD96pn26nvMW/ -fc3EhXcyMWmtlYhGFX1gzpX+R6leKPnccWaQ9DVGzwgF7SY= -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0210_886_9600740011_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0210_886_9600740011_PROD.swidtag deleted file mode 100644 index 204a10d3..00000000 --- a/packages/verifier/src/verifier/samples/1010_0210_886_9600740011_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -5vvdz0oLG3lDGb/FXny8LBTN6dIlTiim9K9OPcvuq7yCR/5Pdo+/IpvFZopAArMgWRmLS7uQPjpNjcECt2fRN8esJ/dIRNBrYXb0N3UlKiecdjNGU9s5Nyho1q+TBIOc09e7SyLFaZgVVcOHN2yNIQObPfRgy2Jkhua3hfbG2tfyjn9qzmn9IXX1kskC8zecMIICkDCCAhagAwIBAgIJALH/6yq9EKJoMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4NDgwNloX -DTI1MDkwNTA4NDgwNlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BAu14VaLv80TilFSRwRjBvZF4u3wAxq/FbgVTrrqf73Q38zIjSRx20zr+RGylBEz -zMAAFxjFFa/attaPOaRB7XKueHapPhGiLEkAzabMhs4YmXTPxAoZ8vLnZAN5FOEh -KqOBmjCBlzAdBgNVHQ4EFgQUYl0yi721CeS6PD4IxpvgJZS+j14wHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAIAJs0lQfsQBXJamwQr9 -ZIT23/pkROgtp8ETPkcikSR4A7WtCWRyWgs9TBNHwnAKygIwJNCMweoGKDwCpZY0 -Y0NlsWf3BpMlJxRg3eWYbvKB/jqDRhqU9/NuYG1VEaC0Jpry -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/1010_0215_866_9600740010_PROD.swidtag b/packages/verifier/src/verifier/samples/1010_0215_866_9600740010_PROD.swidtag deleted file mode 100644 index b0d77cd3..00000000 --- a/packages/verifier/src/verifier/samples/1010_0215_866_9600740010_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ziAcwcQo/YW25TI9wYX5fvd1tgB5UpX+2iWyTtVTFhBHX875iLSP1Qx6t34d5rIxlNjbAAyFhQ+5J7Mph0K54reTSTg0TARWtIP7SpPSaz6UReuVM4U3JIZPB7yPa2NbwVuKgrwSYjy5MxU5qPVSvyXFO1Hgs4yw7rAVS6fSJQP6E2zyKCPn/quJmoJj/laqMIICkDCCAhagAwIBAgIJAM3OS/K/7JRAMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDkwNjA4NDkyNFoX -DTI1MDkwNTA4NDkyNFowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BH9Mxh0M6QgKtqmQDXh2c0k0tE4AqD2w4w/dnbSHC8Do5yavb3Q7MZN9P3i/4fIV -dgGG28sAd6uLhXcePVIjzuzccMpMnu0NR6xpFyngEb0ARDci+oqnK5HVQjPt/xAF -2qOBmjCBlzAdBgNVHQ4EFgQUUHnvIulpKheOUD7aLVsNntBueh0wHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwSXYM2tT0k7X3Ffk3VrG7 -7CIttHv+MvbzDc0sBj61kaM7FMfBtYUHEEITIbWd/v7wAjEA0FwFxZha1d9RbbJm -Hhf188oSWkIe2oy0Q8hqbaMxERzcSzqotGgf5QlnZBIAbbUf -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/Driver_RIM_test_no_gpu.swidtag b/packages/verifier/src/verifier/samples/Driver_RIM_test_no_gpu.swidtag deleted file mode 100644 index 18039cd2..00000000 --- a/packages/verifier/src/verifier/samples/Driver_RIM_test_no_gpu.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Dc2Cm4YrVzFF0G6jfhozl7+UTm2NnpghiSlxpk6icNrrB18cq5vu+Go9lytgOIfB/BgnH+hpOgo/Guc7TGvp2kYb0ORansGnr3WASK8eXA/Q4UKECnD77SnMw5w+8r2t5zujDVlGhDOxiPrzhLe5gmzpHoaMdeSVq6W94fS6MKJKlQ1/SzQwRaHuY1ywb4DWMIICkTCCAhagAwIBAgIJAMb7T2haOdWiMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDYyNzA2MTAxMloX -DTI1MDYyNjA2MTAxMlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BKwemLyTmTdJBl3zzFHdNDIjCmHrkZW4iP1V/sM3T129dwt1hbPin9MMKx+XQsWO -uZgtEEhgWnka81xw7vXdmb4i5E06iGRp/1yhhoA9EUqRlxI6DSGOrIZMuIpSRFDH -iqOBmjCBlzAdBgNVHQ4EFgQUHFrEYV9vdbATy9lk1sz/PH29L0kwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAKxWA5rGbZOiopgnuoZB -3OjZcBkwyqglB/PqQTXA0veyAI2IYwux+Os7ZouY159g7gIxAKc3RVSUOA/dyjnn -0c02JaKcbuGbpQ88a+hiEcyN7UhvNpx5Yz832zqhr/YvyGdRcQ== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/attestationReport.txt b/packages/verifier/src/verifier/samples/attestationReport.txt deleted file mode 100644 index 0c95d4c9..00000000 --- a/packages/verifier/src/verifier/samples/attestationReport.txt +++ /dev/null @@ -1 +0,0 @@ -11e001ff4cff7f5380ead8fad8ec2c531c110aca4302a88f603792801a8ca29ee151af2e001160000040c00d0001013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020133000130000b42836f56a7162e63cb7a9f3ee56b038325a9121442fa2ef34182f462816801448fa8f6798d13144a1b38be971810580301330001300033a8bbdbbdc35b9a2e8bfdc43f60f4774f99801761ff8aa1144466b1f1fccca5c32c2ccb3c4187b62f93de9a8730796b04013300013000b592ef5bbea61bad0fbccf50fb92238d913d3962dafda0ba011ee1b1b8a6f204c344ff65b33f854af212c354a27fd81a05013300013000568b89291a34cece03b12aaa352d9afe273610307525b8443e90faa78d82ecfa9c7827d8f7915c35b2fab972e108668606013300013000c9e4fe668e9dc269a4657146b5e28a22347cde18a4b0e79d8146532f27ebc386f304400ea5d4bf4159b5a6916dd4564e070133000130006850b0a82e7e77c0f51e0e6732163866003390c4eb286d8dfb26a72f711a9c8bcdf402a1fd4e5d70b97708107a785efc080133000130000e0ee161b59bf124ce6b6dca6efa7616d28077862c0e57dca7d5efd63d00eeed4851922941e846a38c464cbedbc168d9090133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a013300013000aca2223bcf9ae651634637c1b1171bc49aac88ab2970bd9039a1fdb68d08e683c261f12d43c4f9f3572c194f38ee18870b0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c013300013000ac59d04197ac1a7fe1309c73e73fb22c5ba5d1c39f2d2c3c2c7fe1e71b4ea5f1cd56eaa4d9687b2062423d863df5629a0d0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f01330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001201330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001501330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016013300013000193d75c6d4d589f86424a4c3833c6b4b195cd2b70979db1e3690e3f990749069f2f0a6a6dee12f11553a80b7b0a656a817013300013000e5b454f54132e5c7609b367e2f2b0d028ac3493c880eba2ea4bdbf1cb6c60dc674cf79155f78647f9825f03fc179171818013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000190133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0133000130005b5bb5950c5eb3e303917d25362327bb4b826d84916752b9e171c8f1f286226b0dec3f7e5339a874f202937f70388ae51b0133000130004609750c93e8646f7a4decc6dd755c0448739c70988119b5d5bc321298004579fe4fd615c30c3ec8dbfb0bcf262040d51c013300013000f304e7069e3bddcaf46a3b54b81fcd2b005356f36ff8849974ee9e1fcb84b5823c8415666ee9fcad925c79b5093c9f791d0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e01330001300003d62302b83c9503def767a6d6f8474b22d6b073e631b7b26eb21ecc849246ca1e624b1c2c976a035b85d620cd5e075f1f013300013000f98048a6125d0a77b77719ab0f2d580cd6006d78b88792b748653bf9a78eea9f381a3f123163592babc09da579d9cb8920013300013000a8fce4122577e26a073cd727c142cd03385be57921cbc1f4598933d73b65b16f1233bc263e780c20ff59f9d7e7f1af08210133000130006fc1a75621f40ba2bf8fc4e14b2c5de16cae5e3f469c936291713a795ef141964e9d0fcdf063cb4ffde6f7649209dda122013300013000198b81d9c0cefe0b33ad65de3fad238a5461d8ee32487bf70fc1926041408cb114624b8ca6b0d5fc97028b58d9cdb78d23013300013000d8dcd6aa3beb3034037ac9c8a638fe083db45642d4acddf6d11d29123f14df5f793fb99012f4dbb708d677cae1d2823024013300013000c0962ed90316ecea959dd0b6632d0c4f4d3bfbf72c4cd9031efe48154ed9ca59b41cd20ce06a7f9ca5cd8b0687cf125825013300013000e33b54c263b9bd7af1be5eafc87ead7ee0b5f952f1fd234f4ee33b5cc7b7bc0ee386f9b3fd9e9e1e159757c1d296c2e926013300013000fa713e0ac5521c42c3291e519e2e14ee3632fafb3ac2ca84fe606241757aa59d6553aeff2061077487f19a6ed1aaf49927013300013000c7ea135dca389918789454861bb593095dc44f8ad39035665daa81fa02cf6fbd3a18227b6224dced70288b9fd3161cc028013300013000a9bda9ec45593b54acdec0a14b709888867cdf2d3306f8ab3af2dd6aba4ce72ed4e9f4a99ce1079201e50636ae91ae5929013300013000f33ccbe98500aa9c70755f6a915021e2d669bee9d0295b322c56d0b22e98baf7532cb2f230929b272ef3650a7541e55a2a0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003401330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000360133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003701330001300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000390133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f013300013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400133000130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020ecb8f64dcfd50dabb760fc6a24210ba77d9f43a3a4db170a1f560283566f620106000800005e0096010000000e000400b10300000f00040038383200100002003000110005003130313000120005003032303000130002000000030007003534352e3030000400080080010000000000000c000001000000000100000004000000010000000100000001000000010000000100000000000000010000000000000082000000000000000000000000000000000000000000000000000000000000000000000000000000020000000200000000000000000000000100000001000000010000000000000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d00040000c001000b00010055f23c3889d1ecac1e082b0f59f8b498af309e22820b72dbcee7a18c2d8606fb462873c16c57698f0cf30f1b9360ff513c769f20507621678385382a19b6784f745c019441b6e96b0aaab5397d8826c27d9971f8e953b3e788b3582b1c96c38b80 \ No newline at end of file diff --git a/packages/verifier/src/verifier/samples/g520_0200_885_9600740001_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0200_885_9600740001_PROD.swidtag deleted file mode 100644 index 50ad1ff7..00000000 --- a/packages/verifier/src/verifier/samples/g520_0200_885_9600740001_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -vl2NGJ++yiZKcPN8gldnHjYCd6BnA7rgePvwexGbgHmJA7h5VrGqUCunPIqNnlao3fHyPS1ihbBmnk1BIwp2HXrHv/znmXDC2JWiZFBXRn2OSe9yZBrY35COzNSCa4kSDOhJxiocqwd0h4B6J81eMxBq/JU9cpHMcQSQzskt/KCwjo39vZAH1+GxNlvMxQ/LMIICkDCCAhagAwIBAgIJAIEy+ectRc0xMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTA5NTIwN1oX -DTI1MDgyNDA5NTIwN1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BIwhs2TMOci40E+2NzinWNWkj+ToUC5AGlRkH/uUkxK09sQNNlLFHQ5alf83IGJh -sWYX2oUgXvEi6AfhfSyArdfCy0WwL15PoT7fHQA2yty7wc0kqJJZs5oVGk8gOTG0 -t6OBmjCBlzAdBgNVHQ4EFgQUXOd1kCpMtVAnvNiJIq4k+Kh4++0wHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAIHvP27FDb+q2PfqIk0f -/axBjjn5bLaIO13wWy7R5MCQpFhV2/a6+ks6FLjnDiE5HQIwe+/7Sa2q8jlm8RaR -+IliVEfUajCaG+USID1EC+odlxs53xZnZZNpaYJMWwI0hiCA -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0200_885_960074000D_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0200_885_960074000D_PROD.swidtag deleted file mode 100644 index c80ee695..00000000 --- a/packages/verifier/src/verifier/samples/g520_0200_885_960074000D_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -MfCPu690ufidQTA4reLBONwjSBm+Uro3wLaY3reIEuZs51nEHOh6pWEJ0jUIX34u2RuncCytKjfxFm8e2Bx/+YVDTDmOPqYSsPdIXhRbJkFj7PtHXHfwgZZ+RiPlY7hyptJ10lt3oBwFCq9ro8x92jNs0/E8dHbzybWykb/sr5ii56H1YDHvjlUGBzDb3FLsMIICkDCCAhagAwIBAgIJALt1wuRzZNmSMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTA5NTUzN1oX -DTI1MDgyNDA5NTUzN1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BMRpFBWZi4qsysloZ9lD8b++VgKmOrhzyAWT7B/BTDbW0rnHAbNMN/pgdg5uz97I -6T3g6jXeWerZUV3QX+qZlZgtdKUERdSYwoG0QHSBPL8052cFcnT+84c2F9y0e705 -LaOBmjCBlzAdBgNVHQ4EFgQUxcaxGsmtwkrJ1oMDmPdZ8mivGdswHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwfL3c1HUvxxFi7Xhy+Flg -QogVHFnU+j10Huvr5ws0zrtsNRG5+JdUpEA4flacj6eAAjEAtb97hJUWrkLETU91 -qu1N0bTsopZsLthUh6eWV04QBwjLx/eFn6ds7ECgqfSbus7l -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0202_885_96006D0008_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0202_885_96006D0008_PROD.swidtag deleted file mode 100644 index 8e6e0a2f..00000000 --- a/packages/verifier/src/verifier/samples/g520_0202_885_96006D0008_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -PCzZRB7B/KT/QVSL0gvWcEVUUegg7kiUvSQgfzmTeX/Ifb7d+6rG51VAeDt3msMPpU7Y8/EiR/2eTRqXKe0wbW1Ya6jcSVgSUAOSZ1IFeo3ghEpzxDJDJrtR/GxGlpnS5G6/wChYdhI9ZNEydWgXUQwTR+U9sy8u3i7pnidRh3xF5QfWIq5xDnxigVtnnOHYMIICkDCCAhagAwIBAgIJALS1//9vKLtUMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTA5NTY1NloX -DTI1MDgyNDA5NTY1NlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BN+j5y6PkZ7uJsbfamFvu0pvxkxmJrtjKlm+KLCTfM/jrakQ+bRuCemzib00+Qeb -wcrjXpOTnwdQ/ijxuxHIFa56JDEHsVj4n8krGOUIaik+Q+YVjr898DG9GQnBwkoG -QaOBmjCBlzAdBgNVHQ4EFgQUAZo3J65fD5DNDr2rAespw6yEpOYwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAPgGRGhE5+FUGRLiay7p -yokhedwcwTbGo0TeUxb0QHSmFXWryWha7f1YYoAEGCaG5wIwE+YQgrwEFyMXlmGc -BVNmSq4XVAhi7URTiligAnFmrK/TOx2qvbK48C58S3NfVWLW -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0202_885_96006D0027_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0202_885_96006D0027_PROD.swidtag deleted file mode 100644 index 3ebe10e1..00000000 --- a/packages/verifier/src/verifier/samples/g520_0202_885_96006D0027_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -DgwvMUgiTi3CuwkS7mE2vwtFRd7az/j/IJB57DeQSgiRGaqlzjZuv0JGcQRDDLp8AexY15tuySUHh2ySTFqURHPIIir3xIr7CkvxAsOKqxx20MFT1hShC4FJRccO7jeGG8wsVUbFAwjjdbA8gQNo5MDbWGex6Q5vrrDcvub/R8Kr4RQm6sj3w7FAgZI+CNLHMIICkDCCAhagAwIBAgIJAMfgBhJFDmY/MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTA5NTg1N1oX -DTI1MDgyNDA5NTg1N1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BAbBRLR2PYDylF4COZvaGlaw3MYorWYLlOODYIhCPWF+SEGRfr0VbPiJSwgQHxfz -Atjvvkx2hqwdHB0+1jXOJcjCX65l944Isqkn1quGbRF4hBULBoDZo8C89fGGH8w6 -rqOBmjCBlzAdBgNVHQ4EFgQUXdJAlXv7pUZJJ7hHJApWSPK3QkEwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAKKKqJRGWu5NZPtskT6e -aMRPjipHffMRm8YOwx+tzGEo4aewqjo6vGiZWF6zOtlKOwIwGzGQIJ/XEZfPOoO/ -8hJGqk7pyF9psN26xwaO5uw7iEY9k4lzTLNKsoP6xIjlyX/e -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0202_885_9600740014_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0202_885_9600740014_PROD.swidtag deleted file mode 100644 index 5980b34f..00000000 --- a/packages/verifier/src/verifier/samples/g520_0202_885_9600740014_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -dvpD8XeLlrXWla9jTllsPoUgVRZDvkCLyE89E2t13GEla1ZuPgW+QE7XKPTjgHNvdHVtXl2VWNCnhqamiFqiBOJ0IzWl4Kb97avsLaqNG0bD97V0lIiSQRigoHzkhXCUNh9uqRSmmmYOTPr7V2Db6btp6YkRG8cQx97ZaoHzWurvmy6LJ3F7HadaZJ1/fOp5MIICkTCCAhagAwIBAgIJALzUFLn0/fEhMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDEwNloX -DTI1MDgyNDEwMDEwNlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BJI1cSwyC5c393ua3++0vyPbBs/x/wvX+yCCDf3N4DH9YrrH0ZntpbP/wLlR8DBL -Yu/W4WH6eAKasrbQ3dKwrq2jjYtJQfGsQ26igcxQXgwzLRoLNGv1R1CaB39HqdzB -YaOBmjCBlzAdBgNVHQ4EFgQU3Z/1H50TsIFvZEWfxOVDeb1rFCcwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAMx4N5YgDx4ZJ9Pt+AgE -/7OMkAVm3wHcqIqg9as/qQq6S6IeviFMcZ9Opy6YGVXomAIxAPQ+FkiVHdCjaW18 -Po/T05AmqnCfUycg/guDQlZskN8hpqGPlxp01VEUAIe3V8+GkA== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0202_885_9600740018_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0202_885_9600740018_PROD.swidtag deleted file mode 100644 index e4612bc8..00000000 --- a/packages/verifier/src/verifier/samples/g520_0202_885_9600740018_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -pnY4i9ONZnzX9nkKjepqcJiPBsQKt+8t7giiT7zdHY6Ey8hK5YgTvb+UjP22okhgtne17FuDIQz3e/Hyo6K76wu9Qq/J49STWqE1O9cZfLDYp3qTdk4VEpzLoSfgTZ/yyZz4GW53We1G+jhiZ4h5ezDZm01lxmwHavEshj1T+3SrafJN1vTgsQNsFKu5PqYCMIICkDCCAhagAwIBAgIJAIZOAwrj/8+/MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDM0OFoX -DTI1MDgyNDEwMDM0OFowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BAKRqSccYOYnmtzdvlNIOz2FjPnloxTMCm1CF3MrtF/Q/w28wbLch4hHqUpDG2Ek -H7evuUX+JXKDntEvgnnJeNJKSxAbNHgjnEdHPyFomu4pwAJx3D5JnZYWvuWuhKRX -uKOBmjCBlzAdBgNVHQ4EFgQUNmlQji6q6f3HGyZyjo9LfDlDmPMwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwCalNt/ns7zEE9x918uCm -pCIvPuHs+F29uWJf+VDqfqUDDg7Sl0syRoZ0RBHXoEkCAjEA6j3rU+JfwdNo06xa -UiU8GYrv5PW19nntqWxjLclw2Mu+gd+kD1U3btQYKedN61jo -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0205_865_9600740006_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0205_865_9600740006_PROD.swidtag deleted file mode 100644 index 8d89a206..00000000 --- a/packages/verifier/src/verifier/samples/g520_0205_865_9600740006_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -NZ0U6sdh0iqNDKwj+b1lBH/IBn8Fj50XQZ6UHOTqb3zXNo/Ad0XDMXE4P5vuM2Anak0HPsTyvaUUwggntzSkYn4KdHKVvczQ0Lh0OfCtRcXT2PsjzcV8YloVYfMmQZaOfvUm5Tj9izEYZ+qH0VOGT0ujdAuen+tpHHGbUQIALdJk7Y5tB9i312Y38xeEo3rGMIICkDCCAhagAwIBAgIJAKZWsrZCPWGZMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDUwM1oX -DTI1MDgyNDEwMDUwM1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BLXaGRCJnzgECT1/7/ahzW+pZguNV9zT/fwZxI6cJZ0mRPmiCE4b1s0/c/V9YJ2y -KEziRTAYGf/GK96QctOodPRJ0yrGl71TV1ZihCJyApxaHeW4ENq9oRsvWb36Vm7D -jqOBmjCBlzAdBgNVHQ4EFgQUev5S9smnfpKbhdcazqOFzEgefbowHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIxAMeOlO0hxjcLLVXlr/nP -G1koeTsO4aOZsmeRiKfKoNBAIVftCVAopaX0r73XfL6HJQIwI0yeZhS88dLiNRoF -mS3V6cs4GRX9oyjS4K5vkzsOEbq4YaqDCt41HhdBw6Ny43u9 -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0205_865_960074000F_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0205_865_960074000F_PROD.swidtag deleted file mode 100644 index 68a5e063..00000000 --- a/packages/verifier/src/verifier/samples/g520_0205_865_960074000F_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -2oRYO+fpoDHBUK1bNFaajn6Qz26xkQLKcWrCaf9/gZM/cb8AJ4asF6ygA0syfBuOX2Gqwuw0Y5vCPjlKn5dYo3zlf9lH9EhhM+Rx/LLqS/OJcgtEALRxd8+CRZG7vizdrbn45SwxMBCwkxZleBgn6sitNg/WT5F2Gu0KaZpURd4zc3l9JplqhyAdu2T0MfvtMIICkTCCAhagAwIBAgIJAOkOTaq+18QPMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDYwNVoX -DTI1MDgyNDEwMDYwNVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BJcUGf1Ct51kynl+CO6OdYPuuAd1xsiagsi4qEbb63T4vDbb9KuCSXZD1dXA1ZLQ -Gd8fDvEzvgFlHoSbKo/c/nAIwD6/d5WGsQhNoDnq+1Z4Q2CQLmiF8k4xVDo3Wtg+ -faOBmjCBlzAdBgNVHQ4EFgQUKxp9m3S5joWps41xx8Rgr9Yd3XswHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAKG98xNbEVuJrFNZMR2i -ll9T1MkNKV1Xyhwm/QQ2YWJ/kc8+1f2XZhaP+wNucKDdtAIxAIwKujPk+G/8Uiyg -6q281khH4e4VjMi1m80NKPPL7X+v8gl1i10kJjHJWOWUGjm+kg== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0207_865_9600740015_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0207_865_9600740015_PROD.swidtag deleted file mode 100644 index 5175d452..00000000 --- a/packages/verifier/src/verifier/samples/g520_0207_865_9600740015_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -nxT6Ux6VE0U0Okalv0mF12F7mS+Rh69iVgNl+KMFrPbGnWjO6kgMWDL6TPKgZx9g5Co/PT9ek7dxPvw3Rpn3/cGOgVsDx2yX7uE3ofu/Iz9macfu98J1bQtBXnk/qdAq7Ve3c57WDHmU89b0nH1ItXchhVzdBKhAJXXMflnx4BdDF/CZJy0Irv4uW+QY2VsIMIICjzCCAhagAwIBAgIJAIEl27n47u/6MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDcwOFoX -DTI1MDgyNDEwMDcwOFowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BBj5GVBwlwgcC5NAfYKCSO315VJAv6oz+Mz++wYIdeGWy2Vk8UFD7QE8FhHaFa/Q -Bon3Qajm2rZl4sEy5O8z/5FMR36YQtjf5ZwL+rASCGSJCsNng00ACsSpVt+vGWZ/ -GaOBmjCBlzAdBgNVHQ4EFgQUYy9E1hDiP1+UEEHKYnTBuiqpNWIwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDZwAwZAIwEwMdQxSX/YqJFjW4xv4m -JZD0tzXVZSeZmb572CqQLFo35THP2r/FSg8cpmm0q4J6AjBH3AqdMilakh+EWHJ0 -0wE0Rg2RMnvYv6tUQ57e3o2K4wgdRF7UEgK8YK8TlUsdczM= -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0207_865_9600740019_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0207_865_9600740019_PROD.swidtag deleted file mode 100644 index 61803c9d..00000000 --- a/packages/verifier/src/verifier/samples/g520_0207_865_9600740019_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -gp9I4n62hFp6/D1UIM+Z3JwrLOW1dCIusZYvzg/qdrO3qM7aAkthE3ckj/J0HCmknhZ4ldRoSgJ9ndH+q7AyuBYhvDNLIAb4QcVa7oBIOUrFzYGU8X0g20BT1cHxAhHnkm6WdioPKsKAZ1wW15ySI/bf7m8Fefu5xAv3DTFn8wepUsKtCAkZBKsD/5IKxwrXMIICkDCCAhagAwIBAgIJAJR2gQV1JoX6MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDgyNloX -DTI1MDgyNDEwMDgyNlowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BNAozXN4nqXXGBc7LPGw5Zjtg5Bd/Ck7TORzMrEwIebcrUZgKj5IePJRXHwyXN/9 -NpZIabjb/8RxBaGmDgujpGw8PoYEU4gUC4IYMqHNT+pupjsYXX3kHz9Yuy4QNJ98 -FKOBmjCBlzAdBgNVHQ4EFgQUydoFWMqD5P5hF0fhXKHEq23tzz4wHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwfGetrZnraXZvXOl+kAea -6ly6MANsI+OGZw/Tb0lh78Qy8A0wA8NlChx7ElB5Jm/0AjEAqrOZTXcmu65yRkuq -kfsNXB8/HqJFaWT56b/4Q/GZeDgkvNdYukw7NJxSSy23MelX -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0213_881_96006D0007_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0213_881_96006D0007_PROD.swidtag deleted file mode 100644 index 1c507bea..00000000 --- a/packages/verifier/src/verifier/samples/g520_0213_881_96006D0007_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ra5qm50Tx4dLmLJbnmCB7uGxF9Q8FSWzl/oAJI37YsyOBsxUjiaxDMhGEPYqAlxL74c1iuIrEORW2WmnsegMG65OQEWAs8xBovUAI0If9BIll2krmgCITFh0rW/vhAgwsAxfSQ3W18o0trAoc2xm5/bsUbrXtn3xquUo6in/FOLqW05qVkWk/LEhidPb5depMIICkTCCAhagAwIBAgIJALhisF5Lp6/5MAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMDk0N1oX -DTI1MDgyNDEwMDk0N1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BJjL5zJStCOh9dtR5/EosogT/9+yo7UmlIiOc195KihdmG/BcyDJ0hpiNP/2tUmp -hTqF4zBpw47VdSAVPNURsXY9gLF1V2L/0VTYanQfOGv7fB4fey4QmdoDBG1XV7xj -GqOBmjCBlzAdBgNVHQ4EFgQUVZRLNx7m0JglKr22YQlfLjdFmuwwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAMezcIbcXb2cmz7dsL62 -lZMFlKFaXmAAiGBvmHObQMAZcv3ovI/wM1a+b37Ie10u5wIxALHMsZfuAE5iIwhb -F8KscyqAeiTAtSrZxUb+bmuZGOWDkJsJZSnBVf7BBv2mugONLQ== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0213_881_96006D0026_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0213_881_96006D0026_PROD.swidtag deleted file mode 100644 index 26afdafb..00000000 --- a/packages/verifier/src/verifier/samples/g520_0213_881_96006D0026_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -qLba0X3oPlU7fiJ3vZvcxk372q/il1GtyPc8VjDpyEFg1rJj1tYV8RJct0KlQFQKV/MmQSJsOYrt5q6Os55hejkGb49tdoGLyLXio5z6ZvL7BW15L06kx/QgJU9hgalE35h/7MRiSy5pUbCA3Ml79cYn+CqkpiNM95zdV4oDcyaOMLgAgk60rDcdjqa5YXvtMIICkTCCAhagAwIBAgIJAKrhnR4QVruWMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMTE1M1oX -DTI1MDgyNDEwMTE1M1owaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BNqtGalAUdd5a/EK/anlfaJT2Bt121HLQppcV/PkJbI2DGK6ofygjgJ1e3yqa5OI -J3y6TUNe2oma0gicFlMe5pLxxTzf7E3TVZprgB29qtCSRv9/BioDG/pYb7WXZ/Jt -06OBmjCBlzAdBgNVHQ4EFgQU1CNyTOxRDykuUGA16dAicMP20JkwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxAJnpngs78OQLqREnACNO -28wDc2zZUiM7uVDM4TBTCP0xUsmjK4agQZ+KOJ1lEga+kQIxAO1RCGwQzUIWgknO -H24n4dDt5G31ptL3faBobovr5SWoNbveyc0O+nqSCTcZkHlp3g== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0228_889_96006D000A_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0228_889_96006D000A_PROD.swidtag deleted file mode 100644 index 97d69694..00000000 --- a/packages/verifier/src/verifier/samples/g520_0228_889_96006D000A_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/PynYXCmAe9rveM65u+tQG6n33CrTF96xxN8ZY23bFcyRXVcWazf3NqJyLWv4wZuwu1ffV8UedH3NfLXvN6ui0QFEowuCEkLnmGzwnseZ3OGW2vS6/JUEKwwRDS+zjEWlgnVvpmdvViZoerb/oapgkqc2bwHnWqT8SsFiNiiIGKKOdn8mtQUf6L4Vq4zO9HCMIICkDCCAhagAwIBAgIJAKT+LRDh4z0bMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMTMwNVoX -DTI1MDgyNDEwMTMwNVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BD0pQL21pDtQxr/BAcneshnH9DD4Pi61AHNw+i9n7aahVkRr961t3YwdPH8ZOl2e -8JQgzoAWs/BwO0DzfeLbZw6VteYpHtzzRs9tmQLpnklhVBGI+EmHh7jwp+3sPohY -UaOBmjCBlzAdBgNVHQ4EFgQUBFPPwqLoU64A+zWQlCU21Yo1wXgwHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaAAwZQIwZWDiaeMuPSCC1/1vkGHk -oTBbjW1pkHDlDGAkevSDdOQ2U+7ZQ29B6hZWrmeegShaAjEAs7DFV70M61bxGmYE -EM+6dRLvSVrasDlGe43U01tgSO5CY5UYu0OggehnW4yTjyoj -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/g520_0228_889_96006D0029_PROD.swidtag b/packages/verifier/src/verifier/samples/g520_0228_889_96006D0029_PROD.swidtag deleted file mode 100644 index 36c615ec..00000000 --- a/packages/verifier/src/verifier/samples/g520_0228_889_96006D0029_PROD.swidtag +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -xeWZXOW5IUmbzwzbUruDzJk7KZH7Hz9MIvIvaGXAL4QFVFBE01z4OIwYnGf+2ujjCI2y4wuX9/Yx8bCEpStuQ6P9u4xCQQ8pPH5V4Ax+ea8Z0Q/M7Pfc0N/l0x3kMp1FAo78J5C3RrfBq1z9pGCsES/IbrRMLS+C+YSB7Q2DO0LL85hLINOs2Z2deWdRoovhMIICkTCCAhagAwIBAgIJAOvRAF1pAYQFMAoGCCqGSM49BAMDMFgxLDAqBgNVBAMM -I05WSURJQSBSZWZlcmVuY2UgVmFsdWUgTDMgR0gxMDAgMDAxMRswGQYDVQQKDBJO -VklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMB4XDTIzMDgyNTEwMTQ0OVoX -DTI1MDgyNDEwMTQ0OVowaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYD -VQQHDAtTYW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRow -GAYDVQQDDBFIQ0MgUklNIEw0IFNpZ25lcjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BLwFKqv6BBU65Asl+p0ECEu0CiFZcROdwLTUmPsdK4NG/baNe1eV+qsN0J4YYKmW -BOqpqWogVe/NxJj7S5ACYLTEV6L+jHmkgEDrKjAOMTd/DzOnrl87KL5jCarPegRs -QqOBmjCBlzAdBgNVHQ4EFgQUNw/WvuIy3JDh7QNbGhoiUCvVGi4wHwYDVR0jBBgw -FoAUlztut8tmJnBV0fW+264l51Apvv8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E -BAMCB4AwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5u -ZGlzLm52aWRpYS5jb20wCgYIKoZIzj0EAwMDaQAwZgIxALP6PSl9uolvwV8UL8+l -pUAnf8rKNzDbvLlc1z44oRMQQjS7csqgGx10qi31wfT+iwIxAJMCjeJj+u9tMQ08 -cmWJ0dwTez03O1c3PDqbq4vdc2JyfOeUCuaX71dCimBQZiiPfQ== -MIICjTCCAhOgAwIBAgIRAKXroHMhM+3qQieiW6IFoq4wCgYIKoZIzj0EAwMwVDEo -MCYGA1UEAwwfTlZJRElBIFJlZmVyZW5jZSBWYWx1ZSBHSDEwMCBDQTEbMBkGA1UE -CgwSTlZJRElBIENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAiGA8yMDIzMDUxMTAw -MDAwMFoYDzIwMjYxMTExMjM1OTU5WjBYMSwwKgYDVQQDDCNOVklESUEgUmVmZXJl -bmNlIFZhbHVlIEwzIEdIMTAwIDAwMTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMQswCQYDVQQGEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABD19aF1SON2S -SVTsFYCXj+WYbjPsU/UovcL/uKLWRjOE9tfK3HrZyxLjU7qbZKclDC+Ch2AJrLr9 -U+v75bb4sC5eeHXYsUmfhJOXfxqSrEG4/t5Mi5em3kbNoI0GjRc9iaOBoDCBnTAS -BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjA3BggrBgEFBQcBAQQr -MCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNV -HQ4EFgQUlztut8tmJnBV0fW+264l51Apvv8wHwYDVR0jBBgwFoAUSAKyVhbaVTvi -US2VLIR0Eb0hSR4wCgYIKoZIzj0EAwMDaAAwZQIxAO2ZmDEvQpHXpP6kQrI274Lt -0hE6qjEDn2T6BmLDOOToGbPyHN1NwIx86s2n/Kz40QIwayhtlR2XFAaitRNLKony -U8ZFS5H2Rlr87W9MXE8y+fnd5QdNW+jR2SD4w8UKo3kM -MIICtjCCAj2gAwIBAgIRAMbb8HVAk/3rQzPzS6IFtNwwCgYIKoZIzj0EAwMwRTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoMBk5WSURJQTElMCMGA1UEAwwcTlZJRElBIENv -UklNIHNpZ25pbmcgUm9vdCBDQTAiGA8yMDIzMDUxMTAwMDAwMFoYDzIwMzMwNTEx -MjM1OTU5WjBUMSgwJgYDVQQDDB9OVklESUEgUmVmZXJlbmNlIFZhbHVlIEdIMTAw -IENBMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAE6MvYfXMUKpnwOzSekWURMhfUElTSVYuPvWYk -YigX80PbCrLiUn0qyZFPUz/ML3XfF5j7kyHL/iS+PyjCCoVfQxcsu88dCINmpZGJ -AmslahaoEjEaY6MTBE1RBNX87Idio4HdMIHaMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwubmRpcy5u -dmlkaWEuY29tL2NybC1jb3JpbS9sMS1jb3JpbTA3BggrBgEFBQcBAQQrMCkwJwYI -KwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4EFgQU -SAKyVhbaVTviUS2VLIR0Eb0hSR4wHwYDVR0jBBgwFoAUpaXrOPK4ZDAk08DBskn5 -94zeZjAwCgYIKoZIzj0EAwMDZwAwZAIwdLJWExyUrDOLg5saKWUpaT4QEtPkN4t2 -xBgmwdTHRVQT87YnveETSm5vbkxAOrShAjBwqridyKKyGloo5kt1FXXT9zLv/5h8 -6JTnNQeWvLbT2Q4xcrTQp+wfd8HlzH8dcuA= -MIICKTCCAbCgAwIBAgIQRdrjoA5QN73fh1N17LXicDAKBggqhkjOPQQDAzBFMQsw -CQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxOVklESUEgQ29S -SU0gc2lnbmluZyBSb290IENBMCAXDTIzMDMxNjE1MzczNFoYDzIwNTMwMzA4MTUz -NzM0WjBFMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGTlZJRElBMSUwIwYDVQQDDBxO -VklESUEgQ29SSU0gc2lnbmluZyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACID -YgAEuECyi9vNM+Iw2lfUzyBldHAwaC1HF7TCgp12QcEyUTm3Tagxwr48d55+K2VI -lWYIDk7NlAIQdcV/Ff7euGLI+Qauj93HsSI4WX298PpW54RTgz9tC+Q684caR/BX -WEeZo2MwYTAdBgNVHQ4EFgQUpaXrOPK4ZDAk08DBskn594zeZjAwHwYDVR0jBBgw -FoAUpaXrOPK4ZDAk08DBskn594zeZjAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwCgYIKoZIzj0EAwMDZwAwZAIwHGDyscDP6ihHqRvZlI3eqZ4YkvjE -1duaN84tAHRVgxVMvNrp5Tnom3idHYGW/dskAjATvjIx6VzHm/4e2GiZAyZEIUBD -OKPzp5ei/A0iUZpdvngenDwV8Qa/wGdiTmJ7Bp4= - diff --git a/packages/verifier/src/verifier/samples/gpuAkCertChain.txt b/packages/verifier/src/verifier/samples/gpuAkCertChain.txt deleted file mode 100644 index 61e1a288..00000000 --- a/packages/verifier/src/verifier/samples/gpuAkCertChain.txt +++ /dev/null @@ -1,82 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDfTCCAwKgAwIBAgIUUJSMcj/JNce9FLfCKDPfvh39EUUwCgYIKoZIzj0EAwMw -ZDEbMBkGA1UEBRMSNDFGRkVFQjIwMDA5RTBCRTQ5MQswCQYDVQQGEwJVUzEbMBkG -A1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRswGQYDVQQDDBJHSDEwMCBBMDEgR1NQ -IEJST00wIBcNMjAxMDE3MDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMHwxMTAvBgNV -BAUTKDUwOTQ4QzcyM0ZDOTM1QzdCRDE0QjdDMjI4MzNERkJFMURGRDExNDUxCzAJ -BgNVBAYTAlVTMRswGQYDVQQKDBJOVklESUEgQ29ycG9yYXRpb24xHTAbBgNVBAMM -FEdIMTAwIEEwMSBHU1AgRk1DIExGMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE87EQ -l/70Kw9v7bl6bj96AqtCVQjTqY8uIZJDliR3p8x3nBjXBasFZpIjqhyknXMtui7d -MOZLCfXBcIU+ijm07eGlr/taVZz5kXodqfGP/mEd0ITQ8nsNPKGw7YxqktqAo4IB -WTCCAVUwDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBRQlIxyP8k1x70Ut8IoM9++ -Hf0RRTAfBgNVHSMEGDAWgBRqU+dW+wkbjAG9bgPFprQYZjtGAzA4BgNVHREEMTAv -oC0GCisGAQQBgxyCEgGgHwwdTlZJRElBOkdIMTAwOjQ4QjAyREI3M0U1MjEzN0Uw -gcgGBmeBBQUEAQSBvTCBugIBATB2MBAGByqGSM49AgEGBSuBBAAiA2IABNg+BBg7 -7egGAxW208qskTOgjr/UFODf2Pk7AYQxfZBBBPTPMo9vEJ16RLXO0xR1uBYC7KAo -45Nm1MG0HEfJe+ewvO1r2VBTcs02qUcHmphmk2zfMl5ov9xXN9w7r0aZrTA9Bglg -hkgBZQMEAgIEMIDkj058j/jyaBvJDPtwGHGQScx+SI3XaWL6C/YKL1aopNHemA+H -I2FYw7URnGgX9zAKBggqhkjOPQQDAwNpADBmAjEAkxuRLd0UZtDYi3K7XTIAQxFI -LY0v6B5H0bStZ/L6lrIdasvQuudkfiwJ9/PTPtVHAjEAt3kmDccCM0SbRDiP21zT -OfDgrn8KH9RXZG4dlK6CPYSwJ/9Z+TL0NLkenqU+PsLP ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICUDCCAdagAwIBAgIJQf/usgAJ4L5JMAoGCCqGSM49BAMDMFMxJzAlBgNVBAMM -Hk5WSURJQSBHSDEwMCBQcm92aXNpb25lciBJQ0EgMTEbMBkGA1UECgwSTlZJRElB -IENvcnBvcmF0aW9uMQswCQYDVQQGEwJVUzAgFw0yMDEwMTcwMDAwMDBaGA85OTk5 -MTIzMTIzNTk1OVowZDEbMBkGA1UEBRMSNDFGRkVFQjIwMDA5RTBCRTQ5MQswCQYD -VQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMRswGQYDVQQDDBJH -SDEwMCBBMDEgR1NQIEJST00wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATYPgQYO+3o -BgMVttPKrJEzoI6/1BTg39j5OwGEMX2QQQT0zzKPbxCdekS1ztMUdbgWAuygKOOT -ZtTBtBxHyXvnsLzta9lQU3LNNqlHB5qYZpNs3zJeaL/cVzfcO69Gma2jYzBhMA8G -A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBRqU+dW+wkb -jAG9bgPFprQYZjtGAzAfBgNVHSMEGDAWgBQpaMsWLNB3lXKieRAD5p66DMwKlDAK -BggqhkjOPQQDAwNoADBlAjAvee7XGa4o6bO9ozPaWz+YMVRym1MWSmULzItF62r8 -+ZwncqYevnuqQ9Xv1GrD8oECMQCSlsvY3srCvnlRov3YEYNn30BddSAE82Y9x43G -cBTQOh9mASr0YgdaK41l5COFq5I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICqjCCAi+gAwIBAgIQav5xhPkiMsjfeyQiYXduVjAKBggqhkjOPQQDAzA9MR4w -HAYDVQQDDBVOVklESUEgR0gxMDAgSWRlbnRpdHkxGzAZBgNVBAoMEk5WSURJQSBD -b3Jwb3JhdGlvbjAgFw0yMjAzMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUzEn -MCUGA1UEAwweTlZJRElBIEdIMTAwIFByb3Zpc2lvbmVyIElDQSAxMRswGQYDVQQK -DBJOVklESUEgQ29ycG9yYXRpb24xCzAJBgNVBAYTAlVTMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEzUdWqjn1OlXhLfFOKAFTghqG+Q3zF4xgSBbZsUEyWYCC3rKjE9Nn -o88ZpBQx85Oo0PkqP2dwoMVNTQMv5cvy9jLaTvSTXZwN2HQHE9u7x7BIYrWi0sG3 -5q1IJNSOGO5Lo4HbMIHYMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwubmRpcy5udmlkaWEuY29tL2Ny -bC9sMi1naDEwMC5jcmwwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRw -Oi8vb2NzcC5uZGlzLm52aWRpYS5jb20wHQYDVR0OBBYEFCloyxYs0HeVcqJ5EAPm -nroMzAqUMB8GA1UdIwQYMBaAFAdCoOsDnIBge6FBYZlNriX3wpseMAoGCCqGSM49 -BAMDA2kAMGYCMQDK0BCr49DNJ48Yh5wu388bZifDFxAsiUS4U1fGmpJZFhCbODH6 -mRwcMxp6EOayZuYCMQDYKTyNc2FxWFuhHtdCE3ls4S7SInehdErTZNuhFymc4YOM -6VlLWTY/CM+resjjqxQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICijCCAhCgAwIBAgIQTCVe3jvQAb8/SjtgX8qJijAKBggqhkjOPQQDAzA1MSIw -IAYDVQQDDBlOVklESUEgRGV2aWNlIElkZW50aXR5IENBMQ8wDQYDVQQKDAZOVklE -SUEwIBcNMjIwMTEyMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMD0xHjAcBgNVBAMM -FU5WSURJQSBHSDEwMCBJZGVudGl0eTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0 -aW9uMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+pg+tDUuILlZILk5wg22YEJ9Oh6c -yPcsv3IvgRWcV4LeZK1pTCoQDIplZ0E4qsLG3G04pxsbMhxbqkiz9pqlTV2rtuVg -SmIqnSYkU1jWXsPS9oVLCGE8VRLl1JvqyOxUo4HaMIHXMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwu -bmRpcy5udmlkaWEuY29tL2NybC9sMS1yb290LmNybDA3BggrBgEFBQcBAQQrMCkw -JwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAdBgNVHQ4E -FgQUB0Kg6wOcgGB7oUFhmU2uJffCmx4wHwYDVR0jBBgwFoAUV4X/g/JjzGV9aLc6 -W/SNSsv7SV8wCgYIKoZIzj0EAwMDaAAwZQIxAPIQhnveFxYIrPzBqViT2I34SfS4 -JGWFnk/1UcdmgJmp+7l6rH/C4qxwntYSgeYrlQIwdjQuofHnhd1RL09OBO34566J -C9bYAosT/86cCojiGjhLnal9hJOH0nS/lrbaoc5a ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCzCCAZCgAwIBAgIQLTZwscoQBBHB/sDoKgZbVDAKBggqhkjOPQQDAzA1MSIw -IAYDVQQDDBlOVklESUEgRGV2aWNlIElkZW50aXR5IENBMQ8wDQYDVQQKDAZOVklE -SUEwIBcNMjExMTA1MDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMDUxIjAgBgNVBAMM -GU5WSURJQSBEZXZpY2UgSWRlbnRpdHkgQ0ExDzANBgNVBAoMBk5WSURJQTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABA5MFKM7+KViZljbQSlgfky/RRnEQScW9NDZF8SX -gAW96r6u/Ve8ZggtcYpPi2BS4VFu6KfEIrhN6FcHG7WP05W+oM+hxj7nyA1r1jkB -2Ry70YfThX3Ba1zOryOP+MJ9vaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwHQYDVR0OBBYEFFeF/4PyY8xlfWi3Olv0jUrL+0lfMB8GA1UdIwQY -MBaAFFeF/4PyY8xlfWi3Olv0jUrL+0lfMAoGCCqGSM49BAMDA2kAMGYCMQCPeFM3 -TASsKQVaT+8S0sO9u97PVGCpE9d/I42IT7k3UUOLSR/qvJynVOD1vQKVXf0CMQC+ -EY55WYoDBvs2wPAH1Gw4LbcwUN8QCff8bFmV4ZxjCRr4WXTLFHBKjbfneGSBWwA= ------END CERTIFICATE----- diff --git a/packages/verifier/src/verifier/utils/__init__.py b/packages/verifier/src/verifier/utils/__init__.py deleted file mode 100644 index 4f53ede3..00000000 --- a/packages/verifier/src/verifier/utils/__init__.py +++ /dev/null @@ -1,247 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -import queue -from queue import Empty -from threading import ( - Thread, - Event, -) - -from cryptography import x509 -from cryptography.hazmat.primitives import serialization - -from verifier.config import ( - event_log, - info_log, - BaseSettings, - __author__, - __copyright__, - __version__, -) - -from verifier.exceptions import ( - UnknownGpuArchitectureError, - TimeoutError, -) - - -def get_gpu_architecture_value(nvml_arch_value): - """A function to map the NVML architecture integer value to the - corresponding architecture name. - - Args: - nvml_arch_value (int): nvml architecture integer value. - - Raises: - UnknownGpuArchitectureError: it is raised if the given value does not - correspondes to any known GPU architecture. - - Returns: - [str]: The corresponding the GPU architecture name. - """ - if nvml_arch_value == 2: - return "KEPLER" - elif nvml_arch_value == 3: - return "MAXWELL" - elif nvml_arch_value == 4: - return "PASCAL" - elif nvml_arch_value == 5: - return "VOLTA" - elif nvml_arch_value == 6: - return "TURING" - elif nvml_arch_value == 7: - return "AMPERE" - elif nvml_arch_value == 9: - return "HOPPER" - else: - event_log.error("Unknown GPU architecture.") - raise UnknownGpuArchitectureError("Unknown GPU architecture.") - - -def read_field_as_little_endian(binary_data): - """Reads a multi-byte field in little endian form and return the read - field as a hexadecimal string. - - Args: - binary_data (bytes): the data to be read in little endian format. - - Returns: - [str]: the value of the field as hexadecimal string. - """ - assert type(binary_data) is bytes - x = str() - - for i in range(len(binary_data)): - temp = binary_data[i : i + 1] - x = temp.hex() + x - - return x - - -def convert_string_to_blob(inp): - """A function to convert the input string of byte values to bytes data type. - - Args: - inp (str): the input string - - Returns: - [bytes]: the corresponding binary data. - """ - assert type(inp) is str - - out = inp.replace(" ", "") - out = out.replace("\n", "") - out = out.replace("0x", "") - out = out.replace("\\x", "") - out = bytes.fromhex(out) - return out - - -def extract_public_key(certificate): - """Reads the leaf certificate of GPU and then extract the public key. - - Args: - certificate (cryptography.hazmat.backends.openssl.x509._Certificate): - the gpu leaf certificate as an cryptography x509 object. - - Returns: - [bytes]: the public key extracted from the certificate in PEM format. - """ - assert isinstance(certificate, x509.Certificate) - public_key = certificate.public_key() - public_key_in_pem_format = public_key.public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo, - ) - return public_key_in_pem_format - - -def is_zeros(x): - """This function checks if all the character are zeros of the given input - string. - - Args: - x (str): the input string. - - Returns: - [bool]: True if all the characters are '0', otherwise False. - """ - assert type(x) is str - - for i in range(len(x)): - if x[i] != "0": - return False - - return True - - -def format_vbios_version(version): - """Converts the input VBIOS version to xx.xx.xx.xx.xx format. - - Args: - version (bytes): the VBIOS version - - Returns: - [str]: the vbios version in the required format. - """ - assert type(version) is bytes - - value = read_field_as_little_endian(version) - temp = value[len(value) // 2 :] + value[len(value) // 2 - 2 : len(value) // 2] - - idx = 0 - result = str() - for i in range(0, len(temp) - 2, 2): - result = result + temp[i : i + 2] + "." - idx = i + 2 - result = result + temp[idx : idx + 2] - - return result - - -def function_caller(inp): - """This function is run in a separate thread by - function_wrapper_with_timeout function so that if the execution of the - function passed as an argument takes more than the max threshold time limit then - the thread is killed. - - Args: - inp (tuple): the tuple containing the function to be executed and its - arguments. - """ - assert type(inp) is list - - event = inp[-1] - q = inp[-2] - function_name = inp[-3] - function = inp[0] - arguments = inp[1:-3] - - result = function(*arguments) - - if event.is_set(): - event_log.info(f"{function_name} execution timed out, stopping.") - return - - q.put(result) - - -def function_wrapper_with_timeout(args, max_time_delay): - """This function spawns a separate thread for the given function in the - arguments to be executed in that separate thread. - - Args: - args (list): the list containing the function and its arguments. - - Raises: - TimeoutError: it is raised if the thread spawned takes more time than - the threshold time limit. - - Returns: - [any]: the return of the function being executed in the thread. - """ - assert type(args) is list - try: - function_name = args[-1] - q = queue.Queue() - args.append(q) - event = Event() - args.append(event) - args = ((args),) - event_log.info(f"{function_name} called.") - thread = Thread(target=function_caller, args=args) - thread.start() - return_value = q.get(block=True, timeout=max_time_delay) - event.set() - return return_value - except Empty: - event_log.error(f"The {function_name} call timed out.") - raise TimeoutError(f"The {function_name} call timed out.") diff --git a/packages/verifier/src/verifier/utils/claims_utils.py b/packages/verifier/src/verifier/utils/claims_utils.py deleted file mode 100644 index 2fcc56a8..00000000 --- a/packages/verifier/src/verifier/utils/claims_utils.py +++ /dev/null @@ -1,163 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -import hashlib -from datetime import datetime, timedelta, timezone -import os -import secrets -import string -import uuid -from urllib import request -from urllib.error import HTTPError -import json -import base64 -import jwt - -from verifier.attestation import AttestationReport -from verifier.config import ( - BaseSettings, - info_log, - event_log, -) - - -class ClaimsUtils: - """A class to provide the required functionalities for claims related utility functions""" - - @staticmethod - def get_current_gpu_claims(settings, gpu_uuid: string = ""): - """ - Method to translate GPU Attestation results to Claims object - Args: - settings: Hopper Settings object - gpu_uuid: UUID of the GPU - """ - claims = { - "measres": settings.check_if_measurements_are_matching(), - "x-nvidia-gpu-arch-check": settings.check_if_gpu_arch_is_correct(), - "x-nvidia-gpu-driver-version": settings.check_gpu_driver_version(), - "x-nvidia-gpu-vbios-version": settings.check_gpu_vbios_version(), - "x-nvidia-gpu-attestation-report-cert-chain-validated": settings.check_if_gpu_attestation_report_cert_chain_validated(), - "x-nvidia-gpu-attestation-report-parsed": settings.check_if_attestation_report_parsed_successfully(), - "x-nvidia-gpu-attestation-report-nonce-match": settings.check_if_nonce_are_matching(), - "x-nvidia-gpu-attestation-report-signature-verified": settings.check_if_attestation_report_signature_verified(), - "x-nvidia-gpu-driver-rim-fetched": settings.check_if_driver_rim_fetched(), - "x-nvidia-gpu-driver-rim-schema-validated": settings.check_if_driver_rim_schema_validated(), - "x-nvidia-gpu-driver-rim-cert-validated": settings.check_if_driver_rim_cert_validated(), - "x-nvidia-gpu-driver-rim-signature-verified": settings.check_if_driver_rim_signature_verified(), - "x-nvidia-gpu-driver-rim-measurements-available": settings.check_rim_driver_measurements_availability(), - "x-nvidia-gpu-vbios-rim-fetched": settings.check_if_vbios_rim_fetched(), - "x-nvidia-gpu-vbios-rim-schema-validated": settings.check_if_vbios_rim_schema_validated(), - "x-nvidia-gpu-vbios-rim-cert-validated": settings.check_if_vbios_rim_cert_validated(), - "x-nvidia-gpu-vbios-rim-signature-verified": settings.check_if_vbios_rim_signature_verified(), - "x-nvidia-gpu-vbios-rim-measurements-available": settings.check_rim_vbios_measurements_availability(), - "x-nvidia-gpu-vbios-index-no-conflict": settings.check_if_no_driver_vbios_measurement_index_conflict(), - } - if settings.check_if_measurements_are_matching() == "success": - claims["secboot"] = True - claims["dbgstat"] = "disabled" - return claims - - def get_overall_claims(nonce): - overallAttestationToken = {} - overallAttestationToken["sub"] = "NVIDIA-PLATFORM-ATTESTATION" - overallAttestationToken["nbf"] = datetime.utcnow() - timedelta(seconds=120) - overallAttestationToken["exp"] = datetime.utcnow() + timedelta(hours=1) - overallAttestationToken["iat"] = datetime.utcnow() - overallAttestationToken["jti"] = str(uuid.uuid4()) - overallAttestationToken["x-nvidia-ver"] = "2.0" - overallAttestationToken["iss"] = "LOCAL_GPU_VERIFIER" - overallAttestationToken["x-nvidia-overall-att-result"] = "false" - overallAttestationToken["submods"] = {} - overallAttestationToken["eat_nonce"] = nonce - return overallAttestationToken - - @staticmethod - def create_detached_eat_claims( - attest_result: bool, - gpu_claims_list, - nonce, - hwmodel, - oemid, - ueid, - driver_warnings, - vbios_warnings, - ): - """Utility method to create detached EAT claims for a specific attestation token - - Args: - attest_result : boolean representing overall attestation result - gpu_claims_list: list of GPU claims - - Returns: - dict representing the detached EAT claims - """ - gpu_detached_claims = [] - - overall_encoded_claim_arr = [] - overall_encoded_claim_arr.append("JWT") - overall_claims = ClaimsUtils.get_overall_claims(nonce) - overall_claims["x-nvidia-overall-att-result"] = attest_result - - gpu_claims_dict = {} - submods_dict = {} - for i, gpu_uuid, gpu_claims in gpu_claims_list: - warning = "" - dict_key = "GPU-" + str(i) - jwt.encode(gpu_claims, "secret", "HS256") - gpu_claims["eat_nonce"] = nonce - gpu_claims["hwmodel"] = hwmodel.get(gpu_uuid, "") - gpu_claims["ueid"] = str(ueid.get(gpu_uuid, "")) - gpu_claims["oemid"] = oemid.get(gpu_uuid, "") - gpu_claims["iss"] = "LOCAL_GPU_VERIFIER" - warning = ( - driver_warnings.get(gpu_uuid, "") - + " " - + vbios_warnings.get(gpu_uuid, "") - ).strip() - if warning: - gpu_claims["x-nvidia-attestation-warning"] = warning - gpu_claims_json = json.dumps(gpu_claims) - submods_dict[dict_key] = [ - "DIGEST", - ["SHA256", hashlib.sha256(gpu_claims_json.encode("utf-8")).hexdigest()], - ] - gpu_claims["nbf"] = datetime.now(timezone.utc) - timedelta(seconds=120) - gpu_claims["exp"] = datetime.now(timezone.utc) + timedelta(hours=1) - gpu_claims["iat"] = datetime.now(timezone.utc) - gpu_claims["jti"] = str(uuid.uuid4()) - gpu_claims_dict[dict_key] = jwt.encode(gpu_claims, "secret", "HS256") - - overall_claims["submods"] = submods_dict - overall_encoded_claim = jwt.encode(overall_claims, "secret", "HS256") - overall_encoded_claim_arr.append(overall_encoded_claim) - gpu_detached_claims.append(overall_encoded_claim_arr) - gpu_detached_claims.append(gpu_claims_dict) - # detached_eat_json = json.dumps(gpu_detached_claims, indent = 2) - return gpu_detached_claims diff --git a/packages/verifier/src/verifier/verifier.py b/packages/verifier/src/verifier/verifier.py deleted file mode 100644 index a71ed876..00000000 --- a/packages/verifier/src/verifier/verifier.py +++ /dev/null @@ -1,182 +0,0 @@ -# -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -from verifier.config import ( - BaseSettings, - info_log, - __author__, - __copyright__, - __version__, -) -from verifier.utils import is_zeros -from verifier.exceptions import InvalidMeasurementIndexError - - -class Verifier: - """A class to match the runtime GPU measurements against the golden - measurements. - """ - - def verify(self, settings): - """This methods compares the runtime measurement with the golden measurement in order to check if there is any discrepancy. - - Args: - settings (config.HopperSettings): the object containing the various config info. - - Returns: - [bool]: returns True if all the valid golden measurements values matches with the - corresponding runtime measurements. Otherwise, returns False. - """ - info_log.info("\tComparing measurements (runtime vs golden)") - - if len(self.runtime_measurements) == 0: - info_log.warning( - "\t\t\tWarning : no measurements from attestation report received." - ) - - if len(self.golden_measurements) == 0: - info_log.warning( - "\t\t\tWarning : no golden measurements from RIMs received." - ) - - # Make sure that active golden measurement are always less than or equal to run time measurement - if len(self.golden_measurements) > len(self.runtime_measurements): - info_log.info( - "\t\t\tWarning : Golden measurement are more than measurements in Attestation report." - ) - return False - - list_of_mismatched_indexes = list() - - for i in self.golden_measurements: - if i == 35 and not self.is_msr_35_valid: - continue - - is_matching = False - - for j in range(self.golden_measurements[i].get_number_of_alternatives()): - if ( - self.golden_measurements[i].get_value_at_index(j) - == self.runtime_measurements[i] - and self.golden_measurements[i].get_size() - == len(self.runtime_measurements[i]) // 2 - ): - is_matching = True - - if not is_matching: - # Measurements are not matching. - list_of_mismatched_indexes.append(i) - - if len(list_of_mismatched_indexes) > 0: - info_log.info("""\t\t\tThe runtime measurements are not matching with the - golden measurements at the following indexes(starting from 0) :\n\t\t\t[""") - - list_of_mismatched_indexes.sort() - - for i, index in enumerate(list_of_mismatched_indexes): - if i != len(list_of_mismatched_indexes) - 1: - info_log.info(f"\t\t\t{index}, ") - else: - info_log.info("\t\t\t" + str(index)) - info_log.info("\t\t\t]") - return False - else: - info_log.info( - "\t\t\tThe runtime measurements are matching with the golden measurements.\ - \n\t\tGPU is in expected state." - ) - settings.mark_measurements_as_matching() - return True - - def generate_golden_measurement_list( - self, driver_golden_measurements, vbios_golden_measurements, settings - ): - """This method takes the driver and vbios golden measurements and - combines them into a single dictionary with the measurement index as - the key and the golden measurement object as the value. - - Args: - driver_golden_measurements (dict): the dictionary containing the driver golden measurements. - vbios_golden_measurements (dict): the dictionary containing the vbios golden measurements. - settings (config.HopperSettings): the object containing the various config info. - - Raises: - InvalidMeasurementIndexError: it is raised in case both the driver and vbios RIM file have - active measurement at the same index. - """ - self.golden_measurements = dict() - - for gld_msr_idx in driver_golden_measurements: - if driver_golden_measurements[gld_msr_idx].is_active(): - self.golden_measurements[gld_msr_idx] = driver_golden_measurements[ - gld_msr_idx - ] - - for gld_msr_idx in vbios_golden_measurements: - if ( - vbios_golden_measurements[gld_msr_idx].is_active() - and gld_msr_idx in self.golden_measurements - ): - raise InvalidMeasurementIndexError( - f"The driver and vbios RIM have measurement at the same index : {gld_msr_idx}" - ) - - elif vbios_golden_measurements[gld_msr_idx].is_active(): - self.golden_measurements[gld_msr_idx] = vbios_golden_measurements[ - gld_msr_idx - ] - - settings.mark_no_driver_vbios_measurement_index_conflict() - - def __init__(self, attestation_report_obj, driver_rim_obj, vbios_rim_obj, settings): - """The constructor method for the Verifier class. - - Args: - attestation_report_obj (AttestationReport): the attestation report. - driver_rim_obj (rim.RIM): the driver RIM object containing the the driver golden measurements. - vbios_rim_obj (rim.RIM): the vbios RIM object containing the vbios golden measurement. - settings (config.HopperSettings): the object containing the various config info. - """ - self.is_msr_35_valid = True - - if ( - attestation_report_obj.get_response_message() - .get_opaque_data() - .get_data("OPAQUE_FIELD_ID_NVDEC0_STATUS") - == BaseSettings.NVDEC_STATUS.DISABLED - ): - self.is_msr_35_valid = False - - self.generate_golden_measurement_list( - driver_rim_obj.get_measurements(), - vbios_rim_obj.get_measurements(), - settings, - ) - self.runtime_measurements = attestation_report_obj.get_measurements() diff --git a/pyproject.toml b/pyproject.toml index a61fbf7f..bd5acb13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ dependencies = [ "nilai-api", "nilai-common", "nilai-models", - "verifier", ] [dependency-groups] @@ -38,13 +37,12 @@ build-backend = "setuptools.build_meta" find = { include = ["nilai"] } [tool.uv.workspace] -members = ["nilai-models", "nilai-api", "packages/nilai-common", "packages/verifier"] +members = ["nilai-models", "nilai-api", "packages/nilai-common"] [tool.uv.sources] nilai-common = { workspace = true } nilai-api = { workspace = true } nilai-models = { workspace = true } -verifier = { workspace = true } [tool.pyright] From 7a1e59b6d7fb48a8303e9838fb181ffd7199f697 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 14 Mar 2025 19:27:09 -0700 Subject: [PATCH 17/20] qa fixes --- ... => docker-compose.deepseek-14b-tools.yml} | 0 .../compose/docker-compose.llama-1b-gpu.yml | 4 ++-- nilai-api/src/nilai_api/config/testnet.py | 1 + .../src/nilai_common/api_model.py | 21 ++++++++++++++++--- 4 files changed, 21 insertions(+), 5 deletions(-) rename docker/compose/{docker-compose.npw.deepseek14.yml => docker-compose.deepseek-14b-tools.yml} (100%) diff --git a/docker/compose/docker-compose.npw.deepseek14.yml b/docker/compose/docker-compose.deepseek-14b-tools.yml similarity index 100% rename from docker/compose/docker-compose.npw.deepseek14.yml rename to docker/compose/docker-compose.deepseek-14b-tools.yml diff --git a/docker/compose/docker-compose.llama-1b-gpu.yml b/docker/compose/docker-compose.llama-1b-gpu.yml index ac57b9da..831e0828 100644 --- a/docker/compose/docker-compose.llama-1b-gpu.yml +++ b/docker/compose/docker-compose.llama-1b-gpu.yml @@ -1,5 +1,5 @@ services: - llama_32_tool_gpu: + llama_1b_gpu: build: context: . dockerfile: docker/vllm.Dockerfile @@ -38,7 +38,7 @@ services: ETCD_HOST: "etcd" ETCD_PORT: "2379" TOOL_SUPPORT: true - MODEL_ROLE: "reasoning" + MODEL_ROLE: "generation" networks: - backend_net volumes: diff --git a/nilai-api/src/nilai_api/config/testnet.py b/nilai-api/src/nilai_api/config/testnet.py index a34c1cfa..7edcbfc3 100644 --- a/nilai-api/src/nilai_api/config/testnet.py +++ b/nilai-api/src/nilai_api/config/testnet.py @@ -8,6 +8,7 @@ "meta-llama/Llama-3.2-3B-Instruct": 10, "meta-llama/Llama-3.1-8B-Instruct": 5, "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": 5, + "watt-ai/watt-tool-8B": 10, } # It defines the number of requests allowed for each user for a given time frame. diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index f82173e7..3981a8c7 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -1,11 +1,13 @@ import uuid -from typing import List, Optional, Literal, Iterable +from typing import Dict, List, Optional, Literal, Iterable +from uuid import UUID + from openai.types.chat import ChatCompletion, ChatCompletionMessage from openai.types.chat.chat_completion import Choice as OpenaAIChoice from openai.types.chat.chat_completion import CompletionUsage from openai.types.chat import ChatCompletionToolParam -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, model_validator __all__ = [ @@ -28,6 +30,19 @@ class Message(ChatCompletionMessage): class Choice(OpenaAIChoice): pass +class SecretVaultPayload(BaseModel): + org_did: str + secret_key: str + inject_from: Optional[UUID] = None + filter_: Optional[Dict] = Field(None, alias="filter") + save_to: Optional[UUID] = None + + @model_validator(mode='after') + def check_required_fields(self): + if not self.save_to and not (self.inject_from and self.filter): + raise ValueError("Either 'save_to' must be provided or both 'inject_from' and 'filter' must be provided") + return self + class ChatRequest(BaseModel): model: str @@ -38,7 +53,7 @@ class ChatRequest(BaseModel): stream: Optional[bool] = False tools: Optional[Iterable[ChatCompletionToolParam]] = None nilrag: Optional[dict] = {} - secret_vault: Optional[dict] = {} + secret_vault: Optional[SecretVaultPayload] = None class SignedChatCompletion(ChatCompletion): From 25c78e1abbfdf8798e24c08479dbe540fb159859 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Fri, 14 Mar 2025 19:40:08 -0700 Subject: [PATCH 18/20] qa suggestions from jose --- .../compose/docker-compose.deepseek-14b-gpu.yml | 2 +- docker/compose/docker-compose.llama-3b-gpu.yml | 3 ++- docker/compose/docker-compose.llama-8b-gpu.yml | 3 ++- nilai-api/src/nilai_api/routers/private.py | 16 +--------------- nilai-api/src/nilai_api/vault.py | 2 +- .../nilai-common/src/nilai_common/api_model.py | 8 +++++++- packages/nilai-common/src/nilai_common/config.py | 2 +- 7 files changed, 15 insertions(+), 21 deletions(-) diff --git a/docker/compose/docker-compose.deepseek-14b-gpu.yml b/docker/compose/docker-compose.deepseek-14b-gpu.yml index 6da69411..29cc6a3e 100644 --- a/docker/compose/docker-compose.deepseek-14b-gpu.yml +++ b/docker/compose/docker-compose.deepseek-14b-gpu.yml @@ -31,7 +31,7 @@ services: - ETCD_HOST=etcd - ETCD_PORT=2379 - TOOL_SUPPORT=false - - MODEL_ROLE: "reasoning" + - MODEL_ROLE=reasoning volumes: - hugging_face_models:/root/.cache/huggingface # cache models networks: diff --git a/docker/compose/docker-compose.llama-3b-gpu.yml b/docker/compose/docker-compose.llama-3b-gpu.yml index f893333b..6948d29d 100644 --- a/docker/compose/docker-compose.llama-3b-gpu.yml +++ b/docker/compose/docker-compose.llama-3b-gpu.yml @@ -33,6 +33,7 @@ services: - ETCD_HOST=etcd - ETCD_PORT=2379 - TOOL_SUPPORT=true + - MODEL_ROLE=generation volumes: - hugging_face_models:/root/.cache/huggingface # cache models networks: @@ -47,4 +48,4 @@ volumes: hugging_face_models: networks: - backend_net: \ No newline at end of file + backend_net: diff --git a/docker/compose/docker-compose.llama-8b-gpu.yml b/docker/compose/docker-compose.llama-8b-gpu.yml index 4dfc6045..aa6d84bc 100644 --- a/docker/compose/docker-compose.llama-8b-gpu.yml +++ b/docker/compose/docker-compose.llama-8b-gpu.yml @@ -33,6 +33,7 @@ services: - ETCD_HOST=etcd - ETCD_PORT=2379 - TOOL_SUPPORT=true + - MODEL_ROLE=generation volumes: - hugging_face_models:/root/.cache/huggingface # cache models networks: @@ -47,4 +48,4 @@ volumes: hugging_face_models: networks: - backend_net: \ No newline at end of file + backend_net: diff --git a/nilai-api/src/nilai_api/routers/private.py b/nilai-api/src/nilai_api/routers/private.py index c4f4a33f..f94dfcca 100644 --- a/nilai-api/src/nilai_api/routers/private.py +++ b/nilai-api/src/nilai_api/routers/private.py @@ -208,9 +208,6 @@ async def chat_completion( f"Chat completion request for model {req.model} from user {user.userid}" ) - logger.info(f"EXTRA INFO: {req}") - logger.info(f"VAULT INFO: {req.secret_vault}") - if req.secret_vault and (schema_uuid := req.secret_vault.get("inject_from")): """ Endpoint activated with SecretVault support @@ -224,7 +221,7 @@ async def chat_completion( 4c. ... append payload to LLM query """ try: - logger.info(f"SECRET VAULT INJECTION REQUESTED ({schema_uuid})") + logger.info("SECRET VAULT INJECTION REQUESTED") vault = SecretVaultHelper( org_did=req.secret_vault.get("org_did"), secret_key=req.secret_vault.get("secret_key"), @@ -234,7 +231,6 @@ async def chat_completion( records = vault.data_reveal(req.secret_vault.get("filter")) formatted_results = "\n".join(f"- {str(result)}" for result in records) relevant_context = f"\n\nRelevant Context:\n{formatted_results}" - logger.info(f"SECRET VAULT INJECTION: {relevant_context}") for message in req.messages: if message.role == "system": if message.content is None: @@ -491,16 +487,6 @@ async def chat_completion_stream_generator() -> AsyncGenerator[str, None]: response_format={"type": "json_object"}, ) json_response = remux_res.choices[0].message.content - logger.info(f""" - INPUT: - {inference_result} - - SCHEMA: - {vault.schema_definition} - - OUTPUT: - {json_response} - """) parsed_data = json.loads(json_response) vault_res = vault.post( parsed_data["items"] if "items" in parsed_data else parsed_data, diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index facf7799..8e261047 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -85,7 +85,7 @@ def find_schema(self, schema_uuid: str) -> dict: return my_schema def _mutate_secret_attributes(self, entry: dict) -> None: - """Apply encrypotion or secret sharing to all fields in schema that are indicated w/ $share keyname.""" + """Apply encryption or secret sharing to all fields in schema that are indicated w/ $share keyname.""" keys = list(entry.keys()) for key in keys: value = entry[key] diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index 3981a8c7..9bf5f5fc 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -1,4 +1,5 @@ import uuid +from enum import Enum from typing import Dict, List, Optional, Literal, Iterable from uuid import UUID @@ -67,6 +68,11 @@ class AttestationResponse(BaseModel): gpu_attestation: str # Base64 encoded GPU attestation +class AllowedModelRoles(str, Enum): + WORKER = "worker" + GENERATION = "generation" + REASONING = "reasoning" + class ModelMetadata(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) name: str @@ -75,7 +81,7 @@ class ModelMetadata(BaseModel): author: str license: str source: str - role: Optional[str] = "unknown" + role: AllowedModelRoles supported_features: List[str] tool_support: bool diff --git a/packages/nilai-common/src/nilai_common/config.py b/packages/nilai-common/src/nilai_common/config.py index 08a92953..0f21f894 100644 --- a/packages/nilai-common/src/nilai_common/config.py +++ b/packages/nilai-common/src/nilai_common/config.py @@ -10,7 +10,7 @@ "etcd_host": os.getenv("ETCD_HOST", "localhost"), "etcd_port": os.getenv("ETCD_PORT", 2379), "tool_support": os.getenv("TOOL_SUPPORT", False), - "role": os.getenv("MODEL_ROLE", "default"), + "role": os.getenv("MODEL_ROLE", "generate"), } # if environment == "docker": # config = "docker_settings.py" From 1c0b377d04946b3f9fbbf4a3234ba694ccd6268b Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Tue, 25 Mar 2025 17:22:36 -0700 Subject: [PATCH 19/20] added comprehensive mongodb filter pydantic validator as well as a few other types --- nilai-api/src/nilai_api/vault.py | 14 +- .../src/nilai_common/api_model.py | 4 +- .../nilai_common/mongodb_filter_validator.py | 164 ++++++++++++++++++ 3 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 packages/nilai-common/src/nilai_common/mongodb_filter_validator.py diff --git a/nilai-api/src/nilai_api/vault.py b/nilai-api/src/nilai_api/vault.py index 8e261047..60914dcb 100644 --- a/nilai-api/src/nilai_api/vault.py +++ b/nilai-api/src/nilai_api/vault.py @@ -10,6 +10,8 @@ from jsonschema.exceptions import ValidationError import uuid import time +from typing import Any, Dict + logger = logging.getLogger(__name__) @@ -54,7 +56,7 @@ def __init__(self, org_did: str, secret_key: str, schema_uuid: str): f"fn:data_upload init complete: {len(self.nodes)} nodes | schema {schema_uuid}" ) - def fetch_schemas(self) -> list: + def fetch_schemas(self) -> list[Dict[str, Any]]: """Get all my schemas from the first server.""" headers = { "Authorization": f"Bearer {self.nodes[0]['bearer']}", @@ -128,9 +130,9 @@ def data_reveal(self, filter: dict = {}) -> list[dict]: headers=headers, json=body, ) - assert response.status_code == 200, ( - "upload failed: " + response.content.decode("utf8") - ) + assert ( + response.status_code == 200 + ), "upload failed: " + response.content.decode("utf8") data = response.json().get("data") for d in data: shares[d["_id"]].append(d) @@ -142,7 +144,7 @@ def data_reveal(self, filter: dict = {}) -> list[dict]: logger.info(f"Error retrieving records in node: {e!r}") return [] - def post(self, data_to_store: list) -> list: + def post(self, data_to_store: list[Dict[str, Any]]) -> list[str]: """Create/upload records in the specified node and schema.""" logger.info( f"fn:data_upload {self.schema_uuid} | {type(data_to_store)} | {data_to_store}" @@ -152,6 +154,8 @@ def post(self, data_to_store: list) -> list: validator = builder(self.schema_definition) logger.info(f"fn:data_upload | got {len(data_to_store)} records") + + # even with proper llm tool registration, a model might pass a plain dict to this function for entry in ( [data_to_store] if isinstance(data_to_store, dict) else data_to_store ): diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index 9bf5f5fc..05be50a0 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -10,6 +10,8 @@ from openai.types.chat import ChatCompletionToolParam from pydantic import BaseModel, Field, model_validator +from mongodb_filter_validator import MongoFilter + __all__ = [ "Message", @@ -35,7 +37,7 @@ class SecretVaultPayload(BaseModel): org_did: str secret_key: str inject_from: Optional[UUID] = None - filter_: Optional[Dict] = Field(None, alias="filter") + filter_: Optional[MongoFilter] = Field(None, alias="filter") save_to: Optional[UUID] = None @model_validator(mode='after') diff --git a/packages/nilai-common/src/nilai_common/mongodb_filter_validator.py b/packages/nilai-common/src/nilai_common/mongodb_filter_validator.py new file mode 100644 index 00000000..0e638b26 --- /dev/null +++ b/packages/nilai-common/src/nilai_common/mongodb_filter_validator.py @@ -0,0 +1,164 @@ +from __future__ import annotations +from typing import Any, Dict, List, Union, Optional +from pydantic import BaseModel, Field, model_validator + + +class ComparisonOperator(BaseModel): + """Model for MongoDB comparison operators""" + + eq: Optional[Any] = Field(None, alias="$eq") + gt: Optional[Any] = Field(None, alias="$gt") + gte: Optional[Any] = Field(None, alias="$gte") + in_: Optional[List[Any]] = Field(None, alias="$in") + lt: Optional[Any] = Field(None, alias="$lt") + lte: Optional[Any] = Field(None, alias="$lte") + ne: Optional[Any] = Field(None, alias="$ne") + nin: Optional[List[Any]] = Field(None, alias="$nin") + + +class LogicalOperator(BaseModel): + """Model for MongoDB logical operators""" + + and_: Optional[List[MongoFilter]] = Field(None, alias="$and") + not_: Optional[Union[MongoFilter, Any]] = Field(None, alias="$not") + nor: Optional[List[MongoFilter]] = Field(None, alias="$nor") + or_: Optional[List[MongoFilter]] = Field(None, alias="$or") + + +class ElementOperator(BaseModel): + """Model for MongoDB element operators""" + + exists: Optional[bool] = Field(None, alias="$exists") + type: Optional[Union[int, str]] = Field(None, alias="$type") + + +class EvaluationOperator(BaseModel): + """Model for MongoDB evaluation operators""" + + expr: Optional[Any] = Field(None, alias="$expr") + jsonSchema: Optional[Dict[str, Any]] = Field(None, alias="$jsonSchema") + mod: Optional[List[int]] = Field(None, alias="$mod") + regex: Optional[str] = Field(None, alias="$regex") + options: Optional[str] = Field(None, alias="$options") + text: Optional[Union[str, Dict[str, Any]]] = Field(None, alias="$text") + where: Optional[str] = Field(None, alias="$where") + + +class ArrayOperator(BaseModel): + """Model for MongoDB array operators""" + + all: Optional[List[Any]] = Field(None, alias="$all") + elemMatch: Optional[MongoFilter] = Field(None, alias="$elemMatch") + size: Optional[int] = Field(None, alias="$size") + + +class BitwiseOperator(BaseModel): + """Model for MongoDB bitwise operators""" + + bitsAllClear: Optional[Union[int, List[int]]] = Field(None, alias="$bitsAllClear") + bitsAllSet: Optional[Union[int, List[int]]] = Field(None, alias="$bitsAllSet") + bitsAnyClear: Optional[Union[int, List[int]]] = Field(None, alias="$bitsAnyClear") + bitsAnySet: Optional[Union[int, List[int]]] = Field(None, alias="$bitsAnySet") + + +class GeoOperator(BaseModel): + """Model for MongoDB geospatial operators""" + + geoIntersects: Optional[Dict[str, Any]] = Field(None, alias="$geoIntersects") + geoWithin: Optional[Dict[str, Any]] = Field(None, alias="$geoWithin") + near: Optional[Dict[str, Any]] = Field(None, alias="$near") + nearSphere: Optional[Dict[str, Any]] = Field(None, alias="$nearSphere") + + +class MongoOperator( + ComparisonOperator, + LogicalOperator, + ElementOperator, + EvaluationOperator, + ArrayOperator, + BitwiseOperator, + GeoOperator, +): + """Combined model for all MongoDB operators""" + + pass + + +# MongoDB allows any field to have a value that's either: +# 1. A direct value (str, int, bool, etc.) +# 2. A dict with operators ($eq, $gt, etc.) +# 3. A dict with nested fields +# This makes validation complex since it's recursive and polymorphic + + +class MongoFilter(BaseModel): + """ + MongoDB filter validator that handles all possible MongoDB query operators and structures. + """ + + model_config = { + "extra": "allow", + "arbitrary_types_allowed": True, + } + + @model_validator(mode="before") + @classmethod + def validate_filter(cls, data): + """ + Validate that the filter structure is correct. + This is a recursive process since MongoDB filters can be nested. + """ + if not isinstance(data, dict): + return data + + for key, value in data.items(): + # Skip validation for logical operators like $and, $or which are handled by their own models + if key.startswith("$"): + continue + + # If value is a dict but doesn't contain any operator ($gt, $lt, etc.) + # then it's a nested filter + if isinstance(value, dict): + # Check if it's an operator-based condition (e.g., {"$gt": 5}) + has_operators = any(k.startswith("$") for k in value.keys()) + + if has_operators: + # Validate through MongoOperator + MongoOperator.model_validate(value) + else: + # It's a nested filter, validate recursively + MongoFilter.model_validate(value) + + # If value is a list, validate each item in the list + elif isinstance(value, list): + for item in value: + if isinstance(item, dict): + MongoFilter.model_validate(item) + + return data + + +if __name__ == "__main__": + example_filter = { + "_id": { + "$in": [ + "6e214b90-ea31-4d29-ae57-68af5f2cdc86", + "688a3184-c2d7-4aed-ab2f-4d376a9b6a0d", + ] + } + } + + valid = MongoFilter.model_validate(example_filter) + print(f"Filter validation: {'Valid' if valid else 'Invalid'}") + + # Try more complex examples + complex_filter = { + "name": {"$regex": "^J", "$options": "i"}, + "age": {"$gte": 18, "$lt": 65}, + "$or": [{"status": "active"}, {"lastLogin": {"$gt": "2023-01-01"}}], + "tags": {"$all": ["premium", "verified"]}, + "addresses.city": "New York", + } + + valid = MongoFilter.model_validate(complex_filter) + print(f"Complex filter validation: {'Valid' if valid else 'Invalid'}") From 7bae49d3fdf34d20c4c07ac7c25d0d9cebf50d43 Mon Sep 17 00:00:00 2001 From: Nicholas Wehr Date: Wed, 26 Mar 2025 19:34:52 +0000 Subject: [PATCH 20/20] fixed import path --- packages/nilai-common/src/nilai_common/api_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nilai-common/src/nilai_common/api_model.py b/packages/nilai-common/src/nilai_common/api_model.py index 05be50a0..041c59ec 100644 --- a/packages/nilai-common/src/nilai_common/api_model.py +++ b/packages/nilai-common/src/nilai_common/api_model.py @@ -10,7 +10,7 @@ from openai.types.chat import ChatCompletionToolParam from pydantic import BaseModel, Field, model_validator -from mongodb_filter_validator import MongoFilter +from .mongodb_filter_validator import MongoFilter __all__ = [