diff --git a/skills/dali-dynamic-mode/BENCHMARK.md b/skills/dali-dynamic-mode/BENCHMARK.md index e7b4dab6f97..d0c05122386 100644 --- a/skills/dali-dynamic-mode/BENCHMARK.md +++ b/skills/dali-dynamic-mode/BENCHMARK.md @@ -7,14 +7,18 @@ This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the s ## Evaluation Summary - Skill: `dali-dynamic-mode` -- Evaluation date: 2026-05-28 +- Evaluation date: 2026-06-08 - NVSkills-Eval profile: `external` +- Environment: `astra-sandbox` +- Dataset: 24 evaluation tasks +- Attempts per task: 2 +- Pass threshold: 50% - Overall verdict: PASS -- Tier 3 live agent evaluation: not available in this report ## Agents Used -- Tier 3 agent details were not available in this report. +- `claude-code` +- `codex` ## Metrics Used @@ -28,15 +32,29 @@ Reported benchmark dimensions: Underlying evaluation signals used in this run: -- No Tier 3 evaluation signal details were available in this report. +- `security` (Security): checks for unsafe operations, secret leakage, and unauthorized access. +- `skill_execution` (Skill Execution): verifies that the agent loaded the expected skill and workflow. +- `skill_efficiency` (Efficiency): checks routing quality, decoy avoidance, and redundant tool usage. +- `accuracy` (Accuracy): grades final-answer correctness against the reference answer. +- `goal_accuracy` (Goal Accuracy): checks whether the overall user task completed successfully. +- `behavior_check` (Behavior Check): verifies expected behavior steps, including safety expectations. +- `token_efficiency` (Token Efficiency): compares token usage with and without the skill. ## Test Tasks -Tier 3 evaluation task details were not available in this report. +The benchmark included 24 recorded Tier 3 trials, but the source evaluation dataset was not available in this report payload. ## Results -Tier 3 dimension rollup was not available in this report. +| Dimension | Num | `claude-code` | `codex` | +|---|---:|---:|---:| +| Security | 8 | 100% (+0%) | 100% (+0%) | +| Correctness | 8 | 98% (+61%) | 86% (+31%) | +| Discoverability | 8 | 97% (+84%) | 81% (+47%) | +| Effectiveness | 8 | 77% (+45%) | 66% (+29%) | +| Efficiency | 8 | 88% (+59%) | 76% (+41%) | + +Score values show skill-assisted performance. Values in parentheses show uplift versus the no-skill baseline when baseline data is available. ## Tier 1: Static Validation Summary @@ -44,10 +62,10 @@ Tier 1 validation passed. NVSkills-Eval ran 9 checks and found 0 total findings. Notable observations: -- SECURITY: No security vulnerabilities detected (secrets, API keys, credentials) +- SECURITY: no findings reported. - SCHEMA: Found skill manifest: SKILL.md - VERSION: No semantic version label present; resource will use commit-hash history (opting back out of an existing label is allowed) -- PII: Scanning 1 files for PII +- PII: Scanning 2 files for PII - LICENSE: no findings reported. ## Tier 2: Deduplication Summary diff --git a/skills/dali-dynamic-mode/SKILL.md b/skills/dali-dynamic-mode/SKILL.md index 5f85880a355..d3d73bb569b 100644 --- a/skills/dali-dynamic-mode/SKILL.md +++ b/skills/dali-dynamic-mode/SKILL.md @@ -29,6 +29,7 @@ Guide AI agents in writing, reviewing, and migrating code that uses DALI's imper - Treat readers as stateful: create them once, reuse them across epochs, and pass `batch_size` to `next_epoch(...)`. - Pass explicit `batch_size` to random ops; there is no pipeline-level batch size to inherit. - Use dynamic-mode API conventions: `device="gpu"` instead of pipeline-mode `"mixed"`, `Batch.tensors[...]` for sample selection, and `Batch.slice[...]` for per-sample slicing. +- Use `.torch()` to convert a tensor or batch to a PyTorch tensor. Use `pad=True` for batches with variable shapes. ## Prerequisites @@ -149,7 +150,7 @@ Default mode is `eager` -- async execution in a background thread, returns immed For debugging, switch to synchronous mode so errors surface at the exact call site rather than later in the async queue: ```python -with ndd.EvalMode.sync_full: +with ndd.EvalMode.sync_cpu: images = ndd.decoders.image(jpegs, device="gpu") images = ndd.resize(images, size=[224, 224]) # Any error surfaces here, at the exact op that failed @@ -288,5 +289,5 @@ Dynamic mode is more flexible than pipeline mode, but can have slightly worse pe ## Troubleshooting -- If errors surface later than the failing call, rerun the block under `with ndd.EvalMode.sync_full:`. +- If errors surface later than the failing call, rerun the block under `EvalMode.sync_cpu` or `EvalMode.sync_full`. - If a reader behaves unexpectedly across epochs, check that it is created once and each `next_epoch()` iterator is fully consumed. diff --git a/skills/dali-dynamic-mode/evals/evals.json b/skills/dali-dynamic-mode/evals/evals.json index fc5bd94ae5b..ecd9907f52f 100644 --- a/skills/dali-dynamic-mode/evals/evals.json +++ b/skills/dali-dynamic-mode/evals/evals.json @@ -3,7 +3,7 @@ "evals": [ { "id": 1, - "prompt": "Write a complete Python script that uses DALI dynamic mode to load and preprocess images for training an image classification model with PyTorch. The images are JPEGs on disk, and I need GPU-accelerated decode, resize to 224x224, and ImageNet normalization. The script should include the training loop.", + "prompt": "Write a Python script that uses DALI dynamic mode to load and preprocess images for training an image classification model with PyTorch. The images are JPEGs on disk, and I need GPU-accelerated decode, resize to 224x224, and ImageNet normalization. Show the full script, do not save it to a file.", "expected_output": "Complete pipeline using ndd.readers.File, ndd.decoders.image(device='gpu'), ndd.resize, ndd.crop_mirror_normalize, .torch() handoff", "files": [], "assertions": [ @@ -24,7 +24,8 @@ "expected_output": "Uses batch.slice[0] and batch.slice[1] for samplewise slicing", "files": [], "assertions": [ - {"name": "correct-slice-usage", "text": "Uses batch.slice[0] and batch.slice[1] (not batch.tensors)"}, + {"name": "correct-import", "text": "Uses import nvidia.dali.experimental.dynamic as ndd"}, + {"name": "correct-slice-usage", "text": "Uses batch.slice[0] and batch.slice[1]"}, {"name": "no-getitem", "text": "Does not use batch[0] or batch[:, 0] (Batch has no __getitem__)"}, {"name": "correct-slice-semantics", "text": "Correctly explains that .slice indexes within each sample, not across samples"}, {"name": "batch-size-to-random", "text": "Passes batch_size to ndd.random.uniform()"} @@ -32,10 +33,11 @@ }, { "id": 3, - "prompt": "Convert the following pipeline-mode DALI code to dynamic mode. Write the complete converted script.", + "prompt": "Convert the file /workspace/input/pipeline_to_convert.py to dynamic mode. Include the complete converted script in your response.", "expected_output": "Correct conversion with all pipeline-mode patterns replaced", "files": ["evals/files/pipeline_to_convert.py"], "assertions": [ + {"name": "correct-import", "text": "Uses import nvidia.dali.experimental.dynamic as ndd"}, {"name": "device-gpu-not-mixed", "text": "device='mixed' converted to device='gpu'"}, {"name": "reader-pascalcase", "text": "fn.readers.file converted to ndd.readers.File (PascalCase)"}, {"name": "no-pipeline-mode", "text": "No pipeline-mode constructs (no @pipeline_def, pipe.build(), pipe.run()) and operators called directly on ndd (e.g. ndd.rotate, not fn.rotate or ndd.fn.rotate)"}, @@ -48,20 +50,21 @@ { "id": 4, "prompt": "My data loading code built with DALI's dynamic (imperative) API produces wrong results intermittently — images sometimes appear corrupted. The code decodes JPEG images on the GPU, resizes them, and normalizes them. How do I debug this? Write a debugging guide with code examples.", - "expected_output": "Recommends EvalMode.sync_full or sync_cpu for debugging, explains async execution model, code examples use correct dynamic mode patterns", + "expected_output": "Recommends EvalMode.sync_full or sync_cpu for debugging (not necessarily both), explains async execution model, code examples use correct dynamic mode patterns", "files": [], "assertions": [ + {"name": "correct-import", "text": "Uses import nvidia.dali.experimental.dynamic as ndd"}, {"name": "recommends-sync-mode", "text": "Recommends EvalMode.sync_full or EvalMode.sync_cpu for debugging"}, {"name": "no-scatter-evaluate", "text": "Does not recommend adding .evaluate() after every operation as the primary debugging approach"}, - {"name": "correct-evalmode-syntax", "text": "Uses correct context manager syntax: with ndd.EvalMode.sync_full: (not ndd.eval_mode(...) or other invented API)"}, - {"name": "correct-sample-inspection", "text": "When inspecting intermediate values, uses batch.tensors[i].cpu() or np.asarray(batch.tensors[i].cpu()) — not batch[i] or batch.as_cpu().as_array()"}, + {"name": "correct-evalmode-syntax", "text": "Uses correct context manager syntax: `with ndd.EvalMode.sync_cpu:` or `with ndd.EvalMode.sync_full:` (not ndd.eval_mode(...) or other invented API)"}, + {"name": "correct-sample-inspection", "text": "When inspecting intermediate values, uses batch.tensors[i], not batch[i] or batch.as_cpu().as_array()"}, {"name": "code-examples-no-pipeline-mode", "text": "All code examples in the guide use dynamic mode patterns (ndd.decoders.image, ndd.resize, etc.) — no fn.* or ndd.fn.* operators in any code snippet"}, {"name": "code-examples-device-gpu", "text": "All code examples use device='gpu' for decode, NOT device='mixed'"} ] }, { "id": 5, - "prompt": "I need to train a speech classification model on WAV files using PyTorch. Write a complete Python script that uses DALI dynamic mode for the data loading and audio feature extraction (mel spectrograms). My audio clips have different durations.", + "prompt": "I need to train a speech classification model on WAV files using PyTorch. Show me a complete Python script that uses DALI dynamic mode for the data loading and audio feature extraction (mel spectrograms). My audio clips have different durations.", "expected_output": "Uses ndd.readers, ndd.decoders.audio(), spectral ops, handles variable-length via .torch(pad=True)", "files": [], "assertions": [ @@ -75,7 +78,7 @@ }, { "id": 6, - "prompt": "Write a complete Python script for an object detection training pipeline using DALI dynamic mode and PyTorch. It should read COCO-format images and annotations, apply random horizontal flip as augmentation (both images and their bounding boxes), resize, normalize, and feed to a model.", + "prompt": "Write a complete Python script for an object detection training pipeline using DALI dynamic mode and PyTorch. It should read COCO-format images and annotations, apply random horizontal flip as augmentation (both images and their bounding boxes), resize, normalize, and feed to a model. Images are of variable sizes.", "expected_output": "DALI reader with bbox support, coordinated augmentation via ndd.random, correct dynamic mode patterns", "files": [], "assertions": [ diff --git a/skills/dali-dynamic-mode/scripts/requirements.txt b/skills/dali-dynamic-mode/scripts/requirements.txt new file mode 100644 index 00000000000..8b98c56c470 --- /dev/null +++ b/skills/dali-dynamic-mode/scripts/requirements.txt @@ -0,0 +1,2 @@ +nvidia-dali-cuda130 +torch diff --git a/skills/dali-dynamic-mode/skill-card.md b/skills/dali-dynamic-mode/skill-card.md index 82d435afb13..1ce5f0cff55 100644 --- a/skills/dali-dynamic-mode/skill-card.md +++ b/skills/dali-dynamic-mode/skill-card.md @@ -7,9 +7,9 @@ This skill is ready for commercial/non-commercial use.
NVIDIA
### License/Terms of Use:
-Apache-2.0
+Apache 2.0
## Use Case:
-Developers and engineers writing, reviewing, or migrating code that uses NVIDIA DALI's imperative dynamic-mode API for GPU-accelerated data loading and preprocessing.
+Developers and engineers writing, reviewing, or migrating data-loading code that uses NVIDIA DALI's imperative dynamic-mode API for GPU-accelerated data processing in deep learning workflows.
### Deployment Geography for Use:
Global
@@ -19,6 +19,8 @@ Risk: Review before execution as proposals could introduce incorrect or misleadi Mitigation: Review and scan skill before deployment.
## Reference(s):
+- [SKILL.md](SKILL.md)
+- [BENCHMARK.md](BENCHMARK.md)
## Skill Output:
@@ -27,6 +29,15 @@ Mitigation: Review and scan skill before deployment.
**Output Parameters:** [1D]
**Other Properties Related to Output:** [None]
+## Evaluation Agents Used:
+- `claude-code`
+- `codex`
+ + + +## Evaluation Tasks:
+Evaluated against 24 tasks with 2 attempts per task; pass threshold 50%.
+ ## Evaluation Metrics Used:
Reported benchmark dimensions:
- Security: Checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access.
@@ -35,10 +46,28 @@ Reported benchmark dimensions:
- Effectiveness: Checks whether the agent performs measurably better with the skill than without it.
- Efficiency: Checks whether the agent uses fewer tokens and avoids redundant work.
+Underlying evaluation signals used in this run:
+- `security`: Checks for unsafe operations, secret leakage, and unauthorized access.
+- `skill_execution`: Verifies that the agent loaded the expected skill and workflow.
+- `skill_efficiency`: Checks routing quality, decoy avoidance, and redundant tool usage.
+- `accuracy`: Grades final-answer correctness against the reference answer.
+- `goal_accuracy`: Checks whether the overall user task completed successfully.
+- `behavior_check`: Verifies expected behavior steps, including safety expectations.
+- `token_efficiency`: Compares token usage with and without the skill.
+ + +## Evaluation Results:
+| Dimension | Num | `claude-code` | `codex` | +|---|---:|---:|---:| +| Security | 8 | 100% (+0%) | 100% (+0%) | +| Correctness | 8 | 98% (+61%) | 86% (+31%) | +| Discoverability | 8 | 97% (+84%) | 81% (+47%) | +| Effectiveness | 8 | 77% (+45%) | 66% (+29%) | +| Efficiency | 8 | 88% (+59%) | 76% (+41%) | ## Skill Version(s):
-4d4cfdd1 (source: git SHA, committed 2026-05-28)
+v2.2.0-dev-88-g5107f33d (source: git tag)
## Ethical Considerations:
NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal team to ensure this skill meets requirements for the relevant industry and use case and addresses unforeseen product misuse.
diff --git a/skills/dali-dynamic-mode/skill.oms.sig b/skills/dali-dynamic-mode/skill.oms.sig index de47b27e048..1907037e3fd 100644 --- a/skills/dali-dynamic-mode/skill.oms.sig +++ b/skills/dali-dynamic-mode/skill.oms.sig @@ -1 +1 @@ -{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiZGFsaS1keW5hbWljLW1vZGUiLAogICAgICAiZGlnZXN0IjogewogICAgICAgICJzaGEyNTYiOiAiOTc0NWVkOTRkYjg1MGVlOWUyMDAwMTM0ODI3MWJkMGZlOTYxYjU0ZWNmZWE0NDQ0OWJlNzE1ZTNkZmVjNWZkNSIKICAgICAgfQogICAgfQogIF0sCiAgInByZWRpY2F0ZVR5cGUiOiAiaHR0cHM6Ly9tb2RlbF9zaWduaW5nL3NpZ25hdHVyZS92MS4wIiwKICAicHJlZGljYXRlIjogewogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImQ5NzJjYjg2Nzg3M2M0YjI3MTA4ZTllZWMxOTg4Y2FiYzVhOTM1NzEzOWQ0ZmUxNzM0MDM5OGM4ZDliMjMwMGIiLAogICAgICAgICJuYW1lIjogIkJFTkNITUFSSy5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjcyMTJiYjQ1ZWJiZDEzMTU1Y2UxNzIyMmZhOTFkM2U5NWIwYjAzMmZjNjg0MGRjMzUxNWRiOWJiNGIyMGE2ZjIiLAogICAgICAgICJuYW1lIjogIlNLSUxMLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiMzViYjFkNGNmMWVlODhlODRjMzU0OTQ0MTAyYmQ5YTg4MjhlMmNkNzBhNjJjYjJmMThkMjYyMzdmZDc0NGMzZCIsCiAgICAgICAgIm5hbWUiOiAiZXZhbHMvZXZhbHMuanNvbiIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjUwOTIzOWIyNWQ2NzdiMDQ0NzU4YzNjZGY3OTdmMzdiMGVkZGJiYWQxOTczOTRlMmIyN2I1MmQ4NGQzMWJkMDgiLAogICAgICAgICJuYW1lIjogImV2YWxzL2ZpbGVzL3BpcGVsaW5lX3RvX2NvbnZlcnQucHkiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI0NTdiNTVkMmEzODBiNGNkYjc3OGQ0NzVlNTM1YTYxZjQ5NjAwMDU0NGVhMmM5YzZjNzE2MDA5M2M3NWRjODk1IiwKICAgICAgICAibmFtZSI6ICJza2lsbC1jYXJkLm1kIgogICAgICB9CiAgICBdLAogICAgInNlcmlhbGl6YXRpb24iOiB7CiAgICAgICJhbGxvd19zeW1saW5rcyI6IGZhbHNlLAogICAgICAiaGFzaF90eXBlIjogInNoYTI1NiIsCiAgICAgICJtZXRob2QiOiAiZmlsZXMiLAogICAgICAiaWdub3JlX3BhdGhzIjogWwogICAgICAgICIuZ2l0IiwKICAgICAgICAiLmdpdGF0dHJpYnV0ZXMiLAogICAgICAgICIuZ2l0aWdub3JlIiwKICAgICAgICAiLmdpdGh1YiIKICAgICAgXQogICAgfQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGQCMGjyHHekJe2La3AijAWHTM4XlcMvr6f9IC9l4fo4S8cQ7QyU/NfrCaqPBd1or3H0dwIwTpBAfW0wiD/0biOMOByqW/LFpao99XnU60DWJcK/DdeDi1xr2ZGX9VHGbmoOz4+p","keyid":""}]}} \ No newline at end of file +{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiZGFsaS1keW5hbWljLW1vZGUiLAogICAgICAiZGlnZXN0IjogewogICAgICAgICJzaGEyNTYiOiAiNWNhZTkzMmQ2NGY3MDAwODFmZTE3MzhhY2QxZmEyODI0MjU3NmU0MmI1ODc2YTgwZjljY2Y5ZDkzYjA1ZGJhZSIKICAgICAgfQogICAgfQogIF0sCiAgInByZWRpY2F0ZVR5cGUiOiAiaHR0cHM6Ly9tb2RlbF9zaWduaW5nL3NpZ25hdHVyZS92MS4wIiwKICAicHJlZGljYXRlIjogewogICAgInNlcmlhbGl6YXRpb24iOiB7CiAgICAgICJoYXNoX3R5cGUiOiAic2hhMjU2IiwKICAgICAgImlnbm9yZV9wYXRocyI6IFsKICAgICAgICAiLmdpdGh1YiIsCiAgICAgICAgIi5naXQiLAogICAgICAgICIuZ2l0aWdub3JlIiwKICAgICAgICAiLmdpdGF0dHJpYnV0ZXMiCiAgICAgIF0sCiAgICAgICJtZXRob2QiOiAiZmlsZXMiLAogICAgICAiYWxsb3dfc3ltbGlua3MiOiBmYWxzZQogICAgfSwKICAgICJyZXNvdXJjZXMiOiBbCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiQkVOQ0hNQVJLLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjc4OTM3ZDU4YWZlZjVjMjBjOWE3MzM2MjhjYWRiYWFiMTdmNDE2YTQzMTliYTU3NjBiODJiMDhjOWRjYTBmNzUiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiU0tJTEwubWQiLAogICAgICAgICJkaWdlc3QiOiAiNDhlYzU4MzA5MDIxNmI0Y2JiY2NhZDc5ZWI2MGU4OTA0MTBkODkxY2FkNWZjYjVjZGE3NjY4MmZjODFkNGJjYSIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJldmFscy9ldmFscy5qc29uIiwKICAgICAgICAiZGlnZXN0IjogImUyMTBhNTk3ZjYxYjViZWQwYjRhYTQwYTkwZjVhODlkMDcwNmQzOWJiNGMzOGRmMTllOWViOTRiNmJmNzdjY2IiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiZXZhbHMvZmlsZXMvcGlwZWxpbmVfdG9fY29udmVydC5weSIsCiAgICAgICAgImRpZ2VzdCI6ICI1MDkyMzliMjVkNjc3YjA0NDc1OGMzY2RmNzk3ZjM3YjBlZGRiYmFkMTk3Mzk0ZTJiMjdiNTJkODRkMzFiZDA4IgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInNjcmlwdHMvcmVxdWlyZW1lbnRzLnR4dCIsCiAgICAgICAgImRpZ2VzdCI6ICJmZmIyYjJmMDEwNmEwMTJmNmY0MTA1YjgyNTU4M2M2NmZjMmQwMTFiZWMxYmJhNDE4NDE5OGEyYzQ3Zjg0MGZhIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInNraWxsLWNhcmQubWQiLAogICAgICAgICJkaWdlc3QiOiAiNzA2NzEzZmZlYzEwZWFiYzg1MDUyNDYwZTJiZWMzZTNjYWRmMzU5NWYxMmI4YjYwYTE3NTJmYzkzMDk3NWRhMSIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGUCMAcQRoluBIrHmkrm2XyHQowIVO0hpp4ATQWt/PZ2bXFegqDpvecEyo7VEam83DafogIxALD5YqvJjO3cQxZdCfCL1O+MWV7uDNAjxVrtg4QgWCfXECiZ3dMT4hDv+q61+gJbWg==","keyid":""}]}} \ No newline at end of file