From a26215bb99a04443d06e642bf736dc50e6f6a49d Mon Sep 17 00:00:00 2001 From: paularamo Date: Mon, 15 Jun 2026 14:04:48 -0400 Subject: [PATCH 1/4] Improve CONTRIBUTING.md with cookbook structure, quality requirements, and recipe templates Replaces the generic contributing guide with a structured document that reflects the actual cookbooks/cosmos3/ directory layout and establishes clear quality requirements for community-contributed cookbooks: - Cookbook structure section with routing table (reasoner, generator/audiovisual, generator/action, generator/transfer) - Five quality requirements: open-access data, results/expected output, canonical setup, one-click runnable, naming convention - Cookbook README template ready for contributors to copy - Contribution areas table with clear accept/reject criteria - Testing checklist for pre-submission validation (cherry picked from commit 57d2fa422e535155f625b68fbf1a3a58f8713338) --- CONTRIBUTING.md | 256 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 219 insertions(+), 37 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd6ad5e3..59669a89 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,81 +1,263 @@ # Contributing to NVIDIA Cosmos -Thank you for your interest in contributing to NVIDIA Cosmos. This document provides guidelines and instructions for contributing. +Thank you for your interest in contributing to NVIDIA Cosmos. This guide covers how to propose changes, add new cookbooks, and maintain the quality bar we hold for community-facing content. ## Code of Conduct This project adheres to the [NVIDIA Open Source Code of Conduct](https://github.com/NVIDIA/cosmos/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior by filing an issue or contacting [cosmos-license@nvidia.com](mailto:cosmos-license@nvidia.com). +--- + ## How to Contribute ### Reporting Issues -If you encounter a bug or have a feature request, please open an issue on the [GitHub Issues](https://github.com/NVIDIA/cosmos/issues) page. When filing an issue, include: +Open an issue on [GitHub Issues](https://github.com/NVIDIA/cosmos/issues) with: -- A clear and descriptive title -- Steps to reproduce the problem (if applicable) -- Expected behavior vs. actual behavior -- Your environment details (OS, CUDA version, GPU model, Python version) +- A clear, descriptive title +- Steps to reproduce (if applicable) +- Expected vs. actual behavior +- Environment details: OS, CUDA version, GPU model, Python version, `uv` version - Relevant logs or error messages -### Submitting Changes +### Contribution Workflow -1. **Fork the repository** and create a new branch from `main`: +1. **Fork** the repository and create a branch from `main`: - ```shell - git checkout -b your-branch-name + ```bash + git checkout -b cookbook/descriptive-name # or docs/, fix/, benchmark/ ``` -2. **Make your changes.** Ensure your changes follow the project conventions and do not introduce regressions. +2. **Make your changes** following the guidelines below. -3. **Test your changes.** Verify that existing cookbooks and examples still work correctly with your modifications. +3. **Test your changes.** Run your notebook end-to-end on the target GPU. Verify existing cookbooks are unaffected. -4. **Commit your changes** with a clear, descriptive commit message: +4. **Commit** with a clear message: - ```shell - git commit -m "Brief description of the change" + ```bash + git commit -m "Add worker-safety Reasoner cookbook with vLLM backend" ``` -5. **Push to your fork** and open a Pull Request against the `main` branch of the upstream repository. +5. **Push and open a Pull Request** against `main`. ### Pull Request Guidelines - Provide a clear description of what your PR does and why -- Reference any related issues (e.g., `Fixes #123`) -- Keep PRs focused: one logical change per PR -- Ensure your branch is up to date with `main` before submitting -- Be responsive to review feedback +- Reference related issues (e.g., `Fixes #123`) +- One logical change per PR +- Ensure your branch is up to date with `main` +- Respond to review feedback promptly + +--- + +## Cookbook Structure + +The `cookbooks/` directory is organized by **model generation → tower → capability**. Each cookbook is a self-contained directory with a README, one or more runnable notebooks, and supporting assets. + +``` +cookbooks/ +└── cosmos3/ + ├── README.md # Shared setup (all backends) + ├── cosmos3-model-architecture.png + │ + ├── reasoner/ # Reasoner Tower + │ ├── README.md # Reasoner overview + backend table + │ ├── reasoner_prompt_guide.md # Prompt engineering reference + │ ├── run_with_vllm.ipynb # Cookbook: vLLM backend + │ ├── run_with_nim.ipynb # Cookbook: NIM backend + │ ├── run_with_cosmos_framework.ipynb # Cookbook: Framework backend + │ └── assets/ # Images, videos, sample outputs + │ + └── generator/ + ├── audiovisual/ # Generator: T2I, T2V, I2V, audio + │ ├── README.md + │ ├── run_with_diffusers.ipynb + │ ├── run_with_vllm_omni.ipynb + │ ├── run_with_cosmos_framework.ipynb + │ └── assets/ + │ + ├── action/ # Generator: policy, FDM, IDM + │ ├── README.md + │ ├── run_fd_with_cosmos_framework.ipynb + │ ├── run_fd_with_vllm.ipynb + │ ├── run_id_with_cosmos_framework.ipynb + │ ├── run_id_with_vllm.ipynb + │ ├── run_policy_with_cosmos_framework.md + │ └── assets/ + │ + └── transfer/ # Generator: video-to-video transfer + ├── README.md + ├── run_video_transfer_with_cosmos_framework.ipynb + ├── preview_helpers.py + ├── specs/ + └── assets/ +``` + +### Where Does My Cookbook Go? + +| Your cookbook does... | Place it under | +|----------------------|---------------| +| Image/video understanding, VLM, reasoning, grounding | `cookbooks/cosmos3/reasoner/` | +| Text-to-image, text-to-video, image-to-video, audio | `cookbooks/cosmos3/generator/audiovisual/` | +| Robotics policy, forward/inverse dynamics | `cookbooks/cosmos3/generator/action/` | +| Video-to-video style transfer, edge-guided generation | `cookbooks/cosmos3/generator/transfer/` | + +If your cookbook spans multiple towers (e.g., Reasoner analysis → Generator synthesis), create a new directory under `cookbooks/cosmos3/` with a clear name (e.g., `cookbooks/cosmos3/end2end/`). + +--- + +## Cookbook Quality Requirements + +Every cookbook merged into this repo must meet these requirements. Reviewers will check each item. + +### 1. Open-Access Data Only + +- All datasets must be **publicly downloadable** without NVIDIA-internal credentials +- Acceptable sources: HuggingFace Hub (public or gated with free access), public URLs, synthetic data generated in the notebook +- If working with partners, request a **small public subset** for the cookbook example +- Include the dataset license in your README + +**Not acceptable:** Internal S3 buckets, VPN-only URLs, private NFS mounts, datasets requiring paid partner agreements + +### 2. Results / Expected Output + +Every cookbook must include a **Results** section showing what a successful run looks like: + +- **Inference cookbooks:** Sample generated images/videos, text outputs, or action trajectories saved to `assets/` +- **Post-training cookbooks:** Training loss curves, before/after comparison, evaluation metrics +- **Timing benchmarks:** Wall-clock time on the target GPU (e.g., "Cosmos3-Nano T2V: 45s on 1× A100") + +This lets developers validate their own runs against a known-good baseline. + +### 3. Canonical Setup (No Hidden Dependencies) + +- **Do not duplicate setup instructions.** Link to the shared [`cookbooks/cosmos3/README.md`](cookbooks/cosmos3/README.md) for backend installation (Cosmos Framework, Diffusers, vLLM, NIM) +- Your README should only document **cookbook-specific** dependencies beyond the shared setup +- All dependencies must be installable via `uv pip install` or `apt-get` — no manual builds +- Pin specific versions of critical packages when they affect reproducibility + +### 4. One-Click Runnable + +- Each notebook should run **top-to-bottom without manual intervention** +- Use environment variables for configurable paths (`HF_TOKEN`, `COSMOS3_MEDIA_ROOT`, etc.) +- Default to the smallest model size (Cosmos3-Nano) so the widest set of GPUs can run it +- If a cookbook requires a running server (vLLM, NIM), provide the exact launch command in the README and automate the health check in the notebook + +### 5. Naming Convention + +Follow the existing pattern: + +``` +run__with_.ipynb +``` + +Examples: +- `run_with_vllm.ipynb` — generic Reasoner inference via vLLM +- `run_fd_with_cosmos_framework.ipynb` — forward dynamics via Cosmos Framework +- `run_video_transfer_with_cosmos_framework.ipynb` — video transfer via Cosmos Framework + +For markdown-only guides (no notebook): `run__with_.md` + +--- + +## Cookbook README Template + +Each cookbook directory needs a `README.md`. Use this structure: + +```markdown +# [Cookbook Title] + +One-paragraph description of what this cookbook demonstrates and why it matters. + +## What You'll Build + +- Bullet list of concrete outputs (e.g., "Generate a 480p video from a text prompt") + +## Prerequisites + +- Link to [shared setup](../README.md#backend-name) for backend installation +- Any additional cookbook-specific requirements + +## Backends + +| Backend | Notebook | GPU Requirement | +|---------|----------|----------------| +| vLLM | [`run_with_vllm.ipynb`](run_with_vllm.ipynb) | 1× A100 (80 GB) | +| NIM | [`run_with_nim.ipynb`](run_with_nim.ipynb) | 1× A100 (80 GB) | + +## Quick Start + +Minimal steps to go from clone to first result: + + 1. Set up the backend (link) + 2. Run the notebook + 3. Check your outputs in `assets/` + +## Results / Expected Output + +Sample outputs, metrics, and timing benchmarks from a successful run. + +## Dataset + +| Name | Source | License | Size | +|------|--------|---------|------| +| Dataset Name | [HuggingFace link](...) | Apache 2.0 | ~2 GB | +``` + +--- + +## Contribution Areas + +We welcome contributions in these areas: + +| Area | Examples | +|------|---------| +| **New cookbooks** | Domain-specific applications (robotics, AV, healthcare, manufacturing) | +| **New backends** | Additional serving/inference backends for existing cookbooks | +| **Documentation** | README improvements, prompt guides, architecture explanations | +| **Bug fixes** | Notebook fixes, broken links, version compatibility issues | +| **Benchmarks** | Inference timing across GPU configurations (A100, H100, L40S, RTX 4090) | +| **Post-training recipes** | SFT, LoRA, domain adaptation examples with open datasets | + +### What We Won't Merge + +- Cookbooks that depend on internal/proprietary datasets +- Notebooks that require manual mid-run intervention +- Changes that break existing cookbook functionality +- Generated binary files (model weights, large media) — use HuggingFace/external links instead + +--- ## Development Setup ### Prerequisites - Python 3.10 or later -- CUDA 12.8 or 13.x (see [Troubleshooting](README.md#troubleshooting) for version matching) +- CUDA 12.8 or 13.x (see [Troubleshooting](README.md#troubleshooting)) - An NVIDIA GPU with sufficient VRAM for your target workflow -- `uv` >= 0.11.3 (install from [astral.sh/uv](https://astral.sh/uv)) +- `uv` >= 0.11.3 ([astral.sh/uv](https://astral.sh/uv)) +- `git-lfs` installed (`apt-get install git-lfs`) ### Getting Started -1. Clone the repository: +```bash +git clone https://github.com/NVIDIA/cosmos.git +cd cosmos +``` - ```shell - git clone https://github.com/NVIDIA/cosmos.git - cd cosmos - ``` - -2. Set up your environment following the instructions in the [README](README.md). +Follow [cookbooks/cosmos3/README.md](cookbooks/cosmos3/README.md) to set up the backend(s) your cookbook uses. -3. Explore the [cookbooks](cookbooks/) for end-to-end examples of Generator and Reasoner workflows. +### Testing Your Cookbook -## Contribution Areas +Before submitting: -We welcome contributions in the following areas: +1. **Clean run:** Restart your kernel and run all cells top-to-bottom +2. **Minimal GPU:** Test on the smallest supported GPU configuration +3. **No secrets:** Verify no API keys, tokens, or internal paths are committed +4. **Output cells:** Clear large output cells but keep the Results section outputs +5. **File sizes:** Ensure no single file exceeds 10 MB (use git-lfs for larger assets or link externally) -- **Cookbooks and examples:** New notebooks demonstrating Cosmos 3 capabilities -- **Documentation:** Improvements to README, cookbook READMEs, or inline documentation -- **Bug fixes:** Fixes for issues in existing code or documentation -- **Benchmarks:** Additional inference benchmark results across different hardware configurations +--- ## License @@ -83,4 +265,4 @@ By contributing to this project, you agree that your contributions will be licen ## Questions? -If you have questions about contributing, feel free to open an issue or reach out at [cosmos-license@nvidia.com](mailto:cosmos-license@nvidia.com). +If you have questions about contributing, open an issue or reach out at [cosmos-license@nvidia.com](mailto:cosmos-license@nvidia.com). From 8818044aff5b6a7f56ff43d110bbbc4c7b54b296 Mon Sep 17 00:00:00 2001 From: paularamo Date: Mon, 15 Jun 2026 14:18:49 -0400 Subject: [PATCH 2/4] Restructure cookbooks into basic_examples/ to prepare for community contributions Move all existing notebooks, assets, specs, and helpers into basic_examples/ subdirectories under each tower (reasoner, generator/audiovisual, generator/action, generator/transfer). This creates clean top-level directories ready to receive community-contributed cookbooks as sibling folders alongside basic_examples/. - reasoner/basic_examples/: 3 notebooks + prompt guide + 15 media assets - generator/audiovisual/basic_examples/: 3 notebooks + prompts/images - generator/action/basic_examples/: 5 notebooks + action/robot assets - generator/transfer/basic_examples/: 1 notebook + specs + control videos - Updated all 4 tower READMEs with basic_examples/ cookbook tables and paths - Updated CONTRIBUTING.md directory tree to show contribution placement (cherry picked from commit cd95eccceb30733b1a5b0493fe947f2963c4e119) --- CONTRIBUTING.md | 49 +++++++++++------- cookbooks/cosmos3/generator/action/README.md | 40 +++++++++----- .../assets/actions/av_traj_forward.json | 0 .../assets/actions/av_traj_left.json | 0 .../assets/actions/av_traj_right.json | 0 .../assets/actions/umi.json | 0 .../data/chunk-000/file-000.parquet | Bin .../meta/episodes/chunk-000/file-000.parquet | Bin .../droid_lerobot_example/meta/info.json | 0 .../droid_lerobot_example/meta/tasks.parquet | Bin .../chunk-000/file-000.mp4 | Bin .../chunk-000/file-000.mp4 | Bin .../chunk-000/file-000.mp4 | Bin .../assets/images/av_0.jpg | Bin .../assets/images/av_1.jpg | Bin .../assets/images/umi.png | Bin .../assets/videos/av_0.mp4 | Bin .../assets/videos/av_1.mp4 | Bin .../assets/videos/robolab_example_rollout.mp4 | Bin .../assets/videos/umi.mp4 | Bin .../run_fd_with_cosmos_framework.ipynb | 0 .../run_fd_with_vllm.ipynb | 0 .../run_id_with_cosmos_framework.ipynb | 0 .../run_id_with_vllm.ipynb | 0 .../run_policy_with_cosmos_framework.md | 0 .../cosmos3/generator/audiovisual/README.md | 36 ++++++++----- .../assets/images/image2video/car_driving.jpg | Bin .../images/image2video/coastal_road_audio.jpg | Bin .../images/image2video/humanoid_robot.jpg | Bin .../image2video/neg_prompt.json | 0 .../text2video/neg_prompt.json | 0 .../prompts/image2video/car_driving.json | 0 .../image2video/coastal_road_audio.json | 0 .../prompts/image2video/humanoid_robot.json | 0 .../prompts/text2image/robot_draping.json | 0 .../prompts/text2video/car_colliding.json | 0 .../prompts/text2video/robot_kitchen.json | 0 .../text2video/robot_pouring_water_audio.json | 0 .../run_with_cosmos_framework.ipynb | 0 .../run_with_diffusers.ipynb | 0 .../run_with_vllm_omni.ipynb | 0 .../cosmos3/generator/transfer/README.md | 46 ++++++++++------ .../assets/blur/control_blur.mp4 | Bin .../assets/blur/prompt.json | 0 .../assets/depth/control_depth.mp4 | Bin .../assets/depth/prompt.json | 0 .../assets/edge/control_edge.mp4 | Bin .../assets/edge/prompt.json | 0 .../assets/negative_prompt.json | 0 .../assets/seg/control_seg.mp4 | Bin .../assets/seg/prompt.json | 0 .../assets/wsm/control_wsm.mp4 | Bin .../assets/wsm/prompt.json | 0 .../{ => basic_examples}/preview_helpers.py | 0 ...video_transfer_with_cosmos_framework.ipynb | 0 .../{ => basic_examples}/specs/blur.json | 0 .../{ => basic_examples}/specs/depth.json | 0 .../{ => basic_examples}/specs/edge.json | 0 .../{ => basic_examples}/specs/seg.json | 0 .../{ => basic_examples}/specs/wsm.json | 0 cookbooks/cosmos3/reasoner/README.md | 33 ++++++++---- .../assets/action_cot_driving_scene.mp4 | Bin .../assets/action_cot_trajectory.png | Bin .../assets/assisted_task_next_action.mp4 | Bin .../assets/common_sense_reasoning.mp4 | Bin .../assets/describe_anything.png | Bin .../assets/drive_scene_next_action.mp4 | Bin .../assets/grounding_2d.png | Bin .../assets/physical_plausibility.mp4 | Bin .../{ => basic_examples}/assets/robot_153.jpg | Bin .../assets/robot_planning.png | Bin .../assets/robotics_next_action.mp4 | Bin .../assets/situation_understanding.mp4 | Bin .../assets/temporal_localization_1.mp4 | Bin .../assets/temporal_localization_2.mp4 | Bin .../assets/video_caption.mp4 | Bin .../reasoner_prompt_guide.md | 0 .../run_with_cosmos_framework.ipynb | 0 .../{ => basic_examples}/run_with_nim.ipynb | 0 .../{ => basic_examples}/run_with_vllm.ipynb | 0 80 files changed, 134 insertions(+), 70 deletions(-) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/actions/av_traj_forward.json (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/actions/av_traj_left.json (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/actions/av_traj_right.json (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/actions/umi.json (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/data/chunk-000/file-000.parquet (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/meta/episodes/chunk-000/file-000.parquet (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/meta/info.json (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/meta/tasks.parquet (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/videos/observation.image.exterior_image_1_left/chunk-000/file-000.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/videos/observation.image.exterior_image_2_left/chunk-000/file-000.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/droid_lerobot_example/videos/observation.image.wrist_image_left/chunk-000/file-000.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/images/av_0.jpg (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/images/av_1.jpg (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/images/umi.png (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/videos/av_0.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/videos/av_1.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/videos/robolab_example_rollout.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/assets/videos/umi.mp4 (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/run_fd_with_cosmos_framework.ipynb (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/run_fd_with_vllm.ipynb (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/run_id_with_cosmos_framework.ipynb (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/run_id_with_vllm.ipynb (100%) rename cookbooks/cosmos3/generator/action/{ => basic_examples}/run_policy_with_cosmos_framework.md (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/images/image2video/car_driving.jpg (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/images/image2video/coastal_road_audio.jpg (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/images/image2video/humanoid_robot.jpg (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/negative_prompts/image2video/neg_prompt.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/negative_prompts/text2video/neg_prompt.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/image2video/car_driving.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/image2video/coastal_road_audio.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/image2video/humanoid_robot.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/text2image/robot_draping.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/text2video/car_colliding.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/text2video/robot_kitchen.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/assets/prompts/text2video/robot_pouring_water_audio.json (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/run_with_cosmos_framework.ipynb (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/run_with_diffusers.ipynb (100%) rename cookbooks/cosmos3/generator/audiovisual/{ => basic_examples}/run_with_vllm_omni.ipynb (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/blur/control_blur.mp4 (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/blur/prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/depth/control_depth.mp4 (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/depth/prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/edge/control_edge.mp4 (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/edge/prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/negative_prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/seg/control_seg.mp4 (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/seg/prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/wsm/control_wsm.mp4 (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/assets/wsm/prompt.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/preview_helpers.py (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/run_video_transfer_with_cosmos_framework.ipynb (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/specs/blur.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/specs/depth.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/specs/edge.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/specs/seg.json (100%) rename cookbooks/cosmos3/generator/transfer/{ => basic_examples}/specs/wsm.json (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/action_cot_driving_scene.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/action_cot_trajectory.png (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/assisted_task_next_action.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/common_sense_reasoning.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/describe_anything.png (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/drive_scene_next_action.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/grounding_2d.png (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/physical_plausibility.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/robot_153.jpg (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/robot_planning.png (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/robotics_next_action.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/situation_understanding.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/temporal_localization_1.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/temporal_localization_2.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/assets/video_caption.mp4 (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/reasoner_prompt_guide.md (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/run_with_cosmos_framework.ipynb (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/run_with_nim.ipynb (100%) rename cookbooks/cosmos3/reasoner/{ => basic_examples}/run_with_vllm.ipynb (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 59669a89..48c67c1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,35 +62,46 @@ cookbooks/ │ ├── reasoner/ # Reasoner Tower │ ├── README.md # Reasoner overview + backend table - │ ├── reasoner_prompt_guide.md # Prompt engineering reference - │ ├── run_with_vllm.ipynb # Cookbook: vLLM backend - │ ├── run_with_nim.ipynb # Cookbook: NIM backend - │ ├── run_with_cosmos_framework.ipynb # Cookbook: Framework backend - │ └── assets/ # Images, videos, sample outputs + │ ├── basic_examples/ # Shipped starter cookbooks + │ │ ├── reasoner_prompt_guide.md + │ │ ├── run_with_vllm.ipynb + │ │ ├── run_with_nim.ipynb + │ │ ├── run_with_cosmos_framework.ipynb + │ │ └── assets/ + │ └── / # ← Community contributions go here + │ ├── README.md + │ ├── run__with_.ipynb + │ └── assets/ │ └── generator/ ├── audiovisual/ # Generator: T2I, T2V, I2V, audio │ ├── README.md - │ ├── run_with_diffusers.ipynb - │ ├── run_with_vllm_omni.ipynb - │ ├── run_with_cosmos_framework.ipynb - │ └── assets/ + │ ├── basic_examples/ # Shipped starter cookbooks + │ │ ├── run_with_diffusers.ipynb + │ │ ├── run_with_vllm_omni.ipynb + │ │ ├── run_with_cosmos_framework.ipynb + │ │ └── assets/ + │ └── / # ← Community contributions go here │ ├── action/ # Generator: policy, FDM, IDM │ ├── README.md - │ ├── run_fd_with_cosmos_framework.ipynb - │ ├── run_fd_with_vllm.ipynb - │ ├── run_id_with_cosmos_framework.ipynb - │ ├── run_id_with_vllm.ipynb - │ ├── run_policy_with_cosmos_framework.md - │ └── assets/ + │ ├── basic_examples/ # Shipped starter cookbooks + │ │ ├── run_fd_with_cosmos_framework.ipynb + │ │ ├── run_fd_with_vllm.ipynb + │ │ ├── run_id_with_cosmos_framework.ipynb + │ │ ├── run_id_with_vllm.ipynb + │ │ ├── run_policy_with_cosmos_framework.md + │ │ └── assets/ + │ └── / # ← Community contributions go here │ └── transfer/ # Generator: video-to-video transfer ├── README.md - ├── run_video_transfer_with_cosmos_framework.ipynb - ├── preview_helpers.py - ├── specs/ - └── assets/ + ├── basic_examples/ # Shipped starter cookbooks + │ ├── run_video_transfer_with_cosmos_framework.ipynb + │ ├── preview_helpers.py + │ ├── specs/ + │ └── assets/ + └── / # ← Community contributions go here ``` ### Where Does My Cookbook Go? diff --git a/cookbooks/cosmos3/generator/action/README.md b/cookbooks/cosmos3/generator/action/README.md index 6158764f..e289f7e5 100644 --- a/cookbooks/cosmos3/generator/action/README.md +++ b/cookbooks/cosmos3/generator/action/README.md @@ -1,8 +1,24 @@ -# Cosmos3 Generator Action Examples +# Cosmos3 Generator Action Cookbooks -Cosmos3-Nano action-generation examples across two inference backends — native -PyTorch (Cosmos Framework) and vLLM-Omni. Both backends use the sample assets -under [`assets/`](./assets) and cover two tasks: +Cosmos3-Nano action-generation cookbooks across two inference backends — native +PyTorch (Cosmos Framework) and vLLM-Omni. + +## Basic Examples + +The [`basic_examples/`](./basic_examples/) directory contains the shipped starter +cookbooks and sample assets. Community-contributed cookbooks are added as sibling +directories alongside `basic_examples/` — see the +[Contributing Guide](../../../../CONTRIBUTING.md) for the recipe structure. + +| Cookbook | Backend | Notebook | +|---------|---------|----------| +| Forward dynamics (AV, DROID, UMI) | Cosmos Framework | [`basic_examples/run_fd_with_cosmos_framework.ipynb`](./basic_examples/run_fd_with_cosmos_framework.ipynb) | +| Inverse dynamics (AV) | Cosmos Framework | [`basic_examples/run_id_with_cosmos_framework.ipynb`](./basic_examples/run_id_with_cosmos_framework.ipynb) | +| Policy (DROID) | Cosmos Framework | [`basic_examples/run_policy_with_cosmos_framework.md`](./basic_examples/run_policy_with_cosmos_framework.md) | +| Forward dynamics (AV, DROID, UMI) | vLLM-Omni | [`basic_examples/run_fd_with_vllm.ipynb`](./basic_examples/run_fd_with_vllm.ipynb) | +| Inverse dynamics (AV) | vLLM-Omni | [`basic_examples/run_id_with_vllm.ipynb`](./basic_examples/run_id_with_vllm.ipynb) | + +Both backends use the sample assets under [`basic_examples/assets/`](./basic_examples/assets/) and cover two tasks: - **Forward dynamics (`fd`)** — predict future observations from a start image plus an action trajectory (AV, DROID, and UMI robotics examples) using the Cosmos3-Nano. @@ -68,7 +84,7 @@ torchrun --nproc-per-node=1 \ The input spec pairs a start image with an action trajectory. The notebooks assemble ready-to-run specs for AV, DROID, and UMI examples from the checked-in -assets under [`assets/`](./assets). Outputs are written under the framework +assets under [`basic_examples/assets/`](./basic_examples/assets/). Outputs are written under the framework checkout. ### Cosmos Framework Walkthrough @@ -76,11 +92,11 @@ checkout. The Cosmos Framework build their input spec, run inference, and visualize the generated videos: -- [`run_fd_with_cosmos_framework.ipynb`](./run_fd_with_cosmos_framework.ipynb) — +- [`run_fd_with_cosmos_framework.ipynb`](./basic_examples/run_fd_with_cosmos_framework.ipynb) — forward dynamics for AV, DROID, and UMI robotics examples using Cosmos3-Nano. -- [`run_id_with_cosmos_framework.ipynb`](./run_id_with_cosmos_framework.ipynb) — +- [`run_id_with_cosmos_framework.ipynb`](./basic_examples/run_id_with_cosmos_framework.ipynb) — inverse dynamics, predicting ego-motion trajectories from input AV videos using Cosmos3-Nano. -- [`run_policy_with_cosmos_framework.md`](./run_policy_with_cosmos_framework.md) - policy, predicting future observations and action trajectories for DROID robot using Cosmos3-Nano-Policy-DROID. +- [`run_policy_with_cosmos_framework.md`](./basic_examples/run_policy_with_cosmos_framework.md) - policy, predicting future observations and action trajectories for DROID robot using Cosmos3-Nano-Policy-DROID. ## Run with vLLM-Omni @@ -100,8 +116,8 @@ curl http://localhost:8001/v1/models Forward-dynamics requests are multipart `POST`s to `/v1/videos` — a start image under `files={"input_reference": ...}` plus an `extra_params` payload carrying the action trajectory. The vLLM notebooks use these diffusion defaults for action -generation (see [`run_fd_with_vllm.ipynb`](./run_fd_with_vllm.ipynb) and -[`run_id_with_vllm.ipynb`](./run_id_with_vllm.ipynb)): +generation (see [`run_fd_with_vllm.ipynb`](./basic_examples/run_fd_with_vllm.ipynb) and +[`run_id_with_vllm.ipynb`](./basic_examples/run_id_with_vllm.ipynb)): | Field | Value | | --- | --- | @@ -117,9 +133,9 @@ including autoregressive chunked generation for the robotics examples. The vLLM-Omni notebooks send requests through the OpenAI-compatible video API and write outputs under `outputs/cosmos3_action_vllm/`: -- [`run_fd_with_vllm.ipynb`](./run_fd_with_vllm.ipynb) — forward dynamics for AV, +- [`run_fd_with_vllm.ipynb`](./basic_examples/run_fd_with_vllm.ipynb) — forward dynamics for AV, DROID, and UMI robotics examples. -- [`run_id_with_vllm.ipynb`](./run_id_with_vllm.ipynb) — inverse dynamics, +- [`run_id_with_vllm.ipynb`](./basic_examples/run_id_with_vllm.ipynb) — inverse dynamics, predicting ego-motion trajectories from input AV videos. diff --git a/cookbooks/cosmos3/generator/action/assets/actions/av_traj_forward.json b/cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_forward.json similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/actions/av_traj_forward.json rename to cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_forward.json diff --git a/cookbooks/cosmos3/generator/action/assets/actions/av_traj_left.json b/cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_left.json similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/actions/av_traj_left.json rename to cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_left.json diff --git a/cookbooks/cosmos3/generator/action/assets/actions/av_traj_right.json b/cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_right.json similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/actions/av_traj_right.json rename to cookbooks/cosmos3/generator/action/basic_examples/assets/actions/av_traj_right.json diff --git a/cookbooks/cosmos3/generator/action/assets/actions/umi.json b/cookbooks/cosmos3/generator/action/basic_examples/assets/actions/umi.json similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/actions/umi.json rename to cookbooks/cosmos3/generator/action/basic_examples/assets/actions/umi.json diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/data/chunk-000/file-000.parquet b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/data/chunk-000/file-000.parquet similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/data/chunk-000/file-000.parquet rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/data/chunk-000/file-000.parquet diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/episodes/chunk-000/file-000.parquet b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/episodes/chunk-000/file-000.parquet similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/episodes/chunk-000/file-000.parquet rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/episodes/chunk-000/file-000.parquet diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/info.json b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/info.json similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/info.json rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/info.json diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/tasks.parquet b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/tasks.parquet similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/meta/tasks.parquet rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/meta/tasks.parquet diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.exterior_image_1_left/chunk-000/file-000.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.exterior_image_1_left/chunk-000/file-000.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.exterior_image_1_left/chunk-000/file-000.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.exterior_image_1_left/chunk-000/file-000.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.exterior_image_2_left/chunk-000/file-000.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.exterior_image_2_left/chunk-000/file-000.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.exterior_image_2_left/chunk-000/file-000.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.exterior_image_2_left/chunk-000/file-000.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.wrist_image_left/chunk-000/file-000.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.wrist_image_left/chunk-000/file-000.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/droid_lerobot_example/videos/observation.image.wrist_image_left/chunk-000/file-000.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/droid_lerobot_example/videos/observation.image.wrist_image_left/chunk-000/file-000.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/images/av_0.jpg b/cookbooks/cosmos3/generator/action/basic_examples/assets/images/av_0.jpg similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/images/av_0.jpg rename to cookbooks/cosmos3/generator/action/basic_examples/assets/images/av_0.jpg diff --git a/cookbooks/cosmos3/generator/action/assets/images/av_1.jpg b/cookbooks/cosmos3/generator/action/basic_examples/assets/images/av_1.jpg similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/images/av_1.jpg rename to cookbooks/cosmos3/generator/action/basic_examples/assets/images/av_1.jpg diff --git a/cookbooks/cosmos3/generator/action/assets/images/umi.png b/cookbooks/cosmos3/generator/action/basic_examples/assets/images/umi.png similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/images/umi.png rename to cookbooks/cosmos3/generator/action/basic_examples/assets/images/umi.png diff --git a/cookbooks/cosmos3/generator/action/assets/videos/av_0.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/videos/av_0.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/videos/av_0.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/videos/av_0.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/videos/av_1.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/videos/av_1.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/videos/av_1.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/videos/av_1.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/videos/robolab_example_rollout.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/videos/robolab_example_rollout.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/videos/robolab_example_rollout.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/videos/robolab_example_rollout.mp4 diff --git a/cookbooks/cosmos3/generator/action/assets/videos/umi.mp4 b/cookbooks/cosmos3/generator/action/basic_examples/assets/videos/umi.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/action/assets/videos/umi.mp4 rename to cookbooks/cosmos3/generator/action/basic_examples/assets/videos/umi.mp4 diff --git a/cookbooks/cosmos3/generator/action/run_fd_with_cosmos_framework.ipynb b/cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_cosmos_framework.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/action/run_fd_with_cosmos_framework.ipynb rename to cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_cosmos_framework.ipynb diff --git a/cookbooks/cosmos3/generator/action/run_fd_with_vllm.ipynb b/cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_vllm.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/action/run_fd_with_vllm.ipynb rename to cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_vllm.ipynb diff --git a/cookbooks/cosmos3/generator/action/run_id_with_cosmos_framework.ipynb b/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/action/run_id_with_cosmos_framework.ipynb rename to cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb diff --git a/cookbooks/cosmos3/generator/action/run_id_with_vllm.ipynb b/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/action/run_id_with_vllm.ipynb rename to cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb diff --git a/cookbooks/cosmos3/generator/action/run_policy_with_cosmos_framework.md b/cookbooks/cosmos3/generator/action/basic_examples/run_policy_with_cosmos_framework.md similarity index 100% rename from cookbooks/cosmos3/generator/action/run_policy_with_cosmos_framework.md rename to cookbooks/cosmos3/generator/action/basic_examples/run_policy_with_cosmos_framework.md diff --git a/cookbooks/cosmos3/generator/audiovisual/README.md b/cookbooks/cosmos3/generator/audiovisual/README.md index d80adad4..fbe388f4 100644 --- a/cookbooks/cosmos3/generator/audiovisual/README.md +++ b/cookbooks/cosmos3/generator/audiovisual/README.md @@ -1,14 +1,26 @@ -# Cosmos3 Generator Audiovisual Examples +# Cosmos3 Generator Audiovisual Cookbooks Generate images and video (with optional audio) from text or image prompts with -`Cosmos3-Nano` and `Cosmos3-Super`, across three inference backends. Sample -prompts live under [`assets/`](./assets). +`Cosmos3-Nano` and `Cosmos3-Super`, across three inference backends. Environment setup for every backend is centralized in the shared [Cosmos3 cookbooks environment setup](../../README.md) guide; each backend below links to the section you need. The quickstarts are minimal text-to-video examples to get one generation running per backend — run them from this folder. +## Basic Examples + +The [`basic_examples/`](./basic_examples/) directory contains the shipped starter +cookbooks and sample prompts. Community-contributed cookbooks are added as sibling +directories alongside `basic_examples/` — see the +[Contributing Guide](../../../../CONTRIBUTING.md) for the recipe structure. + +| Cookbook | Backend | Notebook | +|---------|---------|----------| +| T2I / T2V / I2V + audio | Cosmos Framework | [`basic_examples/run_with_cosmos_framework.ipynb`](./basic_examples/run_with_cosmos_framework.ipynb) | +| T2I / T2V / I2V + audio | Diffusers | [`basic_examples/run_with_diffusers.ipynb`](./basic_examples/run_with_diffusers.ipynb) | +| T2I / T2V / I2V + audio | vLLM-Omni | [`basic_examples/run_with_vllm_omni.ipynb`](./basic_examples/run_with_vllm_omni.ipynb) | + Generator requires the Guardrail. Request access to the gated [nvidia/Cosmos-1.0-Guardrail](https://huggingface.co/nvidia/Cosmos-1.0-Guardrail) HF repository before running these examples. To disable the guardrail, set @@ -31,12 +43,12 @@ import json from pathlib import Path prompt = json.dumps( - json.load(open("assets/prompts/text2video/robot_kitchen.json")), + json.load(open("basic_examples/assets/prompts/text2video/robot_kitchen.json")), ensure_ascii=True, separators=(",", ":"), ) negative = json.dumps( - json.load(open("assets/negative_prompts/text2video/neg_prompt.json")), + json.load(open("basic_examples/assets/negative_prompts/text2video/neg_prompt.json")), ensure_ascii=True, separators=(",", ":"), ) @@ -72,7 +84,7 @@ more GPUs via `--nproc-per-node`. ### Notebook walkthrough -[`run_with_cosmos_framework.ipynb`](./run_with_cosmos_framework.ipynb) is the full +[`run_with_cosmos_framework.ipynb`](./basic_examples/run_with_cosmos_framework.ipynb) is the full tutorial for the native PyTorch backend: it covers every use case — text-to-image, text-to-video, image-to-video, with audio on or off — and includes the detailed, environment-aware setup and visualization for each generation. @@ -91,8 +103,8 @@ from diffusers import Cosmos3OmniPipeline from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler from diffusers.utils import export_to_video -prompt = json.load(open("assets/prompts/text2video/robot_kitchen.json")) -negative = json.load(open("assets/negative_prompts/text2video/neg_prompt.json")) +prompt = json.load(open("basic_examples/assets/prompts/text2video/robot_kitchen.json")) +negative = json.load(open("basic_examples/assets/negative_prompts/text2video/neg_prompt.json")) pipe = Cosmos3OmniPipeline.from_pretrained( "nvidia/Cosmos3-Nano", torch_dtype=torch.bfloat16, device_map="cuda" @@ -122,7 +134,7 @@ To run **Cosmos3-Super** instead, load the larger checkpoint: ### Notebook walkthrough -[`run_with_diffusers.ipynb`](./run_with_diffusers.ipynb) is the full tutorial for +[`run_with_diffusers.ipynb`](./basic_examples/run_with_diffusers.ipynb) is the full tutorial for the Diffusers backend: it provisions a dedicated venv, then walks through text-to-image, text-to-video, and image-to-video generation (with and without audio) using `Cosmos3OmniPipeline`, including how to preview the generated media. @@ -145,8 +157,8 @@ from pathlib import Path import requests -prompt = json.load(open("assets/prompts/text2video/robot_kitchen.json")) -negative = json.load(open("assets/negative_prompts/text2video/neg_prompt.json")) +prompt = json.load(open("basic_examples/assets/prompts/text2video/robot_kitchen.json")) +negative = json.load(open("basic_examples/assets/negative_prompts/text2video/neg_prompt.json")) response = requests.post( "http://localhost:8000/v1/videos/sync", @@ -179,7 +191,7 @@ For image-to-video, post to the same endpoint with an image under ### Notebook walkthrough -[`run_with_vllm_omni.ipynb`](./run_with_vllm_omni.ipynb) is the full tutorial for +[`run_with_vllm_omni.ipynb`](./basic_examples/run_with_vllm_omni.ipynb) is the full tutorial for the vLLM-Omni backend: it walks through text-to-image, text-to-video, and image-to-video requests with audio on or off. Server launch options (Nano and Super, tensor parallelism, layerwise offload, and CFG-parallel variants) live in diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/car_driving.jpg b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/car_driving.jpg similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/car_driving.jpg rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/car_driving.jpg diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/coastal_road_audio.jpg b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/coastal_road_audio.jpg similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/coastal_road_audio.jpg rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/coastal_road_audio.jpg diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/humanoid_robot.jpg b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/humanoid_robot.jpg similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/images/image2video/humanoid_robot.jpg rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/images/image2video/humanoid_robot.jpg diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/negative_prompts/image2video/neg_prompt.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/negative_prompts/image2video/neg_prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/negative_prompts/image2video/neg_prompt.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/negative_prompts/image2video/neg_prompt.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/negative_prompts/text2video/neg_prompt.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/negative_prompts/text2video/neg_prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/negative_prompts/text2video/neg_prompt.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/negative_prompts/text2video/neg_prompt.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/car_driving.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/car_driving.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/car_driving.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/car_driving.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/coastal_road_audio.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/coastal_road_audio.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/coastal_road_audio.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/coastal_road_audio.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/humanoid_robot.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/humanoid_robot.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/image2video/humanoid_robot.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/image2video/humanoid_robot.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2image/robot_draping.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2image/robot_draping.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2image/robot_draping.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2image/robot_draping.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/car_colliding.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/car_colliding.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/car_colliding.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/car_colliding.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/robot_kitchen.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/robot_kitchen.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/robot_kitchen.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/robot_kitchen.json diff --git a/cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/robot_pouring_water_audio.json b/cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/robot_pouring_water_audio.json similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/assets/prompts/text2video/robot_pouring_water_audio.json rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/assets/prompts/text2video/robot_pouring_water_audio.json diff --git a/cookbooks/cosmos3/generator/audiovisual/run_with_cosmos_framework.ipynb b/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_cosmos_framework.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/run_with_cosmos_framework.ipynb rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_cosmos_framework.ipynb diff --git a/cookbooks/cosmos3/generator/audiovisual/run_with_diffusers.ipynb b/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_diffusers.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/run_with_diffusers.ipynb rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_diffusers.ipynb diff --git a/cookbooks/cosmos3/generator/audiovisual/run_with_vllm_omni.ipynb b/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_vllm_omni.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/audiovisual/run_with_vllm_omni.ipynb rename to cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_vllm_omni.ipynb diff --git a/cookbooks/cosmos3/generator/transfer/README.md b/cookbooks/cosmos3/generator/transfer/README.md index 0c477056..8c849185 100644 --- a/cookbooks/cosmos3/generator/transfer/README.md +++ b/cookbooks/cosmos3/generator/transfer/README.md @@ -1,7 +1,19 @@ -# Cosmos3 Generator Transfer Examples +# Cosmos3 Generator Transfer Cookbooks -Cosmos3-Nano video **transfer** examples on the native PyTorch (Cosmos Framework) path. -Sample assets under [`assets/`](./assets) cover spatial control signals paired with +Cosmos3-Nano video **transfer** cookbooks on the native PyTorch (Cosmos Framework) path. + +## Basic Examples + +The [`basic_examples/`](./basic_examples/) directory contains the shipped starter +cookbook and sample assets. Community-contributed cookbooks are added as sibling +directories alongside `basic_examples/` — see the +[Contributing Guide](../../../../CONTRIBUTING.md) for the recipe structure. + +| Cookbook | Backend | Notebook | +|---------|---------|----------| +| Video transfer (edge, blur, depth, seg, wsm) | Cosmos Framework | [`basic_examples/run_video_transfer_with_cosmos_framework.ipynb`](./basic_examples/run_video_transfer_with_cosmos_framework.ipynb) | + +Sample assets under [`basic_examples/assets/`](./basic_examples/assets/) cover spatial control signals paired with `prompt.json` files: - **Edge (Canny)** — edge map control plus caption. @@ -26,11 +38,11 @@ come from the control video; see the spec field reference for how `fps` and | Control | Asset folder | Inference input | Generation duration | | --- | --- | --- | --- | -| Edge (Canny) | `assets/edge/` | `control_edge.mp4` + `prompt.json` | 121 frames @ 30 FPS | -| Blur | `assets/blur/` | `control_blur.mp4` + `prompt.json` | 121 frames @ 30 FPS | -| Depth | `assets/depth/` | `control_depth.mp4` + `prompt.json` | 121 frames @ 30 FPS | -| Segmentation | `assets/seg/` | `control_seg.mp4` + `prompt.json` | 121 frames @ 30 FPS | -| World scenario (WSM) | `assets/wsm/` | `control_wsm.mp4` + `prompt.json` | 101 frames @ 10 FPS | +| Edge (Canny) | `basic_examples/assets/edge/` | `control_edge.mp4` + `prompt.json` | 121 frames @ 30 FPS | +| Blur | `basic_examples/assets/blur/` | `control_blur.mp4` + `prompt.json` | 121 frames @ 30 FPS | +| Depth | `basic_examples/assets/depth/` | `control_depth.mp4` + `prompt.json` | 121 frames @ 30 FPS | +| Segmentation | `basic_examples/assets/seg/` | `control_seg.mp4` + `prompt.json` | 121 frames @ 30 FPS | +| World scenario (WSM) | `basic_examples/assets/wsm/` | `control_wsm.mp4` + `prompt.json` | 101 frames @ 10 FPS | Transfer inference is selected automatically when any hint key is present in the spec. @@ -40,7 +52,7 @@ Transfer inference is selected automatically when any hint key is present in the Set up the environment: [Cosmos Framework setup](../../README.md#cosmos-framework). Activate the framework venv, then run inference (checked-in `specs/*.json` use paths -relative to `specs/`). Transfer on Nano looks like: +relative to `basic_examples/specs/`). Transfer on Nano looks like: ```bash cd cookbooks/cosmos3/generator/transfer @@ -49,7 +61,7 @@ cd cookbooks/cosmos3/generator/transfer torchrun --nproc-per-node=1 \ -m cosmos_framework.scripts.inference \ --parallelism-preset=latency \ - -i specs/edge.json \ + -i basic_examples/specs/edge.json \ -o ./output/ \ --checkpoint-path Cosmos3-Nano \ --seed 2026 @@ -58,7 +70,7 @@ torchrun --nproc-per-node=1 \ torchrun --nproc-per-node=1 \ -m cosmos_framework.scripts.inference \ --parallelism-preset=latency \ - -i specs/blur.json \ + -i basic_examples/specs/blur.json \ -o ./output/ \ --checkpoint-path Cosmos3-Nano \ --seed 2026 @@ -67,7 +79,7 @@ torchrun --nproc-per-node=1 \ torchrun --nproc-per-node=1 \ -m cosmos_framework.scripts.inference \ --parallelism-preset=latency \ - -i specs/depth.json \ + -i basic_examples/specs/depth.json \ -o ./output/ \ --checkpoint-path Cosmos3-Nano \ --seed 2026 @@ -76,7 +88,7 @@ torchrun --nproc-per-node=1 \ torchrun --nproc-per-node=1 \ -m cosmos_framework.scripts.inference \ --parallelism-preset=latency \ - -i specs/seg.json \ + -i basic_examples/specs/seg.json \ -o ./output/ \ --checkpoint-path Cosmos3-Nano \ --seed 2026 @@ -85,14 +97,14 @@ torchrun --nproc-per-node=1 \ torchrun --nproc-per-node=1 \ -m cosmos_framework.scripts.inference \ --parallelism-preset=latency \ - -i specs/wsm.json \ + -i basic_examples/specs/wsm.json \ -o ./output/ \ --checkpoint-path Cosmos3-Nano \ --seed 2026 ``` The input spec sets `prompt_path` and a hint block with `control_path` pointing at the -checked-in assets under [`assets/`](./assets) via paths relative to [`specs/`](./specs). +checked-in assets under [`basic_examples/assets/`](./basic_examples/assets/) via paths relative to [`basic_examples/specs/`](./basic_examples/specs/). Outputs are written under the directory passed to `-o`, with one subdirectory per sample name, for example `output/transfer_edge/vision.mp4`. Batch size must be 1 for transfer. @@ -137,10 +149,10 @@ Key fields: ### Cookbook entrypoints -- [`run_video_transfer_with_cosmos_framework.ipynb`](./run_video_transfer_with_cosmos_framework.ipynb) — +- [`run_video_transfer_with_cosmos_framework.ipynb`](./basic_examples/run_video_transfer_with_cosmos_framework.ipynb) — full tutorial on a **GPU host**: environment setup, `nvidia-smi` check, then five inference blocks (edge, blur, depth, seg, wsm) with previews. See [Cosmos3 environment setup](../../README.md). -- [`specs/`](./specs) — checked-in Framework input JSON per control (paths relative to `specs/`). +- [`basic_examples/specs/`](./basic_examples/specs/) — checked-in Framework input JSON per control (paths relative to `basic_examples/specs/`). ### Troubleshooting diff --git a/cookbooks/cosmos3/generator/transfer/assets/blur/control_blur.mp4 b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/blur/control_blur.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/blur/control_blur.mp4 rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/blur/control_blur.mp4 diff --git a/cookbooks/cosmos3/generator/transfer/assets/blur/prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/blur/prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/blur/prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/blur/prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/assets/depth/control_depth.mp4 b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/depth/control_depth.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/depth/control_depth.mp4 rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/depth/control_depth.mp4 diff --git a/cookbooks/cosmos3/generator/transfer/assets/depth/prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/depth/prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/depth/prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/depth/prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/assets/edge/control_edge.mp4 b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/edge/control_edge.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/edge/control_edge.mp4 rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/edge/control_edge.mp4 diff --git a/cookbooks/cosmos3/generator/transfer/assets/edge/prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/edge/prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/edge/prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/edge/prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/assets/negative_prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/negative_prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/negative_prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/negative_prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/assets/seg/control_seg.mp4 b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/seg/control_seg.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/seg/control_seg.mp4 rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/seg/control_seg.mp4 diff --git a/cookbooks/cosmos3/generator/transfer/assets/seg/prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/seg/prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/seg/prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/seg/prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/assets/wsm/control_wsm.mp4 b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/wsm/control_wsm.mp4 similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/wsm/control_wsm.mp4 rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/wsm/control_wsm.mp4 diff --git a/cookbooks/cosmos3/generator/transfer/assets/wsm/prompt.json b/cookbooks/cosmos3/generator/transfer/basic_examples/assets/wsm/prompt.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/assets/wsm/prompt.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/assets/wsm/prompt.json diff --git a/cookbooks/cosmos3/generator/transfer/preview_helpers.py b/cookbooks/cosmos3/generator/transfer/basic_examples/preview_helpers.py similarity index 100% rename from cookbooks/cosmos3/generator/transfer/preview_helpers.py rename to cookbooks/cosmos3/generator/transfer/basic_examples/preview_helpers.py diff --git a/cookbooks/cosmos3/generator/transfer/run_video_transfer_with_cosmos_framework.ipynb b/cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb similarity index 100% rename from cookbooks/cosmos3/generator/transfer/run_video_transfer_with_cosmos_framework.ipynb rename to cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb diff --git a/cookbooks/cosmos3/generator/transfer/specs/blur.json b/cookbooks/cosmos3/generator/transfer/basic_examples/specs/blur.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/specs/blur.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/specs/blur.json diff --git a/cookbooks/cosmos3/generator/transfer/specs/depth.json b/cookbooks/cosmos3/generator/transfer/basic_examples/specs/depth.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/specs/depth.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/specs/depth.json diff --git a/cookbooks/cosmos3/generator/transfer/specs/edge.json b/cookbooks/cosmos3/generator/transfer/basic_examples/specs/edge.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/specs/edge.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/specs/edge.json diff --git a/cookbooks/cosmos3/generator/transfer/specs/seg.json b/cookbooks/cosmos3/generator/transfer/basic_examples/specs/seg.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/specs/seg.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/specs/seg.json diff --git a/cookbooks/cosmos3/generator/transfer/specs/wsm.json b/cookbooks/cosmos3/generator/transfer/basic_examples/specs/wsm.json similarity index 100% rename from cookbooks/cosmos3/generator/transfer/specs/wsm.json rename to cookbooks/cosmos3/generator/transfer/basic_examples/specs/wsm.json diff --git a/cookbooks/cosmos3/reasoner/README.md b/cookbooks/cosmos3/reasoner/README.md index b3d3542d..3718e45a 100644 --- a/cookbooks/cosmos3/reasoner/README.md +++ b/cookbooks/cosmos3/reasoner/README.md @@ -1,15 +1,28 @@ -# Cosmos3 Reasoner Examples +# Cosmos3 Reasoner Cookbooks Run the Cosmos3 Reasoner (vision-language reasoning over images and video) across -multiple inference backends. Sample inputs live under [`assets/`](./assets). +multiple inference backends. Environment setup for every backend is centralized in the shared [Cosmos3 cookbooks environment setup](../README.md) guide; each backend below links to the section you need. +## Basic Examples + +The [`basic_examples/`](./basic_examples/) directory contains the shipped starter +cookbooks and sample inputs. Community-contributed cookbooks are added as sibling +directories alongside `basic_examples/` — see the +[Contributing Guide](../../../CONTRIBUTING.md) for the recipe structure. + +| Cookbook | Backend | Notebook | +|---------|---------|----------| +| Reasoner inference | Cosmos Framework | [`basic_examples/run_with_cosmos_framework.ipynb`](./basic_examples/run_with_cosmos_framework.ipynb) | +| Reasoner inference | vLLM | [`basic_examples/run_with_vllm.ipynb`](./basic_examples/run_with_vllm.ipynb) | +| Reasoner inference | NIM | [`basic_examples/run_with_nim.ipynb`](./basic_examples/run_with_nim.ipynb) | + ## Reasoner Prompt Guide -See the [Reasoner Prompt Guide](./reasoner_prompt_guide.md). +See the [Reasoner Prompt Guide](./basic_examples/reasoner_prompt_guide.md). ## Run with Cosmos Framework @@ -29,7 +42,7 @@ cat > outputs/cookbooks/cosmos3/reasoner/inputs/robot_image.json <<'JSON' "model_mode": "reasoner", "name": "robot_image", "prompt": "Describe what is happening in this image in one sentence.", - "vision_path": "../../cookbooks/cosmos3/reasoner/assets/robot_153.jpg", + "vision_path": "../../cookbooks/cosmos3/reasoner/basic_examples/assets/robot_153.jpg", "enable_sound": false } JSON @@ -54,7 +67,7 @@ The generated text is written to ### Notebook walkthrough -[`run_with_cosmos_framework.ipynb`](./run_with_cosmos_framework.ipynb) is the full +[`run_with_cosmos_framework.ipynb`](./basic_examples/run_with_cosmos_framework.ipynb) is the full tutorial. It writes text and image smoke tests, then walks through image capability sections — detailed captioning, robot task planning, 2D grounding, describe-anything, and action-trajectory prompts — rendering the prompt, media @@ -73,7 +86,7 @@ Set up the environment and start the server: [Start the server](../README.md#start-the-server) (launch commands). The quickstart below uses **Cosmos3-Nano** on port 8000. The -[`run_with_vllm.ipynb`](./run_with_vllm.ipynb) notebook defaults to +[`run_with_vllm.ipynb`](./basic_examples/run_with_vllm.ipynb) notebook defaults to **Cosmos3-Super** on port **8001** — use that launch command from the env setup guide and point the client at `http://localhost:8001/v1`. @@ -83,7 +96,7 @@ Once the server is ready, query it with the OpenAI client: from pathlib import Path import openai -image_path = Path("assets/robot_153.jpg").resolve() +image_path = Path("basic_examples/assets/robot_153.jpg").resolve() image_url = image_path.as_uri() client = openai.OpenAI(api_key="EMPTY", base_url="http://localhost:8000/v1") @@ -108,7 +121,7 @@ print(response.choices[0].message.content) ### Notebook walkthrough -[`run_with_vllm.ipynb`](./run_with_vllm.ipynb) uses the **Cosmos3-Super** launch +[`run_with_vllm.ipynb`](./basic_examples/run_with_vllm.ipynb) uses the **Cosmos3-Super** launch from the [environment setup guide](../README.md#start-the-server) and walks through many more image and video examples: detailed captioning, VQA, temporal localization, embodied reasoning, common-sense reasoning, 2D @@ -138,7 +151,7 @@ import mimetypes from pathlib import Path import openai -image_path = Path("assets/robot_153.jpg").resolve() +image_path = Path("basic_examples/assets/robot_153.jpg").resolve() mime = mimetypes.guess_type(image_path.name)[0] or "application/octet-stream" image_url = f"data:{mime};base64,{base64.b64encode(image_path.read_bytes()).decode('ascii')}" @@ -170,7 +183,7 @@ for the full request reference. ### Notebook walkthrough -[`run_with_nim.ipynb`](./run_with_nim.ipynb) is the NIM counterpart to the vLLM +[`run_with_nim.ipynb`](./basic_examples/run_with_nim.ipynb) is the NIM counterpart to the vLLM notebook: it launches the NIM container, waits for readiness, and then runs the same image and video examples — detailed captioning, VQA, temporal localization, embodied reasoning, common-sense reasoning, 2D grounding, describe-anything, diff --git a/cookbooks/cosmos3/reasoner/assets/action_cot_driving_scene.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/action_cot_driving_scene.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/action_cot_driving_scene.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/action_cot_driving_scene.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/action_cot_trajectory.png b/cookbooks/cosmos3/reasoner/basic_examples/assets/action_cot_trajectory.png similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/action_cot_trajectory.png rename to cookbooks/cosmos3/reasoner/basic_examples/assets/action_cot_trajectory.png diff --git a/cookbooks/cosmos3/reasoner/assets/assisted_task_next_action.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/assisted_task_next_action.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/assisted_task_next_action.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/assisted_task_next_action.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/common_sense_reasoning.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/common_sense_reasoning.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/common_sense_reasoning.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/common_sense_reasoning.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/describe_anything.png b/cookbooks/cosmos3/reasoner/basic_examples/assets/describe_anything.png similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/describe_anything.png rename to cookbooks/cosmos3/reasoner/basic_examples/assets/describe_anything.png diff --git a/cookbooks/cosmos3/reasoner/assets/drive_scene_next_action.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/drive_scene_next_action.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/drive_scene_next_action.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/drive_scene_next_action.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/grounding_2d.png b/cookbooks/cosmos3/reasoner/basic_examples/assets/grounding_2d.png similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/grounding_2d.png rename to cookbooks/cosmos3/reasoner/basic_examples/assets/grounding_2d.png diff --git a/cookbooks/cosmos3/reasoner/assets/physical_plausibility.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/physical_plausibility.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/physical_plausibility.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/physical_plausibility.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/robot_153.jpg b/cookbooks/cosmos3/reasoner/basic_examples/assets/robot_153.jpg similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/robot_153.jpg rename to cookbooks/cosmos3/reasoner/basic_examples/assets/robot_153.jpg diff --git a/cookbooks/cosmos3/reasoner/assets/robot_planning.png b/cookbooks/cosmos3/reasoner/basic_examples/assets/robot_planning.png similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/robot_planning.png rename to cookbooks/cosmos3/reasoner/basic_examples/assets/robot_planning.png diff --git a/cookbooks/cosmos3/reasoner/assets/robotics_next_action.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/robotics_next_action.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/robotics_next_action.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/robotics_next_action.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/situation_understanding.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/situation_understanding.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/situation_understanding.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/situation_understanding.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/temporal_localization_1.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/temporal_localization_1.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/temporal_localization_1.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/temporal_localization_1.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/temporal_localization_2.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/temporal_localization_2.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/temporal_localization_2.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/temporal_localization_2.mp4 diff --git a/cookbooks/cosmos3/reasoner/assets/video_caption.mp4 b/cookbooks/cosmos3/reasoner/basic_examples/assets/video_caption.mp4 similarity index 100% rename from cookbooks/cosmos3/reasoner/assets/video_caption.mp4 rename to cookbooks/cosmos3/reasoner/basic_examples/assets/video_caption.mp4 diff --git a/cookbooks/cosmos3/reasoner/reasoner_prompt_guide.md b/cookbooks/cosmos3/reasoner/basic_examples/reasoner_prompt_guide.md similarity index 100% rename from cookbooks/cosmos3/reasoner/reasoner_prompt_guide.md rename to cookbooks/cosmos3/reasoner/basic_examples/reasoner_prompt_guide.md diff --git a/cookbooks/cosmos3/reasoner/run_with_cosmos_framework.ipynb b/cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb similarity index 100% rename from cookbooks/cosmos3/reasoner/run_with_cosmos_framework.ipynb rename to cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb diff --git a/cookbooks/cosmos3/reasoner/run_with_nim.ipynb b/cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb similarity index 100% rename from cookbooks/cosmos3/reasoner/run_with_nim.ipynb rename to cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb diff --git a/cookbooks/cosmos3/reasoner/run_with_vllm.ipynb b/cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb similarity index 100% rename from cookbooks/cosmos3/reasoner/run_with_vllm.ipynb rename to cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb From 6502b16dab4e8a04f077ee0a14b298625ba1700a Mon Sep 17 00:00:00 2001 From: paularamo Date: Mon, 15 Jun 2026 14:27:34 -0400 Subject: [PATCH 3/4] Update README.md and cookbooks setup README for basic_examples/ paths Fix all notebook links, nbviewer URLs, and asset paths in the main README.md Examples table (11 entries) and the NIM curl example to reference the new basic_examples/ subdirectories. Also update the cookbooks/cosmos3/README.md vLLM server section to point at the relocated run_with_vllm.ipynb. (cherry picked from commit 669ba5c53c1990f9a37cff2e246aa04a93d138dd) --- README.md | 24 ++++++++++++------------ cookbooks/cosmos3/README.md | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d54eaa07..a788f1a0 100644 --- a/README.md +++ b/README.md @@ -522,7 +522,7 @@ docker run -it --rm --name=$CONTAINER_NAME \ The OpenAI-compatible API is then available at `http://127.0.0.1:8000/v1`. Query it with `curl`: ```shell -IMAGE_DATA_URI="data:image/jpeg;base64,$(base64 -w 0 cookbooks/cosmos3/reasoner/assets/robot_153.jpg)" +IMAGE_DATA_URI="data:image/jpeg;base64,$(base64 -w 0 cookbooks/cosmos3/reasoner/basic_examples/assets/robot_153.jpg)" curl -X POST 'http://127.0.0.1:8000/v1/chat/completions' \ -H 'Accept: application/json' \ @@ -631,17 +631,17 @@ We are building examples that show Cosmos 3 capabilities end to end, including w | Example | Surface | Workflows demonstrated | Open | nbviewer | | --- | --- | --- | --- | --- | -| Generator (audiovisual) with Diffusers | Generator | Text-to-image, plus text-to-video and image-to-video each with or without synchronized sound, via `Cosmos3OmniPipeline`. | [Notebook](cookbooks/cosmos3/generator/audiovisual/run_with_diffusers.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/run_with_diffusers.ipynb) | -| Generator (audiovisual) with Cosmos Framework | Generator | Text-to-image, plus text-to-video and image-to-video each with sound on or off, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/audiovisual/run_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/run_with_cosmos_framework.ipynb) | -| Generator (audiovisual) with vLLM-Omni | Generator | Text-to-image, plus text-to-video and image-to-video each with sound on or off, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/audiovisual/run_with_vllm_omni.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/run_with_vllm_omni.ipynb) | -| Forward dynamics with Cosmos Framework | Generator | Forward dynamics: action-conditioned future-observation prediction for AV, DROID, and UMI, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/action/run_fd_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/run_fd_with_cosmos_framework.ipynb) | -| Forward dynamics with vLLM-Omni | Generator | Forward dynamics: action-conditioned future-observation prediction for AV, DROID, and UMI, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/action/run_fd_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/run_fd_with_vllm.ipynb) | -| Inverse dynamics with Cosmos Framework | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/action/run_id_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/run_id_with_cosmos_framework.ipynb) | -| Inverse dynamics with vLLM-Omni | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/action/run_id_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/run_id_with_vllm.ipynb) | -| Transfer with Cosmos Framework | Generator | Video transfer: edge, blur, depth, segmentation, and world-scenario controls with captions, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/transfer/run_video_transfer_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/transfer/run_video_transfer_with_cosmos_framework.ipynb) | -| Reasoner with Cosmos Framework | Reasoner | Text and image reasoning: detailed captioning, robot task planning, 2D grounding, describe-anything, and action-trajectory prompts, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/reasoner/run_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/run_with_cosmos_framework.ipynb) | -| Reasoner with vLLM | Reasoner | Image and video reasoning: captioning, temporal localization, embodied reasoning, common-sense reasoning, 2D grounding, describe-anything, action CoT, driving scenes, physical-plausibility, and situation understanding, against an OpenAI-compatible vLLM server (Cosmos3-Super on 4 GPUs by default; switch to Nano per the cookbook README). | [Notebook](cookbooks/cosmos3/reasoner/run_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/run_with_vllm.ipynb) | -| Reasoner with NIM | Reasoner | The same image and video reasoning examples as the vLLM notebook, run against the prebuilt, OpenAI-compatible [Cosmos 3 Reasoner NIM](https://catalog.ngc.nvidia.com/orgs/nim/teams/nvidia/containers/cosmos3-reasoner) container; local media is sent as base64 data URIs. | [Notebook](cookbooks/cosmos3/reasoner/run_with_nim.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/run_with_nim.ipynb) | +| Generator (audiovisual) with Diffusers | Generator | Text-to-image, plus text-to-video and image-to-video each with or without synchronized sound, via `Cosmos3OmniPipeline`. | [Notebook](cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_diffusers.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_diffusers.ipynb) | +| Generator (audiovisual) with Cosmos Framework | Generator | Text-to-image, plus text-to-video and image-to-video each with sound on or off, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_cosmos_framework.ipynb) | +| Generator (audiovisual) with vLLM-Omni | Generator | Text-to-image, plus text-to-video and image-to-video each with sound on or off, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_vllm_omni.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/audiovisual/basic_examples/run_with_vllm_omni.ipynb) | +| Forward dynamics with Cosmos Framework | Generator | Forward dynamics: action-conditioned future-observation prediction for AV, DROID, and UMI, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_cosmos_framework.ipynb) | +| Forward dynamics with vLLM-Omni | Generator | Forward dynamics: action-conditioned future-observation prediction for AV, DROID, and UMI, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_fd_with_vllm.ipynb) | +| Inverse dynamics with Cosmos Framework | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb) | +| Inverse dynamics with vLLM-Omni | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb) | +| Transfer with Cosmos Framework | Generator | Video transfer: edge, blur, depth, segmentation, and world-scenario controls with captions, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb) | +| Reasoner with Cosmos Framework | Reasoner | Text and image reasoning: detailed captioning, robot task planning, 2D grounding, describe-anything, and action-trajectory prompts, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb) | +| Reasoner with vLLM | Reasoner | Image and video reasoning: captioning, temporal localization, embodied reasoning, common-sense reasoning, 2D grounding, describe-anything, action CoT, driving scenes, physical-plausibility, and situation understanding, against an OpenAI-compatible vLLM server (Cosmos3-Super on 4 GPUs by default; switch to Nano per the cookbook README). | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb) | +| Reasoner with NIM | Reasoner | The same image and video reasoning examples as the vLLM notebook, run against the prebuilt, OpenAI-compatible [Cosmos 3 Reasoner NIM](https://catalog.ngc.nvidia.com/orgs/nim/teams/nvidia/containers/cosmos3-reasoner) container; local media is sent as base64 data URIs. | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb) | ### Inference Benchmarks diff --git a/cookbooks/cosmos3/README.md b/cookbooks/cosmos3/README.md index ecf78a06..48f6474c 100644 --- a/cookbooks/cosmos3/README.md +++ b/cookbooks/cosmos3/README.md @@ -203,7 +203,7 @@ export VLLM_USE_DEEP_GEMM=0 All Reasoner cookbooks talk to an OpenAI-compatible chat-completions API. After [installing vLLM](#vllm), run the commands below from `cookbooks/cosmos3/reasoner` (same working directory as -[`run_with_vllm.ipynb`](reasoner/run_with_vllm.ipynb)). That sets +[`run_with_vllm.ipynb`](reasoner/basic_examples/run_with_vllm.ipynb)). That sets `$(dirname "$(pwd)")` to `/cookbooks/cosmos3`, which matches the notebook's `COSMOS3_MEDIA_ROOT`. @@ -221,7 +221,7 @@ vllm serve nvidia/Cosmos3-Nano \ --port 8000 ``` -**Cosmos3-Super** (four GPUs; default in [`run_with_vllm.ipynb`](reasoner/run_with_vllm.ipynb), port 8001): +**Cosmos3-Super** (four GPUs; default in [`run_with_vllm.ipynb`](reasoner/basic_examples/run_with_vllm.ipynb), port 8001): ```bash export COSMOS3_MEDIA_ROOT="$(dirname "$(pwd)")" From a10ecd9fe77125f3f01498b4891655e5933253f0 Mon Sep 17 00:00:00 2001 From: Alex Sotelo Date: Mon, 15 Jun 2026 19:53:53 -0700 Subject: [PATCH 4/4] docs(explainable-palletizer): add scenario walkthroughs and refresh architecture diagram Document three control-loop examples (CALL_A_HUMAN, heavy base placement, mixed-SKU stacking) with UI screenshots, and update the workflow SVG to show App Server as the central hub. --- CONTRIBUTING.md | 64 +++-- README.md | 3 +- cookbooks/cosmos3/end2end/README.md | 12 + .../end2end/explainable-palletizer/README.md | 168 ++++++++++++ .../assets/main_workflow.svg | 121 +++++++++ .../assets/scenario1.webp | Bin 0 -> 41752 bytes .../assets/scenario2.webp | Bin 0 -> 53344 bytes .../assets/scenario3.webp | Bin 0 -> 63564 bytes .../run_palletizer_with_diffusers.md | 185 +++++++++++++ .../explainable-palletizer/workflow_e2e.md | 254 ++++++++++++++++++ 10 files changed, 778 insertions(+), 29 deletions(-) create mode 100644 cookbooks/cosmos3/end2end/README.md create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/README.md create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/assets/main_workflow.svg create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario1.webp create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario2.webp create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario3.webp create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/run_palletizer_with_diffusers.md create mode 100644 cookbooks/cosmos3/end2end/explainable-palletizer/workflow_e2e.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 48c67c1b..d6dd005e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -73,35 +73,42 @@ cookbooks/ │ ├── run__with_.ipynb │ └── assets/ │ - └── generator/ - ├── audiovisual/ # Generator: T2I, T2V, I2V, audio - │ ├── README.md - │ ├── basic_examples/ # Shipped starter cookbooks - │ │ ├── run_with_diffusers.ipynb - │ │ ├── run_with_vllm_omni.ipynb - │ │ ├── run_with_cosmos_framework.ipynb - │ │ └── assets/ - │ └── / # ← Community contributions go here - │ - ├── action/ # Generator: policy, FDM, IDM - │ ├── README.md - │ ├── basic_examples/ # Shipped starter cookbooks - │ │ ├── run_fd_with_cosmos_framework.ipynb - │ │ ├── run_fd_with_vllm.ipynb - │ │ ├── run_id_with_cosmos_framework.ipynb - │ │ ├── run_id_with_vllm.ipynb - │ │ ├── run_policy_with_cosmos_framework.md - │ │ └── assets/ - │ └── / # ← Community contributions go here - │ - └── transfer/ # Generator: video-to-video transfer + ├── generator/ + │ ├── audiovisual/ # Generator: T2I, T2V, I2V, audio + │ │ ├── README.md + │ │ ├── basic_examples/ # Shipped starter cookbooks + │ │ │ ├── run_with_diffusers.ipynb + │ │ │ ├── run_with_vllm_omni.ipynb + │ │ │ ├── run_with_cosmos_framework.ipynb + │ │ │ └── assets/ + │ │ └── / # ← Community contributions go here + │ │ + │ ├── action/ # Generator: policy, FDM, IDM + │ │ ├── README.md + │ │ ├── basic_examples/ # Shipped starter cookbooks + │ │ │ ├── run_fd_with_cosmos_framework.ipynb + │ │ │ ├── run_fd_with_vllm.ipynb + │ │ │ ├── run_id_with_cosmos_framework.ipynb + │ │ │ ├── run_id_with_vllm.ipynb + │ │ │ ├── run_policy_with_cosmos_framework.md + │ │ │ └── assets/ + │ │ └── / # ← Community contributions go here + │ │ + │ └── transfer/ # Generator: video-to-video transfer + │ ├── README.md + │ ├── basic_examples/ # Shipped starter cookbooks + │ │ ├── run_video_transfer_with_cosmos_framework.ipynb + │ │ ├── preview_helpers.py + │ │ ├── specs/ + │ │ └── assets/ + │ └── / # ← Community contributions go here + │ + └── end2end/ # Multi-tower or application workflows + ├── README.md + └── / # ← Community contributions go here ├── README.md - ├── basic_examples/ # Shipped starter cookbooks - │ ├── run_video_transfer_with_cosmos_framework.ipynb - │ ├── preview_helpers.py - │ ├── specs/ - │ └── assets/ - └── / # ← Community contributions go here + ├── run__with_.md + └── assets/ ``` ### Where Does My Cookbook Go? @@ -112,6 +119,7 @@ cookbooks/ | Text-to-image, text-to-video, image-to-video, audio | `cookbooks/cosmos3/generator/audiovisual/` | | Robotics policy, forward/inverse dynamics | `cookbooks/cosmos3/generator/action/` | | Video-to-video style transfer, edge-guided generation | `cookbooks/cosmos3/generator/transfer/` | +| Multi-tower application workflows or external robot/simulation stacks | `cookbooks/cosmos3/end2end/` | If your cookbook spans multiple towers (e.g., Reasoner analysis → Generator synthesis), create a new directory under `cookbooks/cosmos3/` with a clear name (e.g., `cookbooks/cosmos3/end2end/`). diff --git a/README.md b/README.md index a788f1a0..6c29d092 100644 --- a/README.md +++ b/README.md @@ -627,7 +627,7 @@ The Cosmos Framework requires `uv >= 0.11.3` (enforced via its `pyproject.toml`) ### Examples -We are building examples that show Cosmos 3 capabilities end to end, including world generation, world understanding, captioning, temporal localization, grounding, and physical reasoning. Each example is a self-contained script or notebook you can run from this repository. +We are building examples that show Cosmos 3 capabilities end to end, including world generation, world understanding, captioning, temporal localization, grounding, and physical reasoning. Each example is a self-contained script, notebook, or guide you can run from this repository. | Example | Surface | Workflows demonstrated | Open | nbviewer | | --- | --- | --- | --- | --- | @@ -639,6 +639,7 @@ We are building examples that show Cosmos 3 capabilities end to end, including w | Inverse dynamics with Cosmos Framework | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_cosmos_framework.ipynb) | | Inverse dynamics with vLLM-Omni | Generator | Inverse dynamics: ego-motion trajectory prediction from input AV video, against an OpenAI-compatible vLLM-Omni server. | [Notebook](cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/action/basic_examples/run_id_with_vllm.ipynb) | | Transfer with Cosmos Framework | Generator | Video transfer: edge, blur, depth, segmentation, and world-scenario controls with captions, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/generator/transfer/basic_examples/run_video_transfer_with_cosmos_framework.ipynb) | +| Explainable mixed-SKU palletizer | End-to-end | Cosmos3-Nano and Cosmos3-Super Diffusers validation for palletizing-scene artifacts, plus a Doosan Robotics Isaac Sim/cuRobo full-stack smoke path. | [Guide](cookbooks/cosmos3/end2end/explainable-palletizer/README.md) | N/A | | Reasoner with Cosmos Framework | Reasoner | Text and image reasoning: detailed captioning, robot task planning, 2D grounding, describe-anything, and action-trajectory prompts, through the `cosmos_framework.scripts.inference` entrypoint. | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_cosmos_framework.ipynb) | | Reasoner with vLLM | Reasoner | Image and video reasoning: captioning, temporal localization, embodied reasoning, common-sense reasoning, 2D grounding, describe-anything, action CoT, driving scenes, physical-plausibility, and situation understanding, against an OpenAI-compatible vLLM server (Cosmos3-Super on 4 GPUs by default; switch to Nano per the cookbook README). | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_vllm.ipynb) | | Reasoner with NIM | Reasoner | The same image and video reasoning examples as the vLLM notebook, run against the prebuilt, OpenAI-compatible [Cosmos 3 Reasoner NIM](https://catalog.ngc.nvidia.com/orgs/nim/teams/nvidia/containers/cosmos3-reasoner) container; local media is sent as base64 data URIs. | [Notebook](cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb) | [![Render with nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/nvidia/cosmos/blob/main/cookbooks/cosmos3/reasoner/basic_examples/run_with_nim.ipynb) | diff --git a/cookbooks/cosmos3/end2end/README.md b/cookbooks/cosmos3/end2end/README.md new file mode 100644 index 00000000..210a318a --- /dev/null +++ b/cookbooks/cosmos3/end2end/README.md @@ -0,0 +1,12 @@ +# Cosmos3 End-to-End Cookbooks + +End-to-end cookbooks combine multiple Cosmos3 capabilities or connect Cosmos3 to +external robotics, simulation, or application stacks. + +Environment setup for reusable Cosmos3 backends is centralized in the shared +[Cosmos3 cookbooks environment setup](../README.md) guide. Each cookbook below +documents any application-specific services, ports, and validation steps. + +| Cookbook | Backends | Entry point | +| --- | --- | --- | +| Explainable mixed-SKU palletizer | Cosmos3 Diffusers, Doosan Robotics simulation stack | [`explainable-palletizer/`](./explainable-palletizer/) | diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/README.md b/cookbooks/cosmos3/end2end/explainable-palletizer/README.md new file mode 100644 index 00000000..90e15f63 --- /dev/null +++ b/cookbooks/cosmos3/end2end/explainable-palletizer/README.md @@ -0,0 +1,168 @@ +# See How It Thinks: Mixed Palletizing with Explainable Visual Reasoning + +This cookbook shows how to validate an explainable mixed-SKU palletizing workflow +with Cosmos3-Nano or Cosmos3-Super. The live Cosmos3 path uses a Diffusers-backed +generation endpoint to create auditable palletizing-scene outputs, while the +Doosan Robotics reference stack provides the full Isaac Sim, cuRobo, FastAPI, +and React control-loop smoke test. + +| Model | Workload | Use case | +| --- | --- | --- | +| [Cosmos3-Nano](https://huggingface.co/nvidia/Cosmos3-Nano), [Cosmos3-Super](https://huggingface.co/nvidia/Cosmos3-Super), [Isaac Sim](https://developer.nvidia.com/isaac-sim), [cuRobo](https://curobo.org/), [Diffusers](https://github.com/huggingface/diffusers) | End-to-end | Explainable mixed-SKU palletizing: visual scene generation, handling-policy validation, and simulated robot execution | + +**Source project:** [doosan-robotics/explainable-palletizer](https://github.com/doosan-robotics/explainable-palletizer) + +## What You Will Build + +- Run a Cosmos3-Nano or Cosmos3-Super Diffusers smoke request for a palletizing + cell and save the generated media artifact. +- Validate the Doosan reference stack in no-token mode with real Isaac Sim and a + tiny inference model. +- Use the same prompt family to document why the system places, delays, or routes + boxes for human inspection. +- Review the source project's damaged-carton, heavy-box, and mixed-SKU + walkthroughs in [workflow_e2e.md](workflow_e2e.md). + +## Prerequisites + +- Follow the shared [Diffusers setup](../../README.md#diffusers) if you are + running Cosmos3 locally. +- For the Doosan reference stack, install Docker with Compose V2 and the NVIDIA + Container Toolkit on a Linux GPU host. +- Install [`uv`](https://docs.astral.sh/uv/) for the Doosan full-stack smoke if + the source checkout needs to generate `uv.lock`. +- For full Cosmos3 model runs, authenticate to Hugging Face and accept the + relevant Cosmos3 model licenses. +- Use a host with enough VRAM for the selected model size. + +| Profile | Model | Suggested hardware | Notes | +| --- | --- | --- | --- | +| Nano | `nvidia/Cosmos3-Nano` | Single NVIDIA GB10, RTX 4090-class, or larger GPU | Default for smoke tests and widest accessibility | +| Super | `nvidia/Cosmos3-Super` | Multi-GPU Hopper/Blackwell-class system | Higher quality; launch the serving backend with the Super checkpoint before running the same client request | + +## Backends + +| Backend | Entry point | GPU requirement | +| --- | --- | --- | +| Diffusers-compatible HTTP endpoint | [`run_palletizer_with_diffusers.md`](run_palletizer_with_diffusers.md) | Nano: single GPU; Super: multi-GPU | +| Doosan reference stack | `make docker-test` in the source repo | NVIDIA GPU with Isaac Sim support | + +## Quick Start + +Use the Diffusers entry point first. It is the fastest way to confirm that the +Cosmos3-Nano or Cosmos3-Super service is reachable and can produce a palletizing +scene artifact: + +```bash +cd cookbooks/cosmos3/end2end/explainable-palletizer +export COSMOS3_DIFFUSERS_BASE_URL=http://127.0.0.1:8000 +curl -fsS "${COSMOS3_DIFFUSERS_BASE_URL}/health" +curl -fsS "${COSMOS3_DIFFUSERS_BASE_URL}/v1/models" +``` + +Then run the Python smoke-test block in +[`run_palletizer_with_diffusers.md`](run_palletizer_with_diffusers.md) to write a +local media artifact and verify the response can be decoded. Use +[workflow_e2e.md](workflow_e2e.md) to compare the generated artifact against the +operator-review criteria from the reference palletizer scenarios. + +Then run the full-stack reference smoke on a GPU host: + +```bash +git clone https://github.com/doosan-robotics/explainable-palletizer.git +cd explainable-palletizer +cp docker/.env.example docker/.env +test -f uv.lock || uv lock +make docker-test +``` + +`make docker-test` starts real Isaac Sim plus a tiny inference model, so it does +not need a Hugging Face token. The current upstream Dockerfile expects +`uv.lock`; generate it once with `uv lock` if the source checkout does not +already include it. Change `SIM_PORT`, `INFERENCE_PORT`, `APP_PORT`, and +`FRONTEND_PORT` in `docker/.env` if another local service already uses the +defaults. See +[`run_palletizer_with_diffusers.md`](run_palletizer_with_diffusers.md#full-stack-troubleshooting) +for NVIDIA Docker runtime setup, single-GPU sequential startup, and the cuRobo +`warp-lang` compatibility note. + +## Architecture + +

+ Explainable palletizer workflow +

+ +The Doosan reference stack launches four services: + +| Service | Default port | Role | +| --- | --- | --- | +| `sim-server` | 8100 | Runs Isaac Sim headlessly, creates conveyor-box images, and executes cuRobo-planned pick/place trajectories | +| `inference-server` | 8200 | Serves the model endpoint used by the application server | +| `app-server` | 8000 | Builds prompts, parses structured actions, maintains pallet state, and streams events | +| `frontend` | 3000 | Shows camera frames, reasoning, parsed actions, and execution status | + +For the Cosmos3 Diffusers path, the client only needs an HTTP endpoint exposing: + +- `GET /health` +- `GET /v1/models` +- `POST /v1/infer` + +The request is model-size agnostic. To move from Nano to Super, start the serving +backend with `nvidia/Cosmos3-Super` and confirm `/v1/models` reports the Super +checkpoint before reusing the same prompt and payload shape. + +## Results / Expected Output + +A successful Diffusers smoke test writes one generated image or video artifact +and prints metadata similar to: + +```text +model: nvidia/Cosmos3-Nano +backend: diffusers +decoded media bytes: non-zero +seed: fixed integer +``` + +A successful full-stack Doosan smoke test prints healthy endpoints for: + +- `sim-server` +- `inference-server` +- `app-server` +- `frontend` + +and exposes the UI at the configured frontend port. + +The companion walkthrough includes expected actions and screenshots for: + +- damaged cartons routed to `CALL_A_HUMAN`, +- heavy boxes placed on low pallet layers with firm grip, +- mixed-SKU stacks that keep rigid goods below fragile items. + +## Dataset + +| Name | Source | License | Size | +| --- | --- | --- | --- | +| Synthetic palletizing scenes and box assets | [doosan-robotics/explainable-palletizer](https://github.com/doosan-robotics/explainable-palletizer) | See upstream repository | Small source assets plus Docker/model caches | +| Cosmos3 models | [NVIDIA Cosmos3 collection](https://huggingface.co/collections/nvidia/cosmos3) | NVIDIA Open Model License | Varies by model | + +## Safety and Limitations + +- This is a simulated proof of concept, not a production robot safety system. +- Cosmos3 generation can help validate scene prompts and expected outputs, but + real palletizing deployments still need independent safety controls, guarded + robot execution, and site-specific validation. +- The upstream Doosan project currently keeps its full closed-loop stack in the + public reference repository; this cookbook does not vendor that source code. +- If the full-stack smoke test fails on a driver, CUDA, or container-runtime + mismatch, fix the host runtime before treating the robot-loop path as passed. +- If the Diffusers endpoint was just restarted, the first Nano/Super request can + spend several minutes loading weights before returning a generated artifact. + +## Resources + +- [doosan-robotics/explainable-palletizer](https://github.com/doosan-robotics/explainable-palletizer) +- [Cosmos3-Nano](https://huggingface.co/nvidia/Cosmos3-Nano) +- [Cosmos3-Super](https://huggingface.co/nvidia/Cosmos3-Super) +- [Cosmos3 Diffusers setup](../../README.md#diffusers) +- [Isaac Sim](https://developer.nvidia.com/isaac-sim) +- [cuRobo](https://curobo.org/) diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/assets/main_workflow.svg b/cookbooks/cosmos3/end2end/explainable-palletizer/assets/main_workflow.svg new file mode 100644 index 00000000..14afea03 --- /dev/null +++ b/cookbooks/cosmos3/end2end/explainable-palletizer/assets/main_workflow.svg @@ -0,0 +1,121 @@ + + + Explainable palletizer: Cosmos3 validation loop + The app server or smoke client connects to Sim Server for robot-loop evidence, to a Cosmos3 Diffusers endpoint for generated palletizing artifacts, and to Frontend for operator review. Frontend also connects directly to Sim Server for the camera stream. + + + + + + + + + + + + + + + + + + + + + zenith-net + + + RUNTIME ARCHITECTURE + Explainable Palletizer Validation Loop + + + + + + + + + ↔ SWAPPABLE + + :8100 + SIMULATION / REAL + Sim Server + or Real Robot + + Isaac Sim + cuRobo MotionGen + Doosan P3020 · conveyor + Box image capture + + + + + + :8000 + ORCHESTRATION + App Server + + Control loop + Prompt builder + Action parser + Pallet state + constraints + WebSocket event stream + + + + + + :8200 + GENERATION + Cosmos3 Endpoint + + Diffusers backend + Nano default · Super quality + Prompt + seed + model ID + /health · /v1/models · /v1/infer + Generated media artifact + + + + + + box images + state + + + + pick/place cmd + + + + + + scene prompt + + + + artifact + metadata + + + + + :3000 + FRONTEND + Frontend + + Camera feed · Reasoning trace + Parsed action · Execution status + + + + WebSocket events + + + + camera stream + + diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario1.webp b/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario1.webp new file mode 100644 index 0000000000000000000000000000000000000000..1d409ea1ca76c668ca8284804b4376fe8cb80c4d GIT binary patch literal 41752 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 literal 0 HcmV?d00001 diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario2.webp b/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario2.webp new file mode 100644 index 0000000000000000000000000000000000000000..55bec61c1bd4a03b967dfd4089c446e31a9988f7 GIT binary patch literal 53344 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 j0)PMj00000000000000000000000000000000000h>l!| literal 0 HcmV?d00001 diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario3.webp b/cookbooks/cosmos3/end2end/explainable-palletizer/assets/scenario3.webp new file mode 100644 index 0000000000000000000000000000000000000000..7587d4fd15bb44db71497bc7b6fd112c4dc076c8 GIT binary patch literal 63564 zcmcG!W0WXOvM$`VZQHhO+qS!R+qP}nwszaQZQC}!cjnHVGqdiTZ=FB)`H>M>S*uoM zMr34FJfS2hCMNO<0H7`^q@bq2LBR2sUVjIY14tzR77Wa1%a$flOiV>W!uU2W02^Ux zx4C*mpW0Kp=zEM>`jE$G9q-A^?wR`u z{mX40yOciThZ)Y*uE$RRF5D(LFUhayhw__vC2!)#`$zH{{B!hk=N7-G_wZZ!N&bw# z_b2o@*O-Xq?FU)4{-ch`N{B7d^q*-z3l+~>pl z$!Fe8?$}S*Pu7>ZKRNIZ@(=mDzQK*n_sUPy=T3Co8~$G3!iVU)-^-(la<_rX_y zAJg~15B4W|Yu;VAKp*%I{qw~x`rFTI-uKVZ&$>6;Ptwo9SJ|ijHoV7<-uK!k_>aU7 z>WbR}f)Dfmdr(RtH#=*zn4@7iBhDuA9OHh>CuQqB6&GQQFh(2yubbgbY~_syM|(So z` zZG^B(+CRptFK&TT!#O&jWM)&EU%S_5<>CKZFf^PW=v|B**P4u%^W3|ryq?bbR0GW4 zFejel7Y?ib@1U>*kN|2(%^Hk2_e8tBD)XMVqO%Kmmhlr5k*EBAkqyWzA50eUDmo`z z+0;bgc~0_7IA9_Av%;j9KThIg`Nntfg2e$4K$#N?A&Yz)l^>>RZl>_GD0wLyI2Sc+ zCas<>qL>`q9Qx*_d}%BlN2Ae=yMKT}hM)u^@bk5GSI*|HC8_v`eddY}} z-x4MW72n4Zr>^h7QW} zUyeinC=#HJI#u-dNh&iL=mwJhLYJWjg%ndln#W#O*_37Bo}^{a14(4N`m(7H{(@T7 zSupp$f;}u)+&2*orxBMCtz(~9)meh2L<)3OXB=J&Z-%&Hv|skVL$FDgzs@iX!$&3B zR~Eqv=(%xtt|Ro!huq9t!{|bdwYo>|P!L4)r2=qR=3Bw-WLS+|g9%cJ-NLXW;R!yg zlx?GX#4S^N&eR66HdVY=5t-3PSWszDT&rOoVQ@{>WNzhwM^p&_kb2cG^dqrn$Ch}X zdICorxtuLW%1J=-J;Fr<#2k*%xrN@*oZ&!&yT7mq))2$c1Hl{x)??g*d2{@_oE4^# zse>w|A`%{&$_BVmp59in9G2wkBT#2b8Vp)RYOX7pm2uDsrY~AIhL{XB`yZjzL*(k@ zvieOlSNO_qRJA<$khe(e+WBy@q5Z((C5Ipgp_(K6b1x9uL|Ame@5xY$f#0} z0=>@J%4aIeQncV?6EhIq7by{ma1Z#ORcMZ!D5(%4aiBOC7`3Pc2Cz;)Hx^DS1+;El zgUeQsbD@p59pEJp9@t=VAUM?pn3&zYV^9^$umhZk`yDlEPv0Y2(@%Xtk}7TEaD`3X zt^XN!7z6T%hzHtO#X}+2SO8WmxSq}|5_i$FZm%2+IY+YQJO$ z9~VB8-b3s^z+gl7t|oSO=E}*n2-|as`<|jWWIp1&OC%v?rXZmpnF4Bj^}L@O_0a(A zxmfY;m4gK@C0JMPONhI$NhFB@?Eo#@jwOsN>gp`!P^yUV#G zlEhP44@(oSR5~JP0cvb>73eMEa>(YEFD91_-?Ky%=2Rw9mc}X&9@KmcgW&`BvWjV{ z#5!pK{w-?OlAd^ZnM`m{SN%Lw4?BUvM)S_{G(U{M?iNy@gTDIx{DcWDA1U1joFwH9f?ZQN2!cz=Utzy|p+18kJN?>*8I^?n|r36Km~3RrxOn zx!mQO{*?e`?@x>x$W6Zd?rhN=hNnqLjss<~k)KEbGgm$5VzB1t;zKC%PLuv%_drEl+pdUn6$F-dHe#Pk6$e)6DY9R17K>JPGx zt_MO2{f43h-J7B78-<|`h3ClK)^gNx6vJ?*U8!_TkD8CnfLE}$NC|d2X(~;`iB)%-*en9 zz~#8d?JnY$m*zo{Zv9u^>feW*v6d(NHbdStJQ3bc`$Q)fz#3jdUsoCQ`38(C_;k+j zsQL64V%Wsoe@fP`r%Y&PwdSsac`Lvix2tl6(Z_`yyVI>e0@s^;EYqCdaFSVeD+b&q z=L9eDJxfg3JnK1VeBwz%DE@v>{i7L;-6}(Dq-3vd-?5KGhmdR}E}!Dj~A%}_7VRD(p^Y@;LGHxIds#cv{=Q!G;CFB#T%$e>98Yoy-G9&}@fCCiuv zcDpu4v6AIVS*+b`l^c#%*vXEJ>pm=8ZAaBTt$K#q0t71xkfbjXjstm$=j1`_?{sFm zlvK{%kc%u3lx1+E;got^N(tMgV@M#L)byjiyMS`XxBKuidf}6VE_#fEJ|l~{v;OOm z3N^cx6>DaOA~PZUzFr*~;``4*b?OXE4A2(vpZy6rZ%xU`^0n3CBgF3%p2`B8rKt?A zmqJa+iC2tTUvszI0H&HKBB7cyQ*u5UJ}q&O%$I+0q+c#1nyt*t*wTs#(G&xO|6JCJ z7*-+IZ50>;tZ{ggu?G`Y2c3X%`Rt~U_&X4L_9(Hk!oG6DY%-a?JGPs!NO#>!@u<+4 zTAD(>1GECWvgo}t!+~3Ikqlr~uc*k zY`X7Xr)$MnWl=X5RsFGQf%&ybvUe!FI+wT0H75nfP_jxfl46j;|JXBwrK7`9M31xhV$4KSA|X~wLc`a%o{p< zpTs!}q&{;n^LycYnCsGAz`2vF&vi7g|4fs8-0tOeMzOQB>J9V;TVl9{ZjfemT)?-1 zgIa6FENYNGky{?#CY4trVXXPj>m zww-I;dJ}Zx25^)K0Jr1<2@D`F9+#DcUn90W!TUIx2W*s#Jdt^IW_GIzOkIoRHOjbK z;l|How^7<(<(V@kpuqjp3*$%));lOXv@YsjghG16>T|v_XtqbBlo7TcC?$dH8u%8V zehY_5Qlz_rAB6c&*Z7Bw81j)QC){uSVVpR_zMoT5h`G@?CxiPQAkXzgpwK~qaGrDp z#_jyW^s%$xWk)Q2e7t&VeupT!o-28|p|EoL4eJ(u9e1l)=*FA^CZ%>tVqQ1Z`SIRa zUG#Hdx5u+P7VJ~dMcAsc)2TBZMhY}~KICkSU#3!47Ys~`+bnA0lwR|fd;H%>F5HIS z_YGhSn3x&+O}_AxE;h$JKyt-E$Ti)s*N8TB$-VlTuB1NkI6p z2FIxvQWP;0No<4s+JPq|0oBriowY8+8`qO83iknxlbE(aGws#7M&yfsk%yaQdSo6z z1*0C_4|j`8ZQcL;@|$@u3A?;q2Xp?Bfa7j6EjAIw;$+c*JNyqXp<2)fqv(lTdKaf9 zkJg8DHGylV5(LF!A!{KB;f1!B`1oBks}vb|IL>rgP_f*(BrV*}NEv|}uY-x@YVbO3 z`2*jhD84A}@S~su&YC0-eg@#v_yb^_C!KPTgGUA&cAzlSt@hj7b`!Jmj2})Zpv4r$ z8!tGq8PI!6*($c5hXm_R6D&8JL`~&+_tPf16@lW4L24+fBv1<%M_C^^l2}n0w^%O= zNaVShkr&=1G%Ik<#i569fd!IWzctl0`n>XrRvadw#z0q5PcK(-r1N18ewX!Z(8mWycKtbalb1eGcvds#qw_UR}>J0T~T)! zfty+yV+`E;gT}ZR0$|21FXvm_L{~j5DdE9;Ah#{)=vvQcp|D}7>v(RGL*A#o_XsHk zaOy$$xsXKh?8VvVF-2#8?klbZ>G_plRkfE;^3@u*BWLL(L>7V2igJb_mrC+xYg?~C zipTq*Q^{$chi}ZEF>oJ5gO-e7XHz)J@}(x+L@m;hQG^F*xhkXR^4b~bwUEpO`R&)w zBVO?GZGuPO+1gV@_R?Uj`7T9p6y3obR$AQ(iSM7>$#9P?yfJaf!{F6lrTNBLR&U3W zHs!zlPn5>Zo{=qANgjCvg_FDOw8`{(K?zt;|3XG|dM6AQPrE&862erstvs!N(%^2of<2~(srjeZEl zh6+aMD;z9~qMXsqXUX&e5V_Ws30+E477^VBu3sW28uoK{3HgN_0HK8_4((m1&gK{b zc`MWJB`yX`^&7;C@t3@&rS;mL?(KmZ2)74mDMZTTcU`7vo~Z_av77#wUx+^zWPtA!ZWb+(RsW^4zr zqZxdtU4vpNU@$73|B!|i0HVBEIk1mOoqWWBPq^{3!(XTpbkSI<6>3_cj)&^jc#6`} z`&Y^D@Xl%W&A9S(>^OD?Gt_`5zp03*7?gWic`37BBEN|qm3P*;yU-%~iBL3fVYS6W zVs7w}pGV-ZtcINey_9d-B;Sihuh|9A!D>RHy{?S1yV3we34vEkc|Wd&9eFrGb@u>= zu9pH|s!7(zIlTvyHUhnqfM^0VYW)`581@Z7x?&(?Hhib6pe6umm|;f51+9GKUk@?G zNDb2Hmg0O}tbrkthf0Ka%O;?d&y3rU`DUsTwR$>!f6`?UX^3I!(r54z^5=qkt}h#n zI(UZBNLFHBgG&$IXrDDpnX`~h?>yAk9gGL#jcgH@o%*ZeP8>aqR6icBj#cR(8)@aRg6`iWE_Khw2MZ z&A!f|H1U8s(K9vI4O(IAR|?VZ!3I@QW4tHG^?}Jsq(6Dyn`g<@TnIQZc1Kv>cf=(- z?a1O&nmXtPX&oL$l#Jm0|AQoj zZH1?IO8T9guE zrya2BYt7Vxr0t{l9W{Fqj-BZdiTV_&G^ZmI1lE5hMY*dwIX8vF-O_cQWgkktj^6-r zM(lU>_7xoaO4H}5$y~_zgoJ@WXBpivE&&K%SYx^l(Yt!X3|p3d#rK#jaEoQ^{reP< zYIoQsA}N1GfdG14VHzR2#-R-I?tx<68$yB1bs^^>|E#AB_<&8gH+Yv-E?DMKBKqhi zZTZx0rJbDvYJ}A70|9Pm|K^=znNa~*@w*HwUr{&?oiy(dwp#beo--^I^S^#?$U?Ja=j=@*SX8(lek@ZHr;M_C}m< zvcS_cL*p(9D6Y&8c7L)$Yp?-O5C{FD?LH_Twr&;Z(NnQ6*}9q=5f_N%JZn`&H|HeH@1 z0Q?`azFVG!?y`;*7-#zPDmExGS!`Nju-6HERLQcuXr?w-Vt`tN60H#&)so{&<@aBf zjXQ)iUO$4gee+lw0^%#fDG?}T_|U-BvS0@f475N7WNP|E7Bb9ash?ZlVQDCD$NcAR zIm>s^Mh)m1;SP965{d()b;Bx^s+Jd+@if`r(yFU2^zXi#0cIOIb~!Fr)`O#P#SsBO6en;zaM3ai;bHte5$&+9h^utXv#We+ zydsoj)<%cM&+tUZir5#wCe=u~u_ISkkWl*jYw3@ua-@;m)x|)w8k>Q+{FPQ|9BmG#_7u!ZFi18`F3Q=@=gQ^Et}=)}#l{=?GGm@wx)>?huF> zU@bHFXo&U>#^hA=;O;p1FJU_i62+Rd>cCMnvahh_|CJZ;cX z9r&0gz-%Lgp;m4ZSqdS17@o>ilHK6ZAePia8&eK|m(tiXrBqdc_cp*6r9YSUdZw|7 z{=LwA+I9J@rl~B1$#j-x1dZ~oq%7=NV}@B+`qJ5CRxGkczbwd^RJT%!e%e4oe?yr! zQoTZ1l3tTA(jO*aJ*{u9ygYx++Vfhl za7z(M8EW6Jqrc17sDtN*AHwcZ;$ZvDZkc>soP48yntNaD64P(GGMOHbXK?@wC-0cS z_*Rf?&6Ch{L^b6Kd4Ma>2`UOMj(0(B2)Pgp|8?%2BxBT4Miq;h;iuI>kGSva#1aQW z7z6roes6KWEP^^yK}x*riAPz<9Gr>Ni>tVhZl->qoTyRrI%Ii%db-8pF}Wvw$-JgE zX0}JFwX&2mQIYz_=Ub>}DUuPVSEh0^ny3bf+`}R{1au03^|Hpwl%++^f=jfVIsVQ5 zq!;X;$-<~QJ%$O2jZ_klRL(&Gn%XTOLnn0{!ck_g6~rxrC9|%iUfc%j zK_-Z(ZYlyMl2-6q(A5(k1;kAhJ@{ABui>7E9%jsHoeg}7tEJyTW@>7>I-IHT!pB&; zYs^Y>yQwNMpzOSy)&5J>zyZys2^i#?8-hH9wm~!1i`4Fl!y^^Z&J)+!RWRS-Sod%Ex5n^{uVA{9Ngka+xLRG zrRuUgik{?YP$`2+_*=^EH^sjbSdq)g;cOsMTB;p@$z=dllemI$)N}pJHt%yn=J}V3 zR$_x+*EW8PJ$TqHJTDoH5A=@P)t!jY?5R0o!*$h%k-L2;u1mOQXg?KkdXNs`f!#QZ zYQiaaFM!eTjJO-tQA`w7_S)!n1dk96gC&m}Wjjx>a(>QJl(LhmR(>b+ zNCDEcNSVma$k;dE(fkqiSsf=8iQ=&hkA!|?K*$&FN+)@OHUj;|z6Rp*{M_cz*&kwC zJ&l@lS@~dp9OxH>R~K`vFuyj#%oPR;u1+oR1tgh%^Jv8U%i#ZxX-db-kR16s29Q+4 zO9LyBca>`t`O2M!9Iyqo&KT~<<=?M{nB*8slh$aQ$b8q?PMcnSLjxiUh%;61-?|CP z?gU&dx7YoFDIGYQ6>W%#-a$wtig&wTP!y^e53WPe#(aN~ZXTUs!mGK*C_E6Xi{?y> zdKK8krPOiTg-c;`>&#II6$223>!S8;5i_m1kMZ~-WEj9yPIBV2@Wbl+&Q%0nAA|P} z?ix6A`T|!uN5EIuHLk}N7Js86S9<7xpuO|S4X3v_$L>joPSgZp=&aJvZs`U)YPNi7 z6+_e7JtLz9lCihHui*DamlqCuX!{AaI_HKWQK%>{py4U&NT?P8X^dFIKlN{&$DBTc zf(KftOQ(ZcW7TbT?BD>OtW7!pjGG)$VV`r42&!1=3pTe_(BaneU9e84{gxoDi~(u< zIaY+bjypRoN;)75QoS>XJ)j7T$R2aDv5?{)%~mMhb+=OoX!A^{4mJ5N7G~SHDwSiLu4KDx--`-+jm{5SqPaA2SaQP-KS0jPa*?lj z0+e0&XWsvx`P6@vMzEzw($N~yeGeMLu16Z5*90m!n;6+p+5#sg=KYw(RzgA9fUf!w z{e}6<()5)6h?Sd0D$EJM0h}ORbAj(uI3_6z&0t*sT)mD85K^@RHBd zRz1gkrXk0uUthGxmkf^t!?|hTHr!lRC-hEnf&g>-QFP+OTHZWL&|ASEj6DI$X9F4M z;AsLISPHR$KtU~H$4nK~yKC zA|oMr;I$v-0*&6xjU>;PZSO#Z zJhquQy#`fe_Dpn&$LT_*r8Z0OHGxmG9|B!v5nTU?D});_-|pdBHahbPWX9(z)a7{s zr;M{*DaXn3hG~OzJf0ua(aid3vPDT2F01G(hVST;e-A9JsmZlv^VU&UgV<0t@7l+| z03H|jbZy%mz5JFcgum~1Lv+V!71CpS8L-(X0g_pmlE0mo@t=r3bTQ6|Ba%D@8`zNn z3VOXu8pIa2c0!f(;oG%o1!20vu z>5ezni50WE)Hn~podrk*eEqK{XfA-~-ML4$v5{8yOo^zG=$|>3g>6ObRxTtOD@-~m zx}Mu?Iw$aN9aM+bH^^OfA$m_{f;8+Jwbr;{ws}{g)fKT^cm+@tF$np;Y@OYj@9(QF zD6lWB&$D*K7U)!2S=@?OnZb+82#v)DY)A%fl>QzWVMJL*1ErLnBRtHq{{o;xIHdC>G;+?Hq=$JWnO88CQDimtf^ zjl6KhqdV?n;~h64BV)OZbEIFu<_Xff0EiJN3^Ds(>E{K?9C#XKi9Vhkj1br z>vh85r-FbA&H|-R^EYvjd2|=b>p?ihz;abw0aif0s_mys^6%-s;Be&%0?$AGbqm3B z1(=~ObhBQ7%k^a6U5b@*5<_!4E)?zrc1O_1^Ts3;bdHHQ_QqX?1?IsBz(fi1k885G z`oaBqRP|^uD3HhFh>-QKPH^C^#Goh7R9R$LOAnFZ4ORciJO6oY$6yU3C$JiHdnA+u zE7N)20UK65%@)Pn+|9p)0oA%$4(fLbZ?cn5W2iFLBnmAVFQiuv70h1b*MmUN{J+;5%MTCe`Q{>4&X)^pv_(%AXvsmaLV^sd=ToN-u544HK;^*cu3ju-6t`voU6w)rviQ0iQM5NGc)7YaMv;GkbIS8 z5jlAD+js+llZ^agk+fw?osBqP^Z{u=%rxjW)c;%+z|7owyPRTsx&61fF**AGRk(Bh zCp_YI27p+{^&qgjtx{Zbxt9EI?+d6XQV*R2BP6P!Y=tK9?`!cNdiQDna`Dag8<_Kb ze!Jpt6)f3bmiE$||6pqVABr>pfbXA_LV*7ZRZ2wwAg`W3RUBWaS!${uypUpq|F{Vh z%8LE%nXS5K2a9Pm4m}mA+v}%2?gxWA7Vvz=9o=03HvOOre-HmE7I0K#|B2GCCc&4E z#rgw-kUN%`ngpefFMe(k;;5|Y)G9Kv@EV-KF%iEF;Qlpl^BjEPNnV_P(|JFJsO{{hJC!!i z#>F$m(fmyk@=#qbHbk%RSRkoly=!zPa})#nn-nNME~0N&q2@3wNA_B}$|cX+^g_VghGSm4ZD{5r9dWq2M*oBcD6`^^jK;^<xmEN>NOKJ7%`2{bD?@c&mO(8Dl7!NjK_qxc3SPnH4GlOS-7}OJh6+2#=Qu)-)QCtce@6;T*H%GAF-pl$g6OE59Zy z&lzqUVct-%%}1oz0+w4*3`%LUhI zJA1@J;{$Q?5QXgYI)PEyiucB*tJ#){+}5Bq4ve^{k2TQ?GGOM0qCkP83vLd%0?WEL z8uxuLy8RD=($C0rAq$c!ENs=Qs99vnjE=2l3oObCKX@Y@j3;*!lVlJ*=TI>95Ek_j zGT1}+6l;S@`QA_^Axs+&O|ZteJA|-V$AfK`sOj-0ibTP~7sRLD&WJ6nR)&7GBI`=z zI61}_`D!BRnA>`tP*kfRqZKVy=Q+mH#T70>7dJ*t(dcEk;Nn1h3V?R%9Kl7e(`SKl z6JFH_6jTG&;=6(kw*ljCj)FcGaHxJc6}*hkI27s=08(hZHDuG+2x&v4${(>(R+hlt zU21;8{A2$?y~QdZq=(hR`2tEvI7& z0YEbP5#0YV1d!BKW1bBKP64nkncnPnmOcs);VSM?;(cP`KR?+xCal_52=H`yGql_1 zqks^y?;lK$0z&AXPY68>2%$#-A#^7ogdPcm(EazpfPB6Nx++Iz8u|Ri3vTiFoj30; zZ0+O-sHUp1q5;X6wKll`5j0ehms6eFhk$|IIpXJoJ^c?>~1ZKFa|c?>^s?lXXvWuS!{>e;50s0i*LHXDu;9pWS+qsn2(2C zkaK|tM@0MHs0U3#$93+ED75LGt1xq9DE zR2(zyInXqxCd}b69N9`*o_zh&AZ-u8NmKK!$=S(}8Tf}$D_`9>nihmBWb|0w`Z4j0 zaFB5CF7T#%wO2$JizU&_isOf2t@W`brO+hK`a0TL2s{LVE@TtW{1H_ML&LNDXu9y5 z>J%#TzmS0rPRQo_ny9%eNeiq;l;Y_C%Q+PW3C&nRo zU27s#U5V(bZ994tJp~EmjbT+3YOldE4?xqFR4}2|_@)zi@`_r*kv3NQKm~oIhiu)lo$uWtAA1}Dzdlzg8#2R_r%i!mL5dWV zIJ3x3SI)g(yCIw&j(N~=^?#}wf)mksvL-nge6`H;5Fmk5GI}yC0YtD9WXAA@(5`T| zLe5}Ev3grnDj*&f^jKL?9hxU}KF}hSvO=|6tPt0ILxwo&Aw58ClWu0Kbk&oK6?ul_ zIpAVxg7!cu&oJYy=!@Ho|2!|J328hU!`4Ya=+~^>39eTn5m&UXJBzAHvmB;yPv7{$ zYJs%w()~1{l4TY;+g8w04uE#2a%RY*rtVS^MRVfo@~Fd!iA3@$Sqj4j zJ&PV#BeoFyJcnaX@~Cq;CC-r1!6qa3BN~8K{Md?~qsZhEop!?VLQTyG(rsKq=VqVF zbW~99%q=yKQKB}-pwI4b=FeP2=v_NW4+!tXAY)|B%mi{@El}T~qkP{tQo_0pSv=2R z_)y|4c*_fT3tP2#_a7CnBB=H;;FUfCVB}XBMrf9yPYw+Ia;bz4b6)fMm~uKZ_NUDI z#iyQArV%(6A7~1M4NHT@P1$vUIKkkN==VvBsh(%UREEWoNzFcw&*hq98xs1f*HQsL zwOJh%z4Bp9)=L1g8v`_7I4CTEA6Y(V-r0HpE~&bvDO$dN6{&h=i)3_~69fXnKSVMV znmMbBb?7sp1LuzDeVxE=UGQt+G|gnIppxNuF!2$Hi1;)su#p_yc0d@~Atr(r(p1M# zjge*i)Y+xHsv6^W^fqbR9(MDFGq=YeyqO$4)UUwP;}Y%E0DcsvJkR1eq4yUFO6ng* zE?i4+BM}m+SQmE!5QLw`DTHyd&p z59&MF*Yg{G+2Ce#AVINSzpSCcJb`9g`{!EealUH2$^cNP2%+3mckn$Ok?&8$&Mwc# z`~b%6nkck8223 z60Jm_M7k~5xJ=aTeHucp@0tP){sPk-DXO&#CX7kU+(_U1T+IsJ`gOxf8z*O6xN!Nk z+KE5Xu$BgYn>#}7Ms)%io#drY76?K6pArmCLQ*k3ZtI3z#-9hDL8PVI3(k~1jym6S z174Ilnn-41%g&b(*ofuQQ2zeF%F+;es)vG&pR2Rv(6K%Oq=$-}!wp&0*BrOxNx4h(yR7GEt?BDK7u zKf+W$f3&RmUOGLq%%6XOmT(~)YU%;Q@d?;j_aSOCO@y+s1gF=YLYp&xHukaYy^Zxl zN*LmY?XHp$jkk|j(^pDFe%yO)>tD2mo;XW)LJ`KT;6AxJ0TQb1+C)hQ5wXPe+-5Ca z;WB!qc6A(1bdRfg3|Tycn?WE8<{gS7yO#!v^c-fJ_tl{v)FlWic52J85dv29PkW&& z!$-elAx`D?C0s4@Ye~gEYZ?zyC8v=Vjc<{+?A2atxD6S^IpFJSJ8}wH$F_9>fI=Uk zP%sVwm)cMM8mvh$b)S5I;bx=yo3ViSt>BXm`^Dd%Zun`Ob3(*5n~5W0#!iIGD_{97 z?y$h2DloJcizf-@wAK%UH){7(Fd=JeV=x}$w*I}ZMEg}{=T4ZOf|L6R6~omA z-rWz|e8`&&ubM_RYTpAJx^99QTwJdqq4nWco7qcyw6xxBNn*%mP$ArZEj|9rHiwM0 zIk!V+4on^vHOyKIoEht7xs;dPx@5nVbC9=X7f%5`2cUZAPX8t<;W-HsRte|4pqA4C3?j@E15lv-k``QkA^$U_l62 z{wSvSnbkocsHg^q-#$c3U`e0!#Q}emBfjX>m81oaRtL=#t#zaTBo78i$eCNlnp0Xy zaJktbZ1PF=s#>M%Kp00bM6-<9jir`n5Ut*#|pV!^TLz73E(m3t&Wmh5gO z4A3K}xvj`&1Ouu#EMFOd%)z};Xa6zb@7#v7DIU68wNJ)iCN%asa?lZw*G+fCRM z!=Sou(&JobM=NonzKF4ElhPaUrm`CgBgAvb)aD9}2{xWnC%6 z7|tlek-KMBhna7fJEt{k{F^hk>w4z*!r`ehts1gf@=*f$SD@ zp}k%rvm`%#SyS1n#&#kpXhaCX949?S-sguhKY9fR#7oHnpi=$By#FpM(S9K5TyJVN ziW%q1W;)oWmNnwhsNgW!PZ~+ZKDwg9AIsA*+2epJox*)4F02?CtEXr*WEeftLtm*9 z+hJw92%C*}p@$GchrrM+55<>W6AMfi5>nX)-v06&-Re2Jeu+NdAKWS)nA$ zlWs<=r(d;3siB7Kk$mX%iXv}eb`Qs5o?nNKswdhljJB4xQ0|@VTXM;?+V-2Rm zh(Xhc(PgXQ!^gZPP0Lhu5(MEs1r$0O*pOXGP-CW^I4a)awOr52 zm85KjmD{ZRDgv7d1G7kVGUMl=s-E}h535{X3 z`+^P5wn5Zl*j^Bc989%MKR(^%CXPCY2#P-sz*q6v^Ao2bH)`qT* zsz7ppR@(ablaYe017bf5;jgkm-)>-8`bf%JD8mot;4dkwcc{tL$wEQV(&%YU$$4T)c{I=WT>j@t>Y8Ma_l*K!pX zG!$}_j%j?m@#4irk3o6W)B!tClli|acfcJ6aY)KDehGUJcp8P9fNd_tsu#AC?01K^ zU~cBKHRg6rGH^DUdAi7QWZ;zdTgMfRooOmnze8^)ra7Y+i|yLx2rqbk9?z38i^sMPbhjVme;($JXufwHFeV4AH)5PMDGYvee{~F)B8$ zh7PHd93M)bO^dhh^jfe{5AorWDwv(iiR*yG`$*zD?` zIX9u(RcaTOxvoTBAbOY}8aox&U=S$H-NQG`9qIO!{g7;L~=6N&r0dAYceIYUiwMBdr-yYlHH6xuZ4j#GQ2BD?=dqOtxIWZlrr{{#^ zlJTe$-49)^9nMnmvD)vruhO9iu~yVl+l1Q4oZ4&5LSMK@&SUhFHU=*}fNs^+pg6Z& zuZF=B<>dM%wU2Bh5J%C;5il*K{XDaK`k4-wt%SCjF^7Pd5YWMgz}_$~PW1z`1d!DX zI?N@znkYR>eC9>j5hu-oAXhjgcPTH~DJo#2;x|91BK(P;1@d%4n>j8s4s;U!5}SUC z3PUK$qi4~OeQTc)r=H|%<@Mc={CYA-HR*1Op;CnC#q%75Kj0bUbZf%0MZ9%$!qqG* z(*DMS>Z5UbqDC+xhr_dhYZ(R;2QWSH+|>wpl*Ldc;EQ^3uxYm25Z4lDO@XNQoA9P? z1QpP1hIg|W0p%SGN&=YWJ3{ihckW;-#N`wrq^xyQ&=H-a7LQ@NB86Rg>v%E|aZ1eE zwbVFzc|k9|*Fa_Y4dl9r6$L0KM5|Vq?_S3kgEGN%BfSXGw$2B^&~P^}GBOPSM2|JV zI&$V09hOWH+BV8pLJWpH6gn=N2wx%r-MI_^5`xC{6Q=;v?6Wg!OyLEm)0kf~faBXF zFi&jGY)O={i>~iF?C0IA;4cqX;@@HW$}O%O?iCL)B30A2j^=3~7-Z5U1FdnUh4z*s zN4(3LYXkw+e~=8}UBFazuq@jzzJ>j#P*C9wSNPpQ_N4;I4xUQEdtQqT4QECWwa=Gb z9i3!5I$_Jsg7rU-13PQaA{&L96*fij-^b!i37aJ?5#)3pke!dV^$XQzFJ@HLXm!TX zMU^msJGo*t<{eKmoO3J)-;YDc~*m`IW_NIM_H1Wi17yAlM6d+zI(RGwf?2wFF%vfJ+ALtD?Aa#{5sE{`fGL14AI7@c1Dh-}&uQR$G6RZ!2IV;b# zFP?!y4@;p7Z*QGbd`o0_Xx4H_9ddrU@%=e8+l4A}5j@yjUhamGUx{Cp66}NfUCjDu z)|hv)R5Mg;2ki5wrTYo>R47Y_f>l-HNPB);ZYq&=$1O51H!cIEX(?7Dd7XG0!m~oH zggQ!lv$-PBnr%74hr!Pfdha3JWdot)%U0Q5U?9TZuw8((@L->O+$ao2bz#Tbym>B6 z=ZDgWEr7iWhT)>S78JMAE4P(!ROya6y+OeeszU4F@T4Qty?JF6$vsE4jvXYJXbONw9fSeD z`%ld|!>I+kA7A$fASD}|M^v}bAT3L4 z@(J0{DZ!hW)&M38&=?DJBCmhZi?8RlKHQ0*I^ylXiR@h10Ug z&m(^}DXS^*Z3U_RL<+l{8%WcK!vg@IKu@lM1-D#lB*lLD|TGhvanl!Nre09SxHuB``1+aO{dy7004kE zPJVo1maqZg!lb~v$MrbA9xv;&LIIF*f0`CltFl3@}#rmmX&->c6`BV5U zYU2ne9as-{+nok{lV@s5l7YK2Lhnl`h#}?t1Osdwz!Pu6d32}P&PX1x0R#G0Fzk6~}<^--{bF zQSDv@Pm^Q1g}P?G)r4Fv_sj~lUD*Q1lZ$bAJ;Y!%88=*TholFZyfmcA8)sX7FD`bs z;Am_LPCNi|WAMT`%T*sx9F5Nm(u>;>4w#zin^YPB6#1Qtq$G;5&N(drB<|SR0rRtD zZN`5N`iCMtQDSt|1E$9&Xn8?3ms3i+`mWH(%UscsitDB*R!ZXe_Gs0KUnPN$udHVD7YE5<0wAVs;(nbd|k3Kt#S zWkdnpTb5oItel*VxEtzI!Z$grceBcy27W zet>f3rI=`hp6g{%%&y}{3=qhLF?#zAksr}6&=*QNf?1=)J6#Oz`IkPviu;{+gCIDZ z8Y9>c9d@puj95mx!e$(&0I1oE6y`K-CeEaR->4^CsV?3Syx$X6#709~CjoWOIizL^ zfY5pEEfH!O=={qDZj;sBZ^iy}!f@uKVV7A{9;nC-y1Q?JUms1~>;N7L!#&Z=6CxBP zt;2;aJJd3Hmg@C!-vs{vRuzlBaxpltcm?=iJj)ySZFYh4*t$bpD=FHNi19)Js`=IX z;TAx0EC81>LYvGB`e*?jXcj zq;MNfP)({$Pn~eRY%fU)57u@{orpi3^Wpykan`1vIX`^OYF9O<$SZ8dta!qKm&{ze z_1jBF+*2mKm}{YAysz1^gIAv^naSM)`8K06R~qQ!m*iaTn?1Ys%rJmkNk!1CQ3kRbkB7sQL@tQX9zbc9MZJ~c`?l}RC6S9l-y?_>|6 zE8Qe>7-X4x9V2UYwdalk?Ku^p5gtGQ1C@0()@{tH&J)(Fi3VdZt+^RRY}0j2c-^a9 z*TXiz5eXhCqqBk}KGV2N^Bhl*MEn;@L{jl|Z3|9cSy;~_B#2Q*3P>LQJ&fa zZQ0vV3imy;r4G`p+moWpwzHZUQ6{y_PCJU70^!`KGL`rnCw(kbSkQ-=1}V@^w2eOg za>t6h-<;jL^`1)Z&n8H!UdNGiOKIjkM{mJfc_0y1Sn z>gbw*6bo4o=ATUVIys!1p8AMSr*ohyR~YU$e27RH!hR}A*KF?`|7g$O0oRwOBnU9| zV)m(J@Q9@+Eu?q%&b*f^Pfd*wi-~$(Y_p#A7FMfR$%o>DQuzx;iIA+DZWK@3VlonI zeq>D8rIZfaPjqn-mho#Q@BTC}Zr;CIEh9vRF9_UOt@P@u-P_WKU9xM{LyOYNS4l*; z1vm0f1Dz6=${-m=VEHV1BdE5?G4@0uz56~K@(z68pk!nUv3Z@)h(}dV|D$dJuXT<5 zkX(*dIX;+MzcPjCuSQpKf&bGr!}@a@YWmyzGNH^kPKcDwU1;J}e zJYU4Y5uZZ~%=@{Ok>yTrElghl9pXbIXgVWl23uOTGe7>$2*QO-3B@em+hRP)l(a-bPQ@aJuU^VMms* z;Fa|Gktc8sML51mtXy{sXL$pn%z=HgpZP1OI`@0N>ZnB5+HUM5?0kcPd`Rqj+hse-22=*~Q_m*b+>Dwowk+gJT}~P~q}PkMG8^s1Ddst! z@_j#GOch3h37_&5W;8s5f(}HyOHK;YfE$@*U-qK33z6&liv2DL$cxGmoB=@cNUryq z$&z`JE7a+AbfPG(+YuP{a;lY3->yO{gcKeBnPc;v46gP7k^uDK#JeOQbyB?cDK7|> zI(DmS?{2}s1k%X;ukcKEA^ozH{nP8t8O^wuaGTeEsTqLS)s`ebu>2TrRdB^DWgN}2OUa6x(K$&B7#Zo6^t6Z7^+oOX zKKhDv%g5f@(mK(j3V#PLDzvq(Xi6FDv`nJheS59Hw1erk`P3^vo03>7<;*~V4?)3h zQIRL;#SE1TkDr<=9D}AxF7>!d3a9s%&GRF1nPLJG;0M>JPQ*ofIDiOfHw;HvXdoT5 z-i|r{0JZcaKn*J$%m|hZ`NXOrrgAxEnvo-dqTzO)6Il_tL|dgjq>88)?C$^B^!xX` zHs%~CVvXKIT-2#8J|~_Ep^mEcc|k-dxTd;WTv2n`JX%#22abfV{dn?*4(Q&uOD z2gY9FWf*##pWv}k!rnw_cOqGNUSn2l-sn)4$e6~BsQTq?em&^tvRsN+(X>=BHe&1)=)GXgB>!JUC z?oSsE(;Rj>d7^27HYsyo>@la1^J!nBw3S+*Do2zc@9n3iI&h!kDQn}j#xXK9I+k%- z4WNzswH{mE?`e97Cdi34r6TxPm46hIb=2HrY|(Uc4pDQBVd+Bn;2pqA{tRQLL0*g8 zRe4pbfn1;^`fW5+^|W=IKM&79&T}+VX?El%+2;K)do5aR4Ot-t|1D z?GxDvQ$PSmM(9A{kJ0n$D@X~a7&~m~kwIBUvin2#bk=y>#2gHzt>-80fY;ec=k?m2 zcAcNGp{s#;G(f}x4Xw;h&O`m9IEBRjGk-^W-tz);*j3ry>`3{U zExe@jtY9!pLyzelPo??buPeM*66TRmKdlI{PBVIAfxsfLq!~#=CV&9teYC83LHGnOyqT-1w-rzPZzojerzAtoCCUI} zS3CIE`CIpn`q=i9-TwWc)3@j!vMkVM4tSpm$?m<pp#6DPXke-5swS56`R z-dlsY`r)9Ke5Fl*=m#?Y5U2C=JVuTVW?mS%i%ju(4z99G0C!G{C#Wsj7k=4^Pb~R4YS4eSSR`Z(#l%DfD zT*y`@EbWU*|0N%AZka($&!Z0013O-4w%1iGX&P z%OkreYn`2Rt{Ab-D{&<0VoPy&KE+bzW~=p*+%7hCcv=PA_I)lW7x!*j_jpQ&_n9FX zlC|+2q`|HX%>9{=Tt9SE^=MLp1_eD{bkxdI;HHUE>d1keaI=fEO$}KBTueAlBSy)T z7W(wdk`e*}XquU6as<6GnWT(2%>2?L@Lt_j9=;ea%SW&}?ER5MXuhU2$@=^Vj7U@w zWn7#rgr^%pp{mH!!w>L4jPM-(Z!7uz6x3s19zCNGe8_tV8#iMS141Jc-IRsU7OTRK zkjni(DjecWFUZBW(THG#q)gY}qD_Gs$?KGqkZW~6ef~X9+|zelSofFlkz01(4(jac;Q*vRn6{qO#}{x?{h&gqQq&0*~jdjEeFED?WNU zeD>tA8qowu2BVW-Nu#$$Eff`*id01XH|hqUDBS2-eQ&aMm{>|{!>PhKAHe+o#bd}h zrpiGxf+2-eeN|dE_6?c(X2MnM1AaS{?c>SmkE^Z`VMuIpFc?K$m2I(s;!ET9#bG~p z*WRHd#<1eM-V02KSww844_S=T%jb`_ciF9?o1)zROj|G8;{rJrEYxp|&JEDbs0o|J z5hPOn{b1(G<$P{#q;J-CuUHg9y${^exb8jU#M_ayoZuzb;h<9~@g{|aj3%akex3k7 zs?7U&uFv}BRm}3TQGOLzl#8kc64au->-EqJhE4?^dmn`qVPx-OahN5q& zyb1*&=2x}uNqAa>vMH!gouYaRXZ|P|utO-`h^=r&u3L}W#v2M7=1p;3!*VT=If$X* z6TVF}C3_E^$*@Ptd;|LSWufT)M53k=!dy}({#rDgJ7Z5>LlFoRgaX+a{GAgz#ibtN z(Crc6&1akXc#`1w{-7G>iE*rO1I zv;kPf|yI?3_u5dyI!S2Nr0hLs+c1{w*+JSU%1{2{#=k(al7U}n|1^$eb9BKQ2~ z6L}llV5!;qAVeVHlm4SC`5!0GYViLRHd02*a`y}`N<bB2V~;gBLKwEI*_97KqX>yT z(%&&7Z~u_rHJ=HZ<{a@DGUGmP+^Ol&&d0Y51bv8XkxjzbC>gJqJrNF&w-b#^@qUeJ%vKL5|sZHqSmPmXjN26L-K7UewEE%q6)+`Ca&A?%vI=E=ZtQ2WwW(Ald{?B4^zgO zRQHwD(mFU`8UK~$vF}lCxSv@;HS`#B(bv?5Vht&gNdDv3`@YcfC#C5}VR%1t4pERC!p8I&{4nS@%;o{ zPz6{U*!KT^a~Lp_{qyS+kU>+vYP6KZ|Rh#Kh{$ z&S8!lm(ac>qN(oW&XH47M%2fR*NT%VHM+i`B&du zK-g`Fx{#RCgZvMS-KU!DvxOQLCTgej#M@h-utS(y=2qs*cDe*=gK^oUDE4l&4Iph! zZS1?MV#epB#jJje5pgF$KSIq}sEHY*Lk^V}(M!2H`tvE}%uXRuqV4r2m*aE}jE&~G zjj2%oXq@Z{OEn&{hBTi6B?;9^eQM>Y?ga<^l{szHxGussVHti71y|j_x$nz=)-T!M zQQYCbdZ@OzcPJl-4s>YBo+m18&BtuHZp*)4@odk$q-TQ>g2*R>;-r^8ZLYSo#JwA{ zjnB@!{+512qDwj7)IX6&>bO%k^&3pC$~9{_6cEcQDG z-|!ro|773?kf-r#xx+TSnPP_r?z1Ypx;ho22&91x<#b8&kyMQsgVLshS=Bdtuito3 zHVVY%@?FNV4eAK5o0$^`Gv&meh`+Z`sFB`LX7}!}>%I*v*iJ|PkfKF`WP+PK?j#?( zyc6opGOK;n!#tDv`}k9PI>mL)T@t+atp(j`7s?d0%6uTt>{)CMY|U#(mv-PFPTDo| zCTHZ5J!ys@J?y?|tQ%X1LC!K{(d zLRS$CMmlYb!yCZjkjB`z0T9(@icn9E;5|9Kj6G8*OMdy8IanvNQJ!g+?Ex94vZM|S0mqNIYsq!m*oYuU>W*E@KGW6eBl_eE;@1CvV2%>w{>~bt0&G}Tz0;@UmHvze7nCJdOz&*0?I?!A(Ldv-QIdq z;Xmz~tQnoyVPCjZ(z1w}E+L%dts$p|uYsZ^;81ElanJ(erT=^!Zu}ctHY33ac1%Z8 zwZ|A#<_Nj@G5~fn8NPb&)Fl?6#4R?g{2Df>B#f&te?~u+EHYVg7tv1}_!SUbz(+># z?dhqV89Y(slhFMhZuaniA6VCG*JFIl=2p`%aZ`v!IerTTEOoQ$sWUaS8$uwTaCh>w zJ*gEe=SX>0u8tmkWPYDt24wU5&N^1gYLY-J!}M-^G!T{Dj*uL4kT!E>$rQgHFEJC;;I)?lcYCVgfk*Vgg+n#E-`n)`;UC)vD;3>fz^s?@`1vz|~t6 zgni%Ti7U)^bt01x$ztqcN@ftHR*AUorD}MCq(U76%czKpTs&Cdj3J zF^MA~IJOXtjw<6tM5iQNkhyY+_tWG&g>Iv1U!KEX&559c)6-G;$_SOFAaFyH9) zWT0)$Xs0FIt4D@-ODmAc?ji|tEB0hat(xeod-7GS_H&gKnSE?p<}Bs_4@ZNr0Yg&X zR_86JL7`z}+ij`g)ZhDlANpJl8+1CCNU-2c`By^J5ka%Xyy4H1avr%lJj^0dA~+A< zdxk#C=+N_VkYQ^BswBPrb{N?Jd{5A}pkE;79~A3rIl!o-gW=i)7>Y7e7@xXXg+Ci8 z(Y*=Gb~!ZwNJ&4>7)AhKfs;@m*Ge3)9l7=>$?rC0`w2d0rQ3<B!qq&_dz9gI9A4%4v@!ItzH*zio2~( zdqfgs+K1E;6k<6AVXl%qP6Yr1Vxa(C`oGvIv`Lwr;_91oSJJ?frEqqlxdvC#cd@?! zyo7SUYFS5sw%SDGBMimL>*j<~l-B2tW1W&vE=i`14bOzEapSIybA*Nbm#u>yKXKGT=z=pMLKt9_t=SAC*sO2JLNRkevpliagWT({>Mtfz6a3HTVZ8G_kAg5WQJ$~ z{GnbDCwRMva^GJTFiz>1%!dG|n~AqL5IZ$(C)*C~^OkB7J*VC;{3^sVoGzoNHfYO& zEp50Bk$ox;Y%GZs@|Iza2C8}LGWV%l=`^gt#>!<}ROWh#bv>Ume8qMYoO6L@WsIE2 z<|b%*^-pPkm;L6CUOKu<*4DVjcV)a;YvKQXY@fDOtya|akU7PeUX9ks6Ef>OZ8u+j)&gWYEug$lyfZxI$tgJP&Un& zwkxtw=Aq^x?s&Agj0Bd1$ti-)vZX*3I=WplEL6vvlW_Gg(mbfW=Dlk>%67RPgYnCt zBEoi2r=RsnNe!-t0Fdk%Jhsxd51z&N)+-dIS+<0r6Z9%y>3u<^EG)jNK7)>V*ZEFp z)GhG1kS*Cn)$ow+zn0?GXY%+CAUeNzp$9DPALGtIbRP&*jB&z@vnO8)IFIGm8U+|- znUOjX5j~%Cjw`RF_M(0M3!J^s96v9bUSBNe-T&#dZDB~ zE{%eeMHmYmljI#UOi%>`BeftC<)EO&7OH3Q%ca}IS{tZnsX8(#P&D3DvtH}}>L8LO zqS^cA^;qNlOC&HP1z^y_N4tFkH4481h>iGuT{@?~-J0Z)9yt_~x2Jve?g~W_aZW-& zApNvK_n%D$URr@lDCu6jC$HzF$|EYTzV=cFW)1VXQToCYlWV9D+~FG*D~CH?Nc6~R zo5MD`0PqTeN4@8xJVc}*n?9(uxY1ekLqGX z=^@ZRt>wCk+oNsfKH-S4yfJ;)@&hmB_)Ha{^M@B%A$L#3Y7^5Rr4qpkal|NyblTSG zggQ|qyUsJW`(8hY7{R<5?SUPVpCag~2#viGlzEK{TBg3kox-n;jYgLm9T zb(e3_7orRp1!Ol>JlPmoptp_ zrQ`B*UNL4}_9b#J@SOQGL*+6)LGn4{?@$0}~-dJE+SpX~OgRma-+M z*(lZ{+t3^I71@u^BmRA&*BrHQVizqW>*FCh zdxJ*Ocm_3}51314ne#!j$vO+$A79nRspIl*vJ{?v&AnCyqGgAnA|^V%vJ6$4K~5TR zz^=iCw0RuNYn#m&k=Z4U$KGFSnTq{ZPxW?!6J(gtQiB}>6x_vaQP1Bj2Cg%atMs;- zemT^X5Fx!4zw}{7E`JVgW(Lezr1{OeA>2NtdEt!`j<%|EI*$ZRi=9--i2&%XoRV+P zuna9H+H@+^<7ioQ2ltTjupK6a`2nt zWM|YWACd0gLCXmBy;^u-n=%o=t@w06w$a$8=w+^ZXjZNAah! z^SxvKbrmL-X-n)4hszz;i*1eYmP>k&p^Y#ZTh01A{~1)H`*&k_!s{(Ye=gIyef+PE zY4Rc)^N5qaLbe_D12bC_t8`rC!g~JQE_#qL}#Qok@fICM^lQ8N~ znZw~u=ez2x;dm5yteI`)V^2MNfzA!cn)aBC`3vGVnk$CWbI^%ddk*9i7J)348K$mb zTwtjMEevO-OmtD3+M=}LFOUfD-TUnh3u7A+rOt^RjyiQ*o1bJj9zyf;Iu76+-?C=v z2=m@RX9|6u@h&pzde~z;j&)<-Pg&0WZ|v2qbBWbsLS6OySR6~se6?cR0+pdR=Q?kK zl2wlOMYitg%n^O3MPU=lo@ALeSO~@@sEl>9K^%sRUi|IpFunU%lrLZ#x{MN zv`?&qs~DHRTaLWje0!flXAODF_!ZSs{s(rohu(RO1lf8o^R*iip)nRJn$G`Cg>V}EL^bt#3k5wc-{_U?P|D=~rQXUy= zh+^x-O+UYNAI0)G*WG>d-0Bg_wyAFqyDCoFKC+sxG__4x^Y2`?>z9=nPyV+`PSWw->Lj!`r~H zaHS17crkZ6(=mI60?uh4IX%?G9N({uXa^yx16RT|cmGC~9lvPLmUZ}ys8hTgqamAj zg@)t1xjJ~9)sERg`XK`ei6OgsO|d-9xJQ3mz(T`f#%Q>^9s}Gly{$2rQ`_#^jODh; zNZ+i2i&dYAyt27{uPytK1MEYxzdP(qas86H;iaf3px6H4V@F2xqdLbn*~-s(xnar5 zX8o?hbFpr}hMiYTr)i6*zJIjbn3G1uf8J@*)+z?Zj(3F)=){OZPjC&%C=#WZ=PtN) zpml4jo%N;k!Z0e|L{;vnasOO63P!w>=`I@s`&D@ujk7tO7J>eT0>NL(tP#Ey8oHRB zwBB_|M#}G9ay@oc;Zj55H}0`vCS;H%qxW%|6GZbHXtCp$obxI$BmayFP=jzrQWTb< z{5m4W2JeC1+WZc!5P|ew^DS44FW9LZ+N!6$A%xXqW-z2FhxA4{O}ITms5lCyJt+$l zvW{sZqJg3Qw!qBBX&?fSa9xMZvbL$g**@s-Dw6j*w};xr_a7E?;3!34Dx)Ny=Rzcmb2x79ZtzI zb~o*iuLtx&SuvUlL+N}M06B-_9975YpVcfWID3HtC8PWe3;hGh8H{~dz1;X3 z_!0D~jg3DQ|30@vWqEkGBoXfd>4WbKus?prqFv$A0tpvyue_nU^Kv->fP7O2Rmq2S zMZmTs*gA@Uz2}`BM$BleeFhu~9<2^?gCK*Z)M|7qZKoyQJv(>!V%YKYH7}v3HK6~b zt{o)N&L`6l`dH7pPtfm;SjXE~1FMei&Y?X`&7Af)L%qR9Fr9E1s^g)?gM=BZD`uoT z%gQ(NQk+B1f{6ZPCKuf zo6!m5e&U~s|F4xl>{;aOLW1Z$L|EY|0Xk#FU+x(RV#iTPOf06bFGoDTzoWZDX`mXi zix=y%!q#vHV@PP~hzsh3#ZmMKNQ!vaZYpG;|3I=j^pU|S$5JvK;UtXsV*5Q)2@dWY z@Di(!f~BK9?q7RAC_0W!j`mPMo~zgK{)V9~_Ot0>XWS{e&ajj1$1HWTA-atlAW&5% zh(48cre5w2)Z!$BNt0SI{gW&YEY8&{2d0UkJ)y~d$p)uh7Oai&LJ`+!ekAZ2J(^%< zS0fv*{`y}4ngR|m(Ar5!a%VR05}O+RA?Ya%>LF`WwdTuj_tzhP@1GgQzLDH4VLY~0 z#$G7Z7yVxSZcY~D9$kH@>vo`-+7q9K91f^F>${+PYqZtS^VjylIH>*K$up!^nO=(w z^@=51I5DRCdBtUS)<^%LN@dhNiVLiOwNkHbN9;fQEPn*1BA!QxKmYoqbpQ3I+zE0x zo_2jW3EMQD;9WGJa3KR*{VR+&szkE+K_$DgUBA(nsKq|=l=MJmK&p$J2A&YAUf0Zw z2KjoUUIEX4s3RruR8p{eZ>ARQeByE2B6}^ch8S$j5fc1?&mkHeQI|K`;FQrrORw6vmD98seT6?%o7c& z<4Uhk>|SXW1C02?f2Ch8;a2L!#vA9effat=p+3Rc|2U<9uh_MW*zsH$lVbP%QB$8ctwgSxW;5Lq`5CN zZ}6O|sL^!3SSdNgsZ}`6-e0gnf2mgkr`tH~8nw6JaN%b>qn!2NXL}G9Fg_DxGA&Y} z{=aLVk72H~57roG@QU~AADKZWU)K%yr4@}e4{d%SOL|-RX#@%mKax1?N2N{5O>2~0 z_$HSY#@C~t61?V`bkj==l(2!^Symz{v-;*f4dVER=1yg?z1LCY`w*m|0F$70-KNk6 zZZ{~^K?`+EB!OV0Y8tXr%G&atonE#Zn{+7VymaYoLCXURW=63W5jYccO=qsUh_LoH z6W?;=eFN4wgO7Bg5v8{CF(sxf`9-d@mq$rfJ{v;&n6E-T3_bA5XDQD`th=Oz`G0zC z*<^JXS84<#H!?x*ljj*~Q{NX-Il2UX?ai`vO0#@}!0om!2V;l-P-C^EzSJjQ-FOsQ zy$sx2%1F;gGc(Dc7*>&paTsRjzU4IUG`Cj4p)h0R;Q5X3WC{Fjt!2*r|^t~Zey>lsV<6>(w?JbHU`(u7`HLm6y;XN)hj(qzwNlX9wE=*SRt=;`meD z6&>~L8l(-mhf@(%m}e^d|H$tf9IxW>1CbhB*4qB0Jr@)!v-7XZ#@Fs7Z^7oL7>2Hg zuOuX*a}@V46|b|kY(O1#?6610@4xre-#BJb^bp|VVS+0n+F+9lcQs=yDO-P{*V>*R z@V^R3rq2S7nyFhponV53UQhzQ%h}x&E9vIN6Z5G+&V;E0wBFRRM9PeT%pcLg5m4OHaI9&G$35cl?rJCUqeEr}{4Db<}O&O;W(`bwtf?Jh0iJnJ8_5qc)B4+ud{rT`JR(VWQTDvD3j)AaFB|&&*%U|t(Wy;PYyjXs&QNq!{ByeMV2Hs(ZP5#BLyk- zEnk3|0%TySQcW>a@3#0&2=cl4JfdpQO1*RlU;oV=^u%gOu-sw|;WH&a>V0s?&NbfU zAe-`Y6P${F&b2Qedvi0HgEUP(;$y*2Z+Xc~ZRGMu`G`5NV8N7}CrI-+K4S*V6lS=H zIA)x3uE#uw4)!FA+a|rLoNBhR2AKR8<`VMkl?D;)6f+u2lVw7Wi<9#hE|Z_W*G7Zo zRB?P8=HTC{0rO2+LtX!7U$Fc;U+5L_B&V~E1XII0*S}E}1vhQM1qtCq361fzEz%(pAc&gVsi8@CDZs@Ju!P7;E$c#j{Vxyw!^cfz3(fp2YwEI`a3+>G<#6K&oqMEA zf1(8&D*~gdji%2-q6jS`r${nWV0k#LLqk?n_ z4*~w9SkSC|^;58v*#1hL;VU7I3jp9Wz28m*H<3=ONU+mGI81H?Vz|-dAw2d+8Zd}X zP}_1BSy$+22_dF2%@JwXyQpEZ}dI=m!)e-Sl=M&_q zuS~n7ursl1@SFYUDx&~BGyXffY$x1K!gJ0(Gz#BBP_&nvkbVD$KZv7tO{3K#DhwSs zZp-U?dS}1|H}J$!+2O&d%LZy>zyx&M$-E+b;~Tl%pWItPjp)DMWO+_4z<0{1ud5tC zx#Sju8R4V(_!RRis6fWy^Z9$Gk3hf*j==pA)Bk_QZWRp;tXrmuMM)!WsL93$UR9#2 zIO_dPG%#}Q_=*9rWuTbMZ)%lZ4)>YFqx60R4%}9?ixcc) z4%&&AfcgAU(Nqt_qvHsiP@ZEIOK=Os@H~>Y$qMc1Y^AUAEU34|48fB0RYlTmCjDq3 z&|(4;QWWz`CL*^mITBTAlP?!3yZQ>MHf*@pS9MD{ON%7+pk|7Fd-$Vn%__LsZfri@ zskQgn$Lt*}M( z7UCoS(<3&&2m}Zy-aYgIEvYbSOb!A-Re(;izIf$SlzP$o4STywMqL`~4ARqR`EDx| z7cvko_S^=6T&x$a%i#LtsE1*cN{}sG9Bal4vuGEvSn=bUDn5C^LDcY)Yza;u6{3ze zWb3;j2ytr!G9W&b(7c<;93(<5Wb3FQ=p4A5mP#2;NETu11T|qLlY?&(s%0)M%)AD0 z?oB>LrIL|%pFmy(S-KNG<=_WRKgJAH4aMZ<0WD;ctmybTE<8{K5YuKlcQpvmb&FEex0$tT2RExC<=AUu8f~(+@7?2I(IU4*{)0XOZ7( zfb#9p&KUy&(|Ifh2){K-Tu>Q|2}x|0YK^dJSi~BifL_f-uTL6=H-1ff|n8?IDtCNod2gldy9p9IA(b=@Y^DZR!B- zgs;xayjQYRapWbTD_xVf&pNDr1yGlMwgkoUY+>|AjO^JX4PlILK!8@GL;!~igAE}}8HOY@>9{|X5`y+f(6Uy^NHui z_V-p%?AkU$Q<1j!knRYGgP4q#Wc5!^@tqkUPly+9{8g!Nwez?}ApuE{)~1-#`d7i^9Aw+0^E6Rx-@U;)76m#uxvn?jTfuM1hV`NPt2 zKq$Q~Z$^t}Z!CGx-Oq@gMi2(#yZJdw=wv0e|A&*c&CZw5-)`cQ@*M>2yU;@bpT=%Q z6CcceyVXz;U~uv<^cAa0t}ESGx}wv>geKwvv=5A``umw06F0>OY-hlP4}IsR?}Xoo zlOqk^5BloGax^(dK^!EKYby~oX?SC5XE4GmI2>O??nCQwJzC&mf>;(KKKP5HqZnU6 zcU(@@uI1;knP~VAuP<%wL{Pc4cuiB5KmHNB2Jo`H@5J3Sig+Fba5Z?(Ya&h3ik030 z>+JDPIM<)`>hJE25GaC>o1zu*rgy)ZyPdLJP0UFc+(o0xpV*QZ7-mjZRjq@-tfnjd z8zg0XWnV|SUj|&7mPgNYfd<;DV$Cao0=TtR03P=;kHWPt-*gkZU>r0b@~lTQu4ngI zBO(=gwCradgC4lTy@lE8$;b{U6&AtmOr+(v7=v0k=`#0F5=rw_0S+4yAXs2OAge5+^&U@F8e$Z0uBxS` zXgqkkiVWJjr8*IRz&WKzY7!u&wVV;iD1jw;3H~zkq7O^voXo##R>Yy;e5C57Z0kgd{xRpI+*}z=kZ_;Wk>oF?Hh3=pLQK} z{mE<>q-Y52<%DRQbw}gP4RZWk^QKYXDBXkjhrKmPq~V1NchHxo3G$Bb!mAIT4%Q>Cr znA)Kvo|>E=Z#yB2ugkq%_+7=O40;G7=UB|sAU?(|1tGoMFwt|l1l#C7w2J(;zwxzJ zHf_ONY#s$|AY>Dcj+(trzwz;q{xj(K#~Z`=6e;VscdNCguNr4*aw~uo>$qrJA(@Wc zRbY`U*?|Gt6yrknO1AL;5U-8nwx{UCmC+-5OJH6$GjSR94Dj5B2t`TZu2)LL_>z(6 z-6$T2C5GzfM)8v;#xrnWvHa~P#>|~P9Z4UYtdG@Rd{L;(d<3D~nH6;s{H;1;tSq7m zJdZN_#>~=%IFSOG0TXAdv4}OC`mQo_M*!uJjU17d$XL|PGy$tgyo7Y-e6Do z4W%PS84AHyNBif4o9j!;v21*}EJyLT09TbWjXhP!c-|E|&;Mww^j;E9hj&I9J3};2 z4}G~V+nB(+>3_Q>_&dC;%0+76((wT>I|ODz@VqZSQKaMRUuH`atkEApN^X6SR^F81 zbh)Pj{#NN|uSclR>pYi(mxNTeS$!p*!ZYb*@Z*o`gQjb3EtiV*CT5b(@%al^29(W< zI~I3$Gd)|B`{8PAINBWGXSh{rB&MKaEk<+M%g?w zFLc2Jud(FEAkAa)2{2PcIYMXt`uTIrRaQ^a(M@&4z1M!XPczZg!Mmq)z(f*Lc#uB5 zvYR7xb4oXO;YBLPZ`OAV%U=x}$p#h5HSPi3O7f~++xM&4f2qK4c6+k)gmr;B&E9YU zkq|d9f0a;Z-6HuSGfMrjz*!eP8?7x{#i4uzw7Wnst8{Mq*)%q92dw6dWB~YUyh;UK z(A3GD-PK-}ckmrEc`5)MUFDMUSxlpuzI-ntI zL;tO%%kaA~#m^vOBnw5#m_3^p3*QO+QKh8OarNQv_VZCyMdkja+@unL3ePG7dAT5v zW&oO~SN@Le_$%X7?U`;pOKy#qw*4j>h}K7@!nlTE9=8Nn!B9z&Tae`bYrZA}jFPP1`k9Otu<@oHf=6 zLtw~AU|U$9XhELN@Cv^gnwn|^g$cN`@CbF*9D8>vvJUi1OKp3wbKFmuW(p$@I<)Tk zv}|E$32OVBX=~rtE}&;ZbJhZbS42AMe!jyI%K;<{CY4Zd;Is@!0~?lbTtEe?zu(i) z`(7QVovJ zK51g+Hb8b(L;4Fhin)JHSG~LeW3&O$+ghUmls{!RX^X8Vy*4A>{{%tDWfHOZwd>R? zF=4QY>1(C!bEBYgtyi|BHb)+64nsa2`RP0QPT_+Bpss6VYa)3ZRelo0~1Dd)VZSXGow~Njyo3* z<-w450Jegoq;z6_=td3-rSjqq-I;Oz-hGn{rNR{QtD6J-a$<3b^n^y(!Ne0jVqUVo zi1e?OU$EQPNasbc~mZTR0+sGCczo)D*&BR`({@%G%RUBKtgRG?|Zw;0f8ka*k(ewt8dxNtS!mS5LQ61xv zHTZT5t|0J2A`l2dRqNs$S8GXmD<_#=Mr`;T=?L#A1SnK=PrCbC$FkF>GpzOHN&*2^ z`1`ZLkzx6$n4=$+a~c)o|e>NHWLi&*?_Yfk!w1O`wu^aF^FOL#YoWtM|aPj#_O z&k8>N|ED;^!4fR1(ZqBRTqNhT^X2)De&0fH`a-O{ue^;=JQnmt%Bh=hz~J}~uj0Rk zK%xptkUL#_Q%Z!N?4 z^DtWDVfkShp+VPPB6yfRNEURZYKM60BV*1ed-KiV;tKOmYW8`lV#i0Z_2ErM4+i+# zbwN$1X)){-0q<Oocp64Hn9!sep7Dt z*fxvBf4HU*DT_{-4`|KMiwgPBpg210fH+Ko034t&+G`4?_=c>7lX^&qcB4>nz$^%; z0Dq3j5k+i&r-(UucO0IPGUfqR6IDeNH=adTlqfgKHaXTorsOf#eUWvMkbB|etN3h7 z`i`y`^ICcO!<6#^TM8((hgOjGUtjN# zG?JEFL}1|i-uPOWelR}F-O4BWXHIkX&~2j9WanbJA#{TUbnGHA5=MtiLOC0$KYJMD z6`a8fbS)czm_=sfPu*TDCGRXa=+ATRR(H6Un@WBinXMF}w{beD2ThHlj~MFYe zICmJLyegMzuzMx5?1Ao}uX9+uu~E~@1B|)<-k)=li{*6lOO|?IrGuu%RvuD?vdbKE zYneE%D?fop==MbXiQzp~nw+~9etpz@77;fH?CTZBt&}u&IdGOOcSFN|m@wexowEU) zFY94wv0ggEp?Wwt0tPlvTNweiO!N{hdbH^2yK|?{O;lzEw!*g)Ro(#=6(1&UGxDz3 z#r}}sdTb$1G}KW(lgy1d+N(<;PFq7KnsceH7Fp=fJcZBs=6J?$WwIzzGalJsqf&D_ zKpDI2De_gR$m*f{R3YD%If9PPUUVQ}^V}Bd8u>ghuz5;Xka91`IMX3z9Wg7YIe2j3%c9|6=KYEu(Luvp=jOl|@CfTis0_2om# z@*RDd90?6OQ&e&^1lu0iXq2O3QBYbP(m}ZFelYta}-5+#uWR%&Q%-V^ng zL7V#rN3Xcsb`$wR=v)RR6j>srPPShGgaV)3;vB&GIdcQ*azKCT=vFj2GWM%~QLvQ{N+=A;q z{O;JD&&VM+xINFz^mQtB8Xm!v$*H#Wpe1yeKSUv!XR?N_VQp^~+s$By&}SH_dEI0Nv;4r??Mzcoi2a{*q=_vi<<5;SzeVp-GcAW6ywV zECy=?jNGil8`38Yv7$3J2wyEUINXUrOl(@wC2J9bg#!J=vUC*A-{QCsqH<03mm1zf zVplmqQSUw{nD{Vx`BKL(5bgD*83|NTUMJUaSHu6AiL0c=94I5zy{x8yQ%-NgbAgzi z&6g{pAq>dl=atqlhWwnVBFug&^ASx)3p=l>nBKo9iiUzGuItp0u^KX^%0`e{eJIa5 znNb<%e;~}Udaff8G*O;`NUnLdapLS>!Bty!rk8E>d^1KsZzSYJS_l_IM1J+o2jCY$ z>&Fo#umEld>TkbJrc_WI$8HT~i=S$$`}msF_2O0p{KlIuS&K%B_59MXWlF*I&wCY1*Q+bdnoU)1DE~$Q|n2vl)E0g^<_MyXz z;sR3ysC;=05j-uc^VWPui($;WVc^$zI-W9*z=sQYo&}UCvlXDgzuL(2xDZ=ZD2&&s zkh&PW(c>A55k}Y-4iuo-gX&<_()_`6tFMBj0~g{VI~>JjM9T9Fh9NZO&nisTSotvy zU3e$Okk0L-OPGShJmkRu>*_c|DPa(Y4+~fswnP(#R38=scr+UZnGPA$b1v)MTfA9= z5eyha0%vI^Y#%4J_D$PV zawkM$1Cc)XL$j>UuMtC3-PzL`Zkc!VK?Ef6(OU#ZJt(J_LQD^<=Wa!C^#6aE@-GSb zHiHVy`8(R2d{PB90LvkKvAjq7ZaQ!}0_9H$pw^_c|A zx#2SGKl4 ziP7xGoY(+vtzBB51w?)8)Ii!&&RDwW(m*O_Bbj4FZ3qh9Wl{ORyUw>9<)%ZZTTo~# z_y*ia?t@$IbsWal{Idz_s5g@Z#?T3thVkDsS*ZR`Cm6>I;7?!Qmum^V1 z<#x-EUoEtD2_Nom)XACY<|KqTyXVLRSZXD(=O3JhBl2xrdH{8Dj3Pln>d^dusZ03^P@OU>1hOJGop%}|9#dEUvWCtT;NH{(RsKXJ*aibRQ_p|l`vc3QSL#Gn15sA=qlqR@@KxwKErIAj@b5lD&sRi*XD7wCPios24WYh`#SHU65&LV! z%r-v0#YaCe?{+7X9x>Jc`L+d`W~U`Ndq`C~8v?{jwL=s0xBBm_FN$r^WCqG9PSa*o zgC)nQ(AxhsgC z*+kLOafsc3@KPi^aGIU)<<{%Q*k>pKp_Uy*W#ruhn8D8==4F^OGCH_9B(KO0|AeyI zwNSkE3KXt#uz=bB)n|S+N9x>!g-Y_(+Q^Mk+O8mye9PftkjbDJYsjo_$b5^iK2UGy zVet|HZ_-2f$dhRU{$!zu)faDJAZguNGD&_b%AnGfjlv3M@`hHUC&XT{j%3Xtgm!-E zf#y!rOm?V$hPg)Z1d|h1q-6j5t&9Zk;=S0L^CDg%=~vRg0z~503->fOGdQEjYc$gh z^zIskL4B9Vcyhs5Ww|%{ySemQuM>Aeq^Q=@NG1P_lZ z$o8SF@x2^@MYW#I^rm^12CY%@CMhu%#@Rl|sB^dFd(^l13w$4dFnFyn>@YXWOOQ@( zH?3V4YtfljYHJ%1h!qq1GFM4&MsL(?!rfqKnfkzywJ8 z&^$P{UeLe6|5h8zIq`~(WM9JUa{MTik{9w#6klZIb_7KoqI1-jsl;x2{LkUf<5 zTmm)eYq%xw2Ja)j4y^!7s|9jC=abK;z*fGPICLgbW7T!F9ETyul;J5B?x~x!5kR`w z+3ZnR3t9Q=Sv5MBe?b%E!_RugB_#Odz;oNW?ct}X-2GVQ_6^jAgmR3#peqeab{^HC z9hys|{&dybDK2$-oJZn@*829TsFup+*iT%p{akD5Q-9KH@5E76Y_T2wkuE#*7C^UL z&hrO1DEWEuQ&-w18ghr>05@&tm}C~hQkw?|8SwGSj8^tO_pNlGni0E`-QT}&ZA@+> zmj}G3cMOgN>Aae#O8DN&^LqYx5N9+1vP<=IdRYEfEGn>%JCfLvp z;Af*h?`V@Lo{hq7_;A==57Ad~PE95Ik4!fiN)~cG|Bh+NO1{wVGR|LWDCE2JDIjbx9 z$2Z@$TT~8y(?-#jzjlA@O+e^@32219A*kyWc1XBrwH{hsCT&sz1J6g)X6$K^8>%D9 zV3g7Dl!7{u^&=E#eLqO1FbrIqU8Yl7mLm;cK*nUz(3U#tJKww<1Z);bT!$4D0lq+` zDCoeJ%mgtk0@QYGKMZ^1AK^R@9j_qlnjseyz|zst0&>H?{rj9AjkYjrJ@ z)+3uYx+Ns6_GGiQl#u$&o=Ly>6RHElcr^zZ6}YVF10gSY1Pz5fv|leo<;j_Sng(Z= zzPe?Lu5TIHVH&F3WflKuOmRZcJuD-UeN5LsCnO-U>sZ-hULstJV5|dJ=k{;qg2`8p zf}LGws1OYy>+DHecmSwzpgzMPgKPi*tu}(FYeeG|Tryn@#;Wl2(>{hrE1M?e@0-UlS8sTOHd ze&|o%4v3~;00A%(fW85f18Vi2(Xitwpdb)N08bjyRhR3TP8kd|t*9t$`yd}E$W)ZI zPkQPyqQQV=jJJR6Q3saF5_>amdV4{bQ8=dxi? zuu4x}@g4-*eV-e17(t{+isoF8uM8Fkj4;|YzbvQ-V}B3|NI|5&Ib{|R`3({D96dFf z69HK-nu<;kP259s`^ns){O4@DjoLu3T)M<-R4XtBA`b-84&=4bhR<8VU#A!vPl+RT zlsGzQtTA^_1#$+@{@iK;1wyuv^eMw$%-|FmtgJJR@VDtq!dKu*8bSMqJ7l!3c^q)3 zT0St)N{tI>n-M{S>oCs$|Aqy7XAViFgksL*;2|DOUeQtug9yD>f9!XxXb-Zl_ypt{ z8r+oPR*b-q4{CQE@5pV;wP>k_Q>-|)<&JEh!tHJnG=C59yY&^ua1p98LzRU+3|nC7 zj3EXh0^r_<8R~;=ry!>2j0NsCho)Y080S~O{@F6~SZeM8u#J!L2QatfV?V&nz-4o- z{vX4EVxpu5wL-mx5%!w%F0y*d47GNi-lGdJxLXQvUO?ByV!RJGESkEWlS6`(tOHqY zu*X^q_DyaUoJ5L_@s|n9v&a_0fjPEQOEEs(xbu@-R?*LlH3+;XtM3?$_y9)<;P@?^hTWI zuxF4@U0+8QL{m*%d>IVy)SA4+iX%Icr|4|;WbH&oLF_HF;QW%%;QRo9G_IS?^%uo9 zdaB}0jeCK|Kyqq-v&$byov{e7F_J74y-Z=2&-sCYNOb!;tgVTuxIDcl6EM2#=V&AT z6rqbfAt+z&YeDHuDGX@a#QHd6$nY0NWnd!f#QBc_Myju;xO{ayou*{SOkYcq^6EVU z+fHH*)hV?Lt6y@L94eYpm6_U-)*sD;!o-nrve*D_SQHye-<_2SE>h*)<-M^1{=Yc= zO^2MAg_&yNi{VVinP2t7@f`QpR$?ur%ldbtBjV%?W6d1l^xl-iamqCnWFRW)_4BSr zJZ+qz7K=*^cnPCD=NN~EDp+LYLBd4=_|2qFqKuE)M>_#+mz6ClFuO}I0KxM#?J8_C zL6W8P_PRq) zmQ*P@{yZke%$ofE-zXX);17J^$LqizA3PAD@%Pn3#ur2@*m?oZ^S$T2FvZ9&LQjf8 zH~aVYKi%wueSQ$|43xdLDy5^>Q0Z3S?>!$hKv$#XDQO%~ffWZe{_^FV0LVRq`Kks8 z2O7ZPe8RvlqNX8}HcXBNT#W^pDh^WsCZgo}3G4?YGoWP+1nxys?;rX3LYrLoFo|!q4yN@ zsb|Un_!(*u(+oo6=xU0Go@-pN&cXu3a6}@HdeZsh3$HQRkkUL`hHAVuwTB>Nry)8W z&A(6oC+te5E@~RI*j;6F|Knr=`ph-~(nS*g|k0(*LsQi$@JJ$)>5I(wjCX_6POd^9T*rH&CyP0e(s;)uhunmVAyO zZQK+#hUD4nmFu*tjjM1;stGG7wEDTXwl`Bq#<@7NqTet1J`PkSi@eXi_u!I(OMQ-| zYG0g_<7A%1#}SB;zrZ)iv#0ND=8v$LneC#R&CRP8w7!DACh^?zZ8>F3J;x|iEvCCW zi}l<}^QwjDK%&Bpu$PnSc8p+*S*m7X;gBLX)j12mEHZF#Kv9s9DK686ej$Tffej0l zr)wS=Hc^wUFg>e|VnB%&A*_=Cyv=Tv`M-uLS5_Upwn@k||9B4JxE03aU^z(sf4R<4 z+NQbdZ>qW;%axalZ1WL(*e3d-^Pwhtie%&ZnU)O1q%b(|EZ2&KaC@g+KBth1$>1~q z)RN8B=(hY8qruUL%8Fkl-%$DL4^v;u;G?T{E>4;cKS#+^fx{te$i~<;r6`UIqn{%P z?j@bpocB`Srq<@|?Tgub2emtVH+^F1eXRSwZOjG)GrVj`qO~9fp#27vOY5CrAaTPa z_+WmV1GR4#DWH@7q=Rp?uVr(uo2I?^fdN>CioFWMo+3Zs%`oCdiXDjS z0;ebkWy`5^Y!;6QtHcV-VN^7)vSoaK3dTo3^RTJ~euq7m2Ncz4Y801gs#lwy!BQ}x zj2tY6Y2CWz2(e$|UoP<*Vyjs#tRgGZ#>CT@={Bq6tAbtrwc#ZrK>aI$!)cDFb<7Jz zrfL;oZcG+)mw~#yFL;LiXq~V58i!UkO>igq7&n{!ElDMCK{`FdKOC}SW1Ls0B6{Ra z(Z!v-cF_sd79dnnvbWxbKH2mC*@kba>!wf$*<1)=9gq`8aF?4Q;5ub;5-ieKkXiI-8S5QY2SO z7jl!%*1)>q|DyI5f6N{Lsahjygh{{Kk&{l+h~DfSI&|Vyyn6sfH48#Um1hMaBzb$_ z&Fp3_FvcWaJMjp9(U_1Wkcix#SnY| zaDKy>oO$6q-?$7S{^ts^>wVGpI`l!D6vy>AsF{)Q6{W_|$s~A39yhKIwl*!?9t?rW zPTjtv0PX(X^dvakMq`*cFEHI4BFji>!5jiTN;G!Xy_@bV@ru4AUp$~P({sR%c4|iO zqaa+rAo;O7ZT}b#orsSPu#*%$TAr3byt}a6}yrn}#HL z51nK5mM&O;YACBKQf#mC6a(F)Op!dBUX(jEB~x6JHMW%Ho{oie!W*3pf~J*#h_dW! zqPQ!-x*A!vTXxT?q>f+jcI8ZU_|Z0=Z#E5Jno4nhGJnn8)ma^mu^ju z^bR+W;U47BbyRQVdwq@XVX%*hR!4tzg4cXgSo4~HLKAaP)d<+7(+J|_6d)m4Z@mke zZYRCUsixkmL!3vsU_0X0XBDdjbBgn=PlQ@~4PKWsFAuUW2b0M|P2Mf4tf^a*htS>e zVg?xNVMm-!c%{9-Yz}rz5ll1Yrf)Brc*RWaZx=0yM^vD4NY8UbH|?_By@VY8${*A9 z^YWY`gw*}C6PVHo&@CmT zXF57lV2XON~COUg(tG_+@rBDAjA@;bKia~y@qXh+h5Ap(HecJE%BduzJ~|m zFQ4Zsm}ff(?5;jeW23YYtct`x{7eSY!t!=GsGhnGF4K$QH;n(Ya!$|2X^O8rSpQT4 zL#`KesfzekEUo_FqriLtl2&sTnu6sLJE6*rb(pp;#%iWS$UTa@)768uO-%aFS}g+F zD6z%-es(cEjYmp~WFpWB!(b$tqrCN`iYnD8a2;0jJ1_vi+!O1SsBl|7n_7ZBpZW>l zI*T*Kyf3fsDrl5LU9K&*d^%D_<{^#$&w6k0J8Z`w<~Q9R>2prTiw?2$YPTt!Y(|o8 zKw02*QhS7vFLfw_rL8k&`JeIGQoERsu4tQ=t$!jCR@i}QgI18az=wo8z;=$+3-VW@ z&&N$v%X(Q>A{?yDe{uvlGzaKk?SQA92y#{ZHK)=`ird<7ql`&qvZ*N%8!o9NU*(8X z`aRi8z4XXyi#s218K!;l1`?*IV7PJaP9=CAXid&-*;ld37v-AjKs-0yKB&nH1)L=Y zkVEdbB#@}mnHRSr$;VMN#_rGE?m}b&h#v1LCfb1s(R-}pwTROW2&G)Z7}+`Xu_Pw7 z&s;9d3>&G2fSH-Q0Mnu7^=9|Gku=!Bz@Q4534UgUTML0!qY-dVw~?IcplfHLFD*UQ zxEq%JuaqVh9OD+8##mzmMG}T1S&l#8x`mtQZ5&K@d7GZvWZ^A#r2wO|fgAQDLqNbMI zIVg|gh-gIClZ=6V6hI%g5L=(1Nr&*-NHJgyK_vkZH;9}JZ0=)?9w}>d$wL6$*c?6bwKi3o+H*{L#!0m3hcdfd%wj=d$q-v5eF7);0Z?mTo8!DfxhhQ`?{@*xnc!RuGKNqOH|df2|l%bho$rU*d6 zI3iqTXk^y4)~&FW`v&p<;&)v@tyQrSiD2!2iO+3iOU;$0@oN5V@08G>weqc)t}o4| zn0tJc)F*@$o%2|0PY)rWYDdsXZ|Q})k8rfg$1ff~g7O$>ES%TxWkc%H_?;4-{x{%XHw2r~2O4g{D z_W5gPm1Q!!=a>%8Wweb_AG2Cj(;4IXqK-ro5saSGkR>`(5$+_1{1I-SnH4oR#bvb< zg30&qQG`?LP2Q2UFXku5iXZ?w{g>||3Y9G&?w~0mhDeGlZ6JRNIRXxaT_6P^V=OYR z@OB3fZAJ%x)2gy_(c*Ke@9=VHmBu5WSF1#0Reuq%#}FkfOG(dgM@hg7bdcIi1EGEA z-(cVV$n6E`hGUt3IwKwIv6*_aL%*v_Fv{R4rk*nn3YS3=tIiSXXwfMl1Ks?XBbA9; zy)?KM(yNV7ALq{g3p6H(>>+)Xd#n+hFX2YiW`Dj6y7iH#_Y7V5q%qaIdDR-u9;S3P zW~Wi0?K+*7=rc!LrGjnzZvqbH5U3dQvz$0E3su!;mo=pMB(r^MB%}CC-7s=V-t6^< z$HN)QrUp=T@|Viy)v<05j9n}jSQ@MyM1`<3=N6CCu!7I*f=SdWR1mz$IYb!vX?`OE zu`0iNU`NYUe;Rm~CuNG#M_a7-TK}JW&zIkcn*dsVWhWDiAwM(S$Imi(YWD;tp9Eqs z?P+ESy7o<)TiJK#&{^VSCK3a|C$>9vUN71)6$4a1nZI+JO2nV1h*5V-wKR7f|Jrp8 zyJDU?Y?=f6I8aSn;>9;{E2`==>-kBEO6Y=`vA)k6bGXP?P*b*Y1Iy`#U15d^!$jkZ zj?f=c$@}YhdYkQW?TKBdd7o!-T#zm9J>!6VCc!A37`$As{pWGX7o8>)PE%p;)qac; zo@}TK)Mx`EsM|Op_#dxKG1=A@86UWWvZBgyNXQWIM-mL!Kaacs__u|$Dp~^WHHkGO z|2eVsjT6#aooM%SPCi&UPs$V^@k!X{%n{b$Jm5`&Y1u@?r5B9P`G>LJMcG@ZH0Hie zpds{h|962p5cqI>oyrxSROjA)g;+$&U5s{4`z&H*21$0%CJ}caj;QRFrpyI5{~@=? zZ^3(sc`-Q{@0?ZkGyb-iu6DsyR%5lL5OXB^&*TH`YnDi@9XDnj`2OD84rpa?6l3YF zT&*6<*cxLSvye0Fkb{QaQaou+R8_UTS7fly>fQRGJTdQtw=vHg5^HEKo@P0&Q$b#O z20d)7ZiFsri2i8H-|wB>XdN9Yx*T0*9k5okV|5jN&o9^8Mg!*AdO$S)xHu@Tw{<01 zX8;3vf&YWRbY`AC=2;7y+;Mm6P^zrS3+UZg*DNyMy(N`v=fi+&&Zha&KHn@ut%g3K zBvTVU#lXaF#*J-hznIKu36^oQq)FF_M#EJg3($q%M&R>muw)0o4wcx=6?=Gf43jPU zx6!d|rqhGXe;Q%BOe-7RC`-}fzB*?y%S=%6=K3r)UR`d61Jgb82}D7^HG(KR)D6H= z-_d?GAfQ!A5(^})1M(obZpc(df{mk!BpyAi~ByK=!@e89Mrj zMwEo+-F1(sXQi=YpaAu@?7QRw?IMbNFN!Q%p^b}FRV31Aia-E7JzxL;1Y!gDe+U;Y zJ0VN^4)L}-TPQc}-3QtarG&t_%8!`7FA3}&W70CKpE`_pE`OUUd6}a4W_p8i4c=0JyJykU3e(45ksImf^ zO7PB16u+VIsB0$a$C<<`%8*p+7=moQ#L1s&A|m8=P*3)WYrBr6oN*d=xe{^r|9ibU z)`FWJ>3r_Ly!yf=`?Y1>Gr&mtGP76i z>LYFkp;fg2=$si5a86_VAwb!@KtMFwm^>*psyeaiSS{)2IS(gn`zJ!d`Rh4;;HQ=8 z_opE)fit=JW;q?nYh!SSpC+o*B-i^2Nd>HN|C@3{UFwm_r>^;|>r?w+CbvQlh#eJI zI=_QNv+nGgz*$wStKDQRcc4KXC>!I3H+g;TeJ5x;xzD=aB$U{~Y&LH&1iF2?qObK^ ztJ)Xru!w}s1$M~-&_eUVzY|~O;NOD6Ug%E@sQ+Z+ku5E1+$prrpIL1mYVmE0%aT#X zG@>tw*$Q*333;da(j69~f$V`Fw(&7WkA*aphQl_Go6)M)yshYU59=FraGQM(}x{pq)1|%}Z zverzcqpRs75+a8}3tat;kL4CY)kRbbpJ?_hARQCF{>j=K>hzFT$xq)!t5gr-8ix|; zV^>^KBb(%E2bsabk8wRbHWVF`MK%57sAmA991}hzmShscX`c^YAV2Ub@!5OOL{yg}kOg&($jq|=R2D&IqiA=Mr4Xq`sHUI%wh9Uy}JYnnS zN2b1$$Pd3Hx1cO562D!-pY@(Tw$pQu9*Ie#AT|AaTa9;ARjE5VqUoN5akT}Q^4^`k zX}mRnjLXuv{l2LD9OKVdZ{u3lpoWXNUYtq1Oh|lh?>*u(8=)Ll*b5vAtn8}&oFmLS z)&&bHhV9m>2Hau^Ook%2Y<;=nfjL(gLw1};VMl@a{uRC&#j@@-?zW zpo=t*@foY}Tk_C8Sxf7eco}XOZN42w_QF@Iyvkvw4XoO5cVSmILLz$e$B>V8c$CV! zsOab?NvRTno?rcL6xlIeqw{$Zh{2;Jx{V~(V7^?Xx5;Hd8iD(YA{7>Nh`Spl zbmEj%@Rx4z2%D$7@`YJJalD}tLDSg%9$gOt^M3AMQ<%;jg{-ov<{%n&73t9zV1lFp za<0Ca$%=BB%p!2+#H!CSDH+G6g8(xrNe3LBgu!9Hnp`u3dV+2h1(v@o2n%XxXO82v zKtbYSFU%+BHYf~uU3$(X=^5SaVop~>gGx>Cs9BJhUmnrpZ7HVqUq2v%NFfn4NwbT4 zAD2y0keCQcjop-`2D02g+aoK%%x!+X-sqrN!v|t5gqURc`jFp_YIQzv6u0PL&P)Hz z8!vD43_ME3RL#eLYK07~7pRYTDK*9F2|m&hx=Zr3p84>R`F8@2ge$n)EfoaQZfWGI zllzAr%ad95WKP~Ia1a1&Tjw9#DXADB000Pfk_*}PZ!Kgpe6&OWbE$1(xj<4HuDf!0 zGMcV=Whxux6oHtSg(sUl08TT5q{gVY?0O)B!B3-*Ke{S!Ux$}Te7j0kz;Vqd#SdY{ zj#~NARA#y!L`hxuJJi2bvU(ica3S3rY%V&9`jN&aOVCXBGelQpkEsj{Bl(un;W3g%2gGUvJ zKHst=F+*#9$wqw&1NgpPoN5&!ssIx40b5>usZ0~FHefZj99FQ7IS|Cq_hCu;l;HQr z6tj~KE&fSWrzrX+h01+wWa3zxKXf-lEg%h_(z%dMBnAh<)Jp8-x;F}wDKKw0( zQ5i7TGX{e3$!9T)Zj-s|t#5mRwCjGX5VarpxL4Oi;_r!qd@g_6^D?{nc$jPHNE-x8 z`zKDIF!x9*zmvxwWCoZbjo|#=LbY)aD_WdS2lKyaRjLHQC4HeOM5-^|A3Ip2Ny6@` zq)RZ)LSioWympP*(7-aNB2^L~9ZKQR^Sy9<&1s7eYd?d_kXnW_0JX;Bkx_Bw@n4 zr>RcWOG1_8x%){s5--6AxY7K3&2;oY9nf_3Gy-o__8Hh3#9Ps<1Ov7I$(~|Rd^ZPs zN2=c)@D#ax{)tKeXl!t;!b|ICLEd&kK=M^)-eoJNV8~I>$-m$cbwAak2b~`r1X9+n zqa4E`9?uKNW+FrV2Y3Ki_O`9Mea@O}RHV7aGR)-|-SJi>{UAp_oeY|P*&{(BW*3@z93OOV5RaA0O= zrvcbB7SV3hGqgj~9P>Gc>jd_ALFjxC8DSeiP(|zLUG)K+ToxK>pxV>z%I-ZblXSLP zm+ZG&#e5uuf}}Vqx)do>r2Pos4U0&(`k(zIce0LWFxcy}%x!FVThqHaG6e|<$kxkaCn*rOTVkZ5ZUq(@eokx#dXa5!B6=R z1{+!`Ac!-z-MwB=&QBEmN+$$s7Qc7*)=sCkhKBLBTUn7U#YTo+rpFqd96nHkHPY-w zo@SO9Jtiv)SWYCK_MJboFmSzVVxiG5dGAD)AYj02|GyB_U9hijtGLk8uaV|zfrHdv1n4eeDX-Twdl>*AUCnRdPp)A(f71zhjwX zH~sv=P32~r3QZ=udPcLm0v&Yd3O#VFGmUnoCcMqLXnMECp8L_eCNN8=>u;F@$HeEgu-Uo_nlz;7)oCYlI6p zCj3@JwBYVise@Vzb0lSm7Nz(g#F7w3NAi5gDs9?ZU(LF6ZqGX43ch*dmG`OQRYBxZ zMT>1>XP$U%B;9q~A`)6LgFJ!RCaJlugii|{$> zqz9@USsAt!e3}im7iU%$zJX4~ol?I*N>0|oS*_E7c(lz*4U^oqZRH>AE}K(I|3!`u zSL5yEM98IDu#$apldp6|@dO`lZ&6tqfEZS$JbLUR$gJUUhyAjfs8v3+#Jxy`fQ_@y z#fM)&lZn3B|FvGAMyQdt8WupYUs?dmS@98!`g?~9DdN2K$x7}e_HyNC_o8x+0O1T8 zd|{AR56Ps0^S!Y*EcE91alU~M?0AS+IbAQXZc-p~p9*hWpgq1>(gLIbpT)AQoeTse z>g!JL2sX!Y^D-@5r*tZG1*uBDq0_qdf%C^?c+JNN z7qPd&ETQ2!)3ygmSmNp(lTnxW+Ep8Fef`WG_X!nKU+gCVd=Bi$q_{77zq#aJ7hD`> zmQNX?M*#u!IQ{&_RWL7I)&BOR4>J*Pf{l!8oM-16J3#ryQEDbj%(=p%JEL*95codY zN55)g-dj6Dm+*8EzXwS%jdEoR7y?QH!RNa=Y{D79baV%_#Dh~bk0)4=UGV`pi>mN{ z`s)EI^4uEy*~JrtI=2ngYIv{`OOYo46WQ0>BJlPJG@EwhSncsB$*i?y;NP;m>Ffi# z{2hud(PE1au5&q&)<1upMLa1$N+}D2EXPzgErpln7EHK(bmj)zEr1aS+2)O<$Lf67 zb!K`zHkg#X%Bg#$cP0_|@zn&F@EX}T1ZTl^YOAjukAq_4aqNC<8_@Lu^-DKXLIFEU21O;5d~ zslhi$1($l4JLdVmwz92^$4d3S9+CTA=YCv^lCUr`Dc5WT{~LtTWe@k&oTs;bP)^1? z2h=+0^R2}+mbun)^(E-u20PDOb7IAE@`?saiXfDC;{=C!0a#U z5*0gq;0?uh_D(llkhZ2o|?)A6i)hWjP{Yhq5|^Fx-IiW4|QEra3;Xg zjcwbuy>YU!wec4x8yjD2+qP}nwry*J4gbCO>3_NXFf}hTQ#IAqbLvcYpT}1HaRZXK zQM}AC!rxc^p8gVY3P^(XmOFfFkRBYXStkC_fv}$H8?fe3LfiBDyw{{e%SkcIE;30- zBCap*KDOrl#Mw7T{{AB8TU3-Eb(r4kVHTkg;x#ug<7vunLeMq@%vT%!Ph5%wzE}?x zbNnF8Y&0e`TB>rV2 zeP>VUKv(2(PR;nL@Seg-sWXI6<)X{-5r3Wnu3)jLU>iW4qXngT`s464$i(dCv0PAJ zHi*+5?dQ=yoxYjYonSrC(L~j!ML20iGQFi%Cr(u!ZEjaaFLB1$LJ6XM05 zPLkt+_|@0O)84<#+*x%-$aLBllDKRVC;Sfu{@1)&GYkmFernHd95cY9c)>Jo{SHw! zfiW*XAwQtZ?hS+6;^vFjckR1fjSOz43>R7qC|=N76aJda3E82z?Ch*y+hAS^siFzN ztKa!7RsnaQw49@QkCJ_VwmQ%j;(E5v?PHq8LYrij68@vsfj3K1WZ;zlO+Te?T2Flh zy2hmXaOBbm3MUb$+bM_#6LDRnJ_N&#<~Ji&i%5LZS{{peM(vyFnVD_fqPbq{yf76i zmUMII4?8}*l{qS@9u>g*CMYOyf9C>MlQSBon-%#gD%L;xcK+QtZLzEfRFzf+;*c@f zZq1aa<$qoi&>NmQ)Wo;S_#(F0xKKRb0_CEP&ooD>rgohpik*0HaK;1@h{1V{UwNHe zpmmCKXpHYyRSz;!M7rXZ#l5AQj)?62`B-yDmf<8mxRzb(kC2Dse0Y6!))0SjPDO1A z&D=3OINC+BpE2YB29?Lp@_;fzb0R)m+NV3Iw%|@C4b+$*eqU_J*CG|By9dpx8GD@k z2@;KFTj-Kgx)o6ME$9Q3Yz_8}BQt1Pu=4VpMv1iU93fOi)#Xvwt*DA`EE_wPgN3kE z7N7geniprM4IKks7HsTz^_2Rn9n}tKM+-)k4m6BK@z9Mn8PRbcpcP^GS0D=S-uvq| zNi$>Gw;}BzE&JAHR{^Ix_-d|e+?w&{vZd}>XrhkHno133AhkiD~@bNsAGIsFbR+ z7-#YgFgo3bh1i=f8vLCUJG)cAk268BKw^Y%Mo7BntXb$zBczxZWP?Z`F&$$JW4Vm* zqYuNub|K@8mF@r7q4agkx{@D!o#O+Bu-S^{8gI~nw!o;cyHrh$WqIH? zw^Vn%Gv+|WE5)Bj=*A8zwgU>GcvqN#z-x(zBCGKxrD;1&1%$SMNG@@Uf0S1}39nTq zbNvMSGUrlkjt4KUqX)_H4kf@F}vDD~{^A+Ao~+_>nW2IfhGX-1G(LYL6_;|JrgoQMAJcloTdFQ7@mZnEqvwoHFIU+Wx|MkWu%?o z=al#Alr$GU+nR>-g2oB=IX`T#IZOK$MW2iY=6N(^X(#HvVw+0fEgVfNcwItb{mY6ZAz!di7j039u3U9kY*h9=2?IQ+lKhra^4Lu^q_y3huWBm|o+f`% z*%ze=EI)QAwr&;($-$H}GzMXC#C%l5F>D3BPR19&L>Ih9!H0vH$aytMS<0ce-?k5Z zh3PZ+(XD^`rW1KMg4Bak+J&l7;$Q`!5xms!ar;s4zJ)J{7pc?9e%T}JNLQWu=l&RI zsQ*u8cEbt3&-|qJKG8r5fN_}Lm&IB91Uf@|d8^7}q zY7|l&4(UY15h$7ta)KZ)eSUxwqaA(OF(D|LF&M3!n+?HP z&`)e!>T~-ia&k*OFbAk{Z~WoovH|n)*b<|EFm#C2Xm|>(ARk;n(j%s-x0@p~D4fWx zr>N4h2PWPLZQI;Glss_&Hd9^}GjgL%02#jxuWma({}^SOSHL)sSs>NQ2srM@fL;5! zcbl6V=J}@aUZ#NmW2K182oD?R*Ap<$55LY(Ut)R5&1ekLbydycx-5`i&In@;V?nz;mFZ$d_s| zj_Ini4BK3@(@J!`-tKE2B(~(^7@fGb(E>HKpag-NB-g+cwhaLx0&W$gP+tZKB0Huv zNo{B`mW7Q?zlER$R-7~K4D{sbz>N%PKUk~QWM$;w@;x=r;-F^NQsZ~6ijjY~d3l1M z&*^TNrbEj~b@22HO!8Z`MLj9inO91VCeBApF(wMO7e^18gB(0~HwA0@!$|iyAfP%g zo=d)+V?}XNQ7xa0>yqF6(-IKI8&+DGnvf+fe5DUGy@|BH-#2$OSU9JeT-m7K9z%hou&d560M^tj(3wYcLvcjc70 zzcB)BxQ+Fo_w?{uno|#EXx>ei3+k$?ZDICW-khAUUjM=1vM!05;m}iGshnTTZx}Bw zi^}VA;I+%;(PvbQ+FM;Puc!8tyauZRqI9vwg;i)BQiaVeZ5x2x9_ovU^#^a!fyOqL zmJseYSOLJmeRK|m7)qG*cY2iU_o$u)vA7n}EyV(+Y-M8FmQO&ieP++?l1Di~jCE@_ zQxQfr@n3C8>nFu2>IhI%30F#Gds5xrVtI~+OWuatr#tEm_7HotW-$PSA`)Cu z=RJVLH_#Y>J~%m~kN9*%ixIfQgi^z1ky!e^ss`41`9e)|@*Z)Y=Y8fPA{ArqwaCv3 z?u`qvpd0YqQMuP^iU(-bjIQHdjN%A%_L{eP3AwT&Go!rDdCC6ek1~-$WX(6f!%y=ds)EO1>l1== zwElIfAYd}li#q6|99PVnj@uknug_%(lAQJTCjmWqLst1=yx2Ge`cszQ|A&7~8udWB zXZW^o_xhKl6+b>sT7f?-Vaz}l{NdZL!{pV~HF0tgDX%LSzUB}PF|5TjPZ~$PU2U-@ zog`1lsv$=rargoCjp~YeQmI#$QqdK&zBQ|1{6J)~;Qi>~oMyATwqb%G2o5S|eBmW; z*Iyf0%L%p7L7go)LQXu*#R^5&x#UTBMe^ESun5Z)^8aXo@{fs%k0^a=uiP+!?pfNE z8+00qsw&e(`TItjk|*94*KyllsNJv+Wld*bU4Z%Hz1EjamB0scLo^q>!E^m0*oF!dn1@LcF)>#W zaBKF*iRw%~b22}_24MP_%ydj#9Db?=vwH5{1(dijqR+G;D3ze|nkEtRW6QM~^UGrTFyt6`(BGmDfAT6U$P5J2p zIB7!Zn-DVW0j+GJVX_g|NEipicXwrnUPzx;)=I3f)SvvO5d3FThZGLOF}6dQXF%%) zQ>$Z8r-Onj&~NY+tPHvLO>vCVIsX9R+XXh)ER@*j5SYAV7nv6Bd_kVn;0N=nEOlmh zG0f}Y-bp(u5u0{IVmViaaeIz7Yjs<5%IQAW#!$VCGaqsDT^|H#sVN_x#eX@E2@qV2 zxaFtcrs)*6$mlC+lK*-YvbJ9twGX`0yw`PG*Nk6{!B5lVxX& zn#j|1@*P6)n)%DX%Dm%JcsohL?q6-CT0r6V4>M3$nRJYQ~y4+ zVDpGHk0CXcaOMfRwv(kZ!=H!&60;&Sq#J7#U<$Eir}!zKxiK?=aD={grKGe=vNwD- z%1u@zG6CTogj0Om>>0Cqo=n`gWw6(TD!}7RIs-#lb>3M-dQ4|R!rJc|)4sQU7R#fl zAbkABv4Vli=DfY~dVPTec!sjyELD-#LXL*}BfH?}Q0zEdLH*0OB)qE)p+F=y!=ehe zFp3zj?xu-&#t+V4a>Pl@@{d_3aToc=`NDa1=P_)c3n=xD#ESk>y1GfuOXA77aUFiu zpgF;(3quoI*e_T zmn??p1`MrB3hxf~x?zuW6UCS$UK0rgxBTGKD6T;P`z==K#%Bh*cpv7SO6eQ{6gAGW z80~rZLr1)!C7q29zl^cx+RBhqkXM^VkjOMUM{%Zb%;^b8!1UqMuT?b5)nL z#Y%L4CG^5qa=-h6!tV*IP)t8wzZH$qrTi)+V z85w>3Hj66IZPf!;q_h%NS5?>-!Y!rIs8ykP6AD;yr!fTmjxILsl#Ok!_YCzGxLX(c zUgGShS*lM()Xi$UL2)6Nwio;Sa(6#XZ$$!!23lOvfb+E{@{mlC%TppTy>&UgB9>S0FJo)VOF_aGzau}C2XY3g z=vq|twJ4jEs33xvN%kowZbVTlX0QfgtmNfsG`ZO-(1PMfzahjsxU=}rT9j}HNZ>@wr?YolSir;vBksVVa z1_pGj$Vh5OFvkm5aF(_aUO5!PffPcEoB$(<1MA@ySWnLaD$8W%(C4&56}lr`5%GVk z$xXUu^q7VBD22=6po0VEsh0{a7p2qzhnKP-SW7^mVuSYV@iq-_>MO%J-$#ppnF1px zX7zr8qD>>I5HTiWW*AJKad8NdUH@I*7qTKLO00!o3K_bBBf;<&eWT>+R9k}vT5Y1` zznT|DLa?g~g`Z1yLo!k*ja9llT}#E0XX+8Wi}7mUF9efAQvpn*@Tx^T8RXYEBWO(r zY!Y$4aij&1nG3CL1qI#LGIz66nw~47XsAVxewJ_p^c+hf`hUc@84N3Gl)yN|j~5rG z!wxGo!6?s>A=B=)hE{8^&13x7OQ6#ZAmQ$IzN8HC#$jfPL~knvVTgO;bFIp%P}Put zK>6Ki7}l^Ig-7xQk@_q&^?Pne>?pKQNg*K)nBAGg_IFJ@i|}+*WV9BstM}u$T}bd- zML&T=9V2(o(PScsWhf};z(FDllvRUZ5amEq@5<{D<^m;{1n((r&$x?A^Kq=5e}9`C zHX)zU1H6T1>ocCPVfqAhb^zBA@b@k2D$%FMA6>}*{DB>!u7@_=8mxN`r^%UbC>UMZ z-+!QvCQQI4L3_c;pVoylQ>^bE|D)s{>{^kcu8lSQjZrPrKT;9V4R7hNUWAq9&S5ly zy>nwa#qjU=jLa@{V8}t89ur2;@X5p_=U;QqHP7=S7;N-|c~%)&0_qbOTZVDZB`CiH zx_R@vz(v`#JV3GUuLJJT7d!490x_$X!^bWA+TU9POCUXT5o6Yl3le2Ac1so zQ11-AlohiY#Q}%Qd7S>ah+Ek3cC8e>5yl0SPV);WU^8GhNpaQ1EIPXZUtOl`wWjGb z;LhnrfBuEn=S{Ieg7Jye2dkKSVaW}?#g=8R1g~Og+38t4Q&SB%;!B=gMDR4mFlpk=S_Q=B zsYr-n}*yD|W!DqnSG(^6L@VHx}{L2A~2fI%+*S<(zWq&K+ldesr>>qV5Wt4Dj$&pcP$ zwH=AI0nPjL=Zoa+`<~+=eoVlPJwaL^Y<{qTs6Nb2+%|oR;c^-iat16O9;zyq>3F zmv{iZlWk;}l@0fRfkzsVzU$a$;XMoW0An;f9DtdU%J}OLyx~_^mmA|>_c3V@3w%hv zh;Z7mbm$$K*mbtu-Mb+qaFtTj5ITRa|qJ5FK2 zfktW{BP{Lq6;1Ho@G&0QVS_8Q>@37!(3~P&?ZtMCN*`X;M1cDbnL}+?C`XM|h~gke z(;$e) zW6Hn|-#aMPq2ig+OoqdkBE`mcI$$kMvW_#e#Tj2iBo0dT4Ci2D6*v1Z)=EtI3rDrP z_r4X_R_ohu;`^%xRSQ+4z3IGniGy+Jv29)o7k;OVT252DYw3KAU|K5*@BF?=Gw{1? z_V>Jj`B?cq5UyJwY?{gvNQqdBAjGxO0FHoht^#C{u=PO-h%2jc*G@P;zZ|J5^2{^p z55g>gYcaHAmmBrKf5L5($U6JLTFSkk*6#R`E&zu9!*f?v=>QQA9|1Cnh`SW#Wz5-b z(>jL@G{bgeH%P8|!_%ZXd$8thHm(tzO~W^hIux;2f(0@;(Z%uGZgXk;F$Q$9oB$zq zDsQ+~quCXRo|wpLTw{cvstU}TDs4$6x5s^G@?$SFW50HKLQh&Sohs!JZyY7AaaE6( zL7-m@_})k1U{kZgYau4snGzi75tX|p)F~WO9OegXp=qEln%Qa4UP}{cvoWA@M&Ckx zHO*ItoIq@srY+m}Vn->*8Qvz#+=-duLM~2;%sh6;fk_^jc-&lCMZg~Gk7E_OWzZ?PvIK_h3RQaRig+G*5*ff8p(zZkzQb&d17FT!!}lK> z;2nL9&WYvxUfIs_ec?6JvyQa%MF{d;z)l^HB*&V=W+tzkwGY1jkaVV-62uheL>uXW z5SxAjz7Fs$=zs8oKxDpI!_b_k`WiOsFjhjlsC! z{P$ZcabRYUP!7Lw+6t>8$?0FjYgP0nQ&p^K#&8rj8nEt;x$9&2p}h{^^kKJUNi5Jv z)49H~Y!6us6}1i>lkO>uQb!i9Rs!BdC8vD7?fzOC=zxEn(=SB(R=xdg)#Ko}c&1@h zqfgN>O)M!!X_@xK(U)^Z=|cl!MFDN-iN#onodbSd*5X}Zxoe=jcoF-9BheCv&Y8Bv zo}J2JqDEO(S4uUpVMWKVwpPGoS^u|r#vxmUugK82&a#MDcgraqWnm^d1cY1{RFaIf)JJZh9I{$RPd-hzrIwO0XgE z7|#Aj#1Dxz$ZA@~cetW7Ob#;@HhVaLl|J-kdZwd%F0Gc`P9)qU&%biFU$^{2j6;* zb`HgqiQf3<(@-j=)GI78OZW!Q2^X`FyxDJ30X4*_KRM^b1Lka{NkKRaX2~=eAV9-< zSOIKf3TbCJkNCQh*c&{cun;JKdt<|_Ctn@c7r{Ai#a^ZfQ+0ec2rN=00B(#IGW_#y z%#-rXqPAQ)_c;6R*U`jLc$e`I*bxgc1qiC?G%-k%0%u{;c143{X90hanM&fco9m^D zq(ehkYEW``t$W>H;i40?`O9C8ywm0Px)OFZkWd`{K+99d|KNB?%Tnk z46upQ$q%O?OT1*=HyN=I9hu?5&f!pUt=2${hjjh(3RWyKyZ@VdDoBq3XZ7!rGNGEz!|Y<>|{5@$5evD zLHp3VR+F_ih3E=JMr6d8r3bk28s*VgTfQP`LyL!BY2Cn9wfRP*gQ&x%kR;+>2q!!N zcK>;zHwoJ$1i=3Aq@9={9+^QDMQi4u`Rb0`hyf+LC-IK>)oR6!-qDbCX_~s`pEy1 zSfT)_ci%osQ=Rru5F0GW^)ISu#J)aJW%)^%5b?`BBCg%o*0$O#V@iV(RLc=Ak&1WO z#W=1S)rRc+L_lAN^2j_}Gk@i06eU<09h~ei79Dku3mzzydXfPWq!aGR#i|d1vzC^( z^ULohQbu71c_D^1<22RytGOHRp?;aM+(Ib%m9qH6_4^a}KTHs)DQ-|T!tPK& zSri?S*_o3_nwiE8QUtJ}BpuOh*6 znm-gSrn}qxm}jigE=Tb8149H;Kk!N2(Y&mb^S1{3|9$Mt9OAJ4gyxiK@4HLunBau2DXq%%D05GtpO5R?6! z!TvRq4%imKx2bnnkFUb5+LE0)MV$_;8!#S@zKs+Lp^_Mw_XF1L!Ay*#KuFX34O0>2 z>B}j#KhCwe8TH)1QKER4q#i};SWKw#({<4fYKPf`?~ztl@YDZpey-=@xmiPGzGa7m zqV_#GlPk7l2*gYiXXHnZ$BO@HUH4JGh#e(yc(~SkfNK1F zwdMOt41gG??Z-vyp5);Ob~6dYln|1rj#3#*Nj)K7MsMV#%Msz6f2Le$*2c}b!&ySr z)S5W_hf?zinCNqe>6aU7QZD1ZO7P>a#8Lb@SNmi)GABG2W?v3mdNL}8{LU%2RohHOEmy9^rLh;-;l5$rW+gdSWz z4|YA692tRaKm8%P`_UA+;BJI5T<4S2>{*%FF1gWupo_q>q1ya|k`-CJ6E@z>$lqZ$ zHk!P^MZ<|T!qX53!YRidG<(na5LOAg8Lv#ciNk1qrR=zFN5}cMCHD5;u$0F9Ad)@8 z+v)jewis(y$80~ZotF2iANOSO#n=Xi^NB-nQC~0pJR~F0VQt}ucEPKc25kH0(qd4l zkty3vk`=N#gfz&Z0a$AMwA2L0FSAorPtO#rR-fYSOtc+O-a*GhHzfW3J)Bdcf z$h^45YIn0j$q6weue&k5Kcd_dq)I6UIf?BSb4&>l*OaDTXeuY_EdnD=Y!O{O!P^Xo ztReZluV9ah)vrYjbZ&U9$H967M4ygE(lKFJg{XVru=2b;+$dHo{-^}jD=Hd%v8#4& zOiGJQDQ)d12PqM{Dd&`VWOiplX&y9V#dRxlkP`~kI`G2ct>6pVNA@8KrH~kDmmW!6 zx@X*x(R=Tx#;JQi?SS^9&Yim5sMJ7ax9WzQj|@l(hH`Bv)n!@a9Hvw3QI&PNbqD`F zHaP>u3E>uq83D9y{a7mTNmt)+aM{YjpYP53n&--%n~OBH!+DxuEq#EjDHRY79SGy0 zk=3l9(U&u-5lHBcsi|}5b691T*8H_TEE0ca$b7laAyp*gozR74Fs3|~K1uC)wZQU+ zdPmrj%5=m4%rT10vHrTmQMR*n9fS3Qc+z3v9^&t2b+og+hz6|hh`g_Js9lczKjMam z@tBra%dxMDwAHD>g?WDBDGmH5#j$Yjh!qAU@lpC4x|+#Lngd&~kOJjoK;trL9nFf9 zwlU;cO^0j$M3T{&R`Y8GX9fD+J^(9HV*=-qgXz`MP&C0MU^b5#Q%^AqZ4rPjS!e0z zGKKwPLZzpJ^F~e#{}{wXVF6UDAfWzYfEESBXC7xb>c62<9vY4gcla?Z@>5S}45y(= zmL{JcdwfhJ@cow{#J=Cj%{Ofakmav@O|mYUdUY)QQ6tmNol(-w<;T-D$rbY~@>R8( zsS1#CaMLVygx|m;;77FUfKs`;vF4dnQW*&T?#x@6VhkYaZXW?Z1AJLSQ}e?ezX2C@ z&0uOxVQtu1I@{nD(oiX*YMNrRMnA7v>BosxHXZ39|E-$XAs3H7e)r-TThL1UX5E(a67`C-I9=bMdMZDHiQf%) z_!<4DMch2<lfffb$g^rHkJ^$V9b2qOuqOljKrsqEHEF0 z1ZGdUE!lE3(itwQ=3w@uL%@)5L`cx`7i8Vw$dTOvbT?qYo6f#bUe|98!>kLN!V}Av zR}Vo_BQa386Hy07a15w;$#jQ~>jZAozFQjkCsvSHIi(SrhAan!SE`=iJE{@#V)xx` zZ?al&@c66HbN!xs5jVIn^z{#UROzrtoo$}+NTo>>J*e(z=>=!7KCC#P!cA@8 zD_Og;3hAK}9kOoeImO#wY=ewL{2 z&O#Wka)sQdg0ltYX~eYGOfd@#vC$Afn^#U^^$ox8x_5k5o;(qw;c4%bx??@%sx=f ze))Bg;fA7y-+3_OdKo?n9hSmFrG$$0Pp~xq_dN5B)cNNpL)-BFXR*d_9vd@#8(*sp zc5q_v4*7hM@taI`ZvK`H@rnx9U4Sim838zJY-NQi`!92oPH6Y8)TMQ~hG7)zMI7J@ zt!s!zBrBOazZGv-1*;=3iyE?f-dR)%Jw@yN7bACGRB{QK;exfeeu=awbNYXP>L(!&1_^1;B+-dQ$0P^{5r&e(RiNCWN{OM{pcCk4wz% zGl*QfcCeiZJ6qoBqE%TJ&4KF~?eG|30*0>XhXTIsNzcBH2q`1g>DBFXr6BW5B3r*Q zWZWN|V@fa9%#-&|k}J>OX@mD@tO>lc{ZDamLb7yA zD3C?1Xae^bvl$Eh?Z+zl=hlY`t(;dDv7K9L#AlxxEMa5ma6mzcVm#8gEbno5we2NH;H!#H_8zE#T|~j4Mer%(US&z{ z`PwX_`Op_{wK&Hfm({uZ`BMptmcm9l4u4>9Q<^9{g9Tkrg|TcHnrmwOj%2-1czRni z))@ALR(`XETf|ofJ$Aw{ZGr8WSqq&ySNs)o#sfdBRZhI_P8mZFpd)Lt0WGq2qF-C+ zu?_vPTmES=hW0pVzA(F&n9@oU{n#k?0LInU=^@yX38#QDC`$bUkmg*8FV<%hIlkl+ zpNt0_$=XO-o)-&0EFh2lI46Yy8^`Ifq3V<&enKFg3tPb%(u&k-)(k)(5i}%?YFsQuj}x zAE@%ov)t)4p;fE5v5phNw zq5Ed#IU&H&s?McNEr+Jijp2Xqe7#byk5%2#%*vjge`$YRbz%$qXS2VS8OnLWxp96( zOd$_3tdFxYEhkd0h%e|M0j@#Ccrx=2FlG^&VnWbUa;sI%1P1Wwz)^u1qjn0|(g(s& zP@w{U*E$`~&H8{Ln;99f(modMcZseu)l(M7bVpPS*Q0>##TkPrm8b?q6t8Yl0}pr3 z?Ws!J%Ww;DZZ_rR;;4xQSZ@elp!3kU5)W2m)*Yy+S5I(SWsoDe@BNu2NYs6|J$kUS zNT=Vw3xr@02I-4e8wtRAJB&TUfrl-H5#tj9b22roi5u^T1F7w%WbsUVwkoc5-9h7n zAE%}TIs_X!Ms%i+D5~tD*IPqtxSMji$#hFum{EQ+JpGL*rt+2z3v~`B-Q(J3|L3#+/dev/null +``` + +If `sim-server` exits with `AttributeError: module 'warp.types' has no attribute +'array'`, the image resolved a newer `warp-lang` than the current cuRobo/Isaac +Sim path expects. Pin `warp-lang==1.12.0` in the sim image, rebuild, and rerun +the smoke; do not count the robot-loop path as passed until all four services +are healthy. diff --git a/cookbooks/cosmos3/end2end/explainable-palletizer/workflow_e2e.md b/cookbooks/cosmos3/end2end/explainable-palletizer/workflow_e2e.md new file mode 100644 index 00000000..a50174cf --- /dev/null +++ b/cookbooks/cosmos3/end2end/explainable-palletizer/workflow_e2e.md @@ -0,0 +1,254 @@ +# Decision Walkthrough and Validation Criteria + +This companion guide adapts the explainable-palletizer walkthrough from the +source project for the Cosmos3 cookbook layout. Use it after the quick Diffusers +smoke test in [run_palletizer_with_diffusers.md](run_palletizer_with_diffusers.md) +to understand what a useful palletizing-scene artifact or full-stack robot-loop +run should make visible. + +The original Doosan Robotics proof of concept was built for a Cosmos Cookoff +reasoning demo. This cookbook uses Cosmos3-Nano as the default generation +profile and Cosmos3-Super as the higher-quality generation profile. The +Cosmos3 Diffusers path validates palletizing scene prompts, model identity, +fixed seeds, and generated media artifacts. The Doosan reference stack remains +the source for the Isaac Sim, cuRobo, app-server, and operator UI control-loop +behavior. + +## Model Profiles + +| Profile | Model | Purpose | +| --- | --- | --- | +| Nano | `nvidia/Cosmos3-Nano` | Default smoke-test profile for low-cost palletizing-scene artifact generation | +| Super | `nvidia/Cosmos3-Super` | Higher-quality profile for final prompt review and richer generated artifacts | + +Both profiles use the same HTTP client shape in this cookbook: + +- `GET /health` +- `GET /v1/models` +- `POST /v1/infer` + +The model is selected by the running server. Always check `/v1/models` before +the generation request and record the returned model ID with the output +artifact. + +## Reference Control Loop + +The Doosan stack is a four-service reference system: + +| Service | Default port | Role | +| --- | --- | --- | +| `sim-server` | 8100 | Runs Isaac Sim headlessly, creates conveyor-box images, and executes cuRobo-planned pick/place trajectories | +| `inference-server` | 8200 | Serves the reference model endpoint used by the app server or the no-token tiny model in `make docker-test` | +| `app-server` | 8000 | Builds prompts, parses structured actions, maintains pallet state, and streams events | +| `frontend` | 3000 | Shows camera frames, rationales, parsed actions, and execution status | + +The control loop is intentionally auditable: + +1. `sim-server` keeps a conveyor buffer populated with visible boxes. +2. `app-server` requests box images, dimensions, pallet state, and valid + placement cells. +3. `app-server` sends the prompt to the inference endpoint. +4. The response is parsed into a bounded action contract. +5. `app-server` validates the action against pallet constraints. +6. `sim-server` plans and executes the simulated robot motion. + +The Cosmos3 Diffusers smoke test does not replace the robot action parser. It +creates visual evidence for palletizing prompts, scene constraints, and +operator-review criteria before or alongside the full-stack robot smoke path. + +## Action Contract + +The reference app accepts three action types: + +| Action | Required fields | Meaning | +| --- | --- | --- | +| `PICK_AND_PLACE` | `box`, `target_pallet`, `position`, `speed_pct`, `grip_strength`, `reason` | Pick one visible box and place it at a valid pallet position | +| `CALL_A_HUMAN` | `boxes`, `reason` | Remove damaged, contaminated, unsealed, or otherwise unsafe boxes for inspection | +| `WAIT` | `reason` | Wait only when too few boxes are visible and no safe placement or human call is appropriate | + +`PICK_AND_PLACE` is constrained by the prompt and by parser-side validation: + +| Field | Type | Allowed values | +| --- | --- | --- | +| `box` | string | One of the visible box IDs, such as `box_0001` | +| `target_pallet` | integer | `1` or `2` | +| `position` | `[x, y, z]` | One of the precomputed valid positions for the selected box and pallet | +| `speed_pct` | integer | `40`, `80`, or `100` | +| `grip_strength` | string | `standard`, `gentle`, or `firm` | +| `reason` | string | Brief operator-visible rationale | + +The important safety property is that placement positions are not invented by +the model. The app computes valid positions from pallet occupancy and stability +rules, then the response must select one of those legal positions. + +## Scenario 1: Damaged Carton + +**Expected action:** `CALL_A_HUMAN` + +Three boxes arrive together. Two are visibly unsafe: one has an open top flap +with detached tape, and another is crushed and deformed. The intact box should +not cause the app to ignore the unsafe buffer state. + +| Field | Value | +| --- | --- | +| Visible boxes | `box_0000`, `box_0001`, `box_0002` | +| Visible condition | `box_0000`: open flap, detached tape; `box_0001`: intact; `box_0002`: crushed, deformed | +| Pallet state | Partial fill | +| Valid placement cells | Available, but unsafe boxes should block the pick | + +Operator-visible rationale: + +```text +box_0000 has open flaps and detached tape. box_0002 is crushed and deformed. +Escalate both boxes for inspection before continuing placement from a clean +buffer. +``` + +Parsed action: + +```json +{ + "action": "CALL_A_HUMAN", + "boxes": ["box_0000", "box_0002"], + "reason": "box_0000 has open flaps and detached tape, box_0002 is crushed and deformed" +} +``` + +Simulated outcome: no pick attempt. `app-server` emits a `CALL_A_HUMAN` event, +the UI flags the damaged boxes, and the conveyor advances after operator +inspection. + +

+ Damaged carton scenario triggers CALL_A_HUMAN in the UI +

+ +## Scenario 2: Heavy Appliance Box + +**Expected action:** `PICK_AND_PLACE` at a low `z` position with a firm grip. + +Three intact heavy or sturdy boxes arrive together: a metal tool set, a +36-can case of canned beans, and a 25 kg set of rubber-coated weight plates. +Both pallets are empty, so the first heavy box can seed the base layer. + +| Field | Value | +| --- | --- | +| Visible boxes | `box_0001` (tool set), `box_0003` (canned beans), `box_0004` (weight plates) | +| Dimensions | `box_0001`: 2 x 2 x 2; `box_0003`: 2 x 2 x 1; `box_0004`: 2 x 2 x 2 | +| Pallet state | Pallet 1: 0% filled, pallet 2: 0% filled | +| Valid placement cells | Base-layer `[0, 0, 0]` on either pallet | + +Operator-visible rationale: + +```text +All boxes pass damage inspection. Heavy, sturdy boxes belong on the base layer +for stack stability. With both pallets empty, choose pallet 1 and place the +first visible heavy box at [0, 0, 0] using firm grip. +``` + +Parsed action: + +```json +{ + "action": "PICK_AND_PLACE", + "box": "box_0001", + "target_pallet": 1, + "position": [0, 0, 0], + "speed_pct": 80, + "grip_strength": "firm", + "reason": "Pure Harvest steel tool set is heavy and sturdy; placed at low z on Pallet 1 to form a stable base." +} +``` + +Simulated outcome: cuRobo plans the pick, and the Doosan P3020 places +`box_0001` at `[0, 0, 0]` on Pallet 1. + +

+ Heavy appliance scenario places a sturdy box on the base layer +

+ +## Scenario 3: Mixed-SKU Stacking + +**Expected action:** place heavy or rigid items below fragile items. + +Three intact boxes arrive: a 10-pack of SPAM cans, a 4-pack of glass kimchi +fermentation jars, and a multi-pack of honey butter chips. Pallet 1 is already +partially built. The next action should preserve stack quality by placing +heavier rigid goods at the lowest available stable slot and reserving higher +layers for fragile goods. + +| Field | Value | +| --- | --- | +| Visible boxes | `box_0008` (SPAM cans), `box_0010` (glass jars), `box_0011` (chip multipack) | +| Dimensions | `box_0008`: 2 x 2 x 1; `box_0010`: 2 x 1 x 1; `box_0011`: 2 x 1 x 1 | +| Pallet state | Pallet 1: 44% filled, pallet 2: 19% filled | +| Valid placement cells | Mid-layer slots on pallet 1, plus top-layer slots for delicate items | + +Operator-visible rationale: + +```text +All boxes pass damage inspection. Canned goods are heavy and rigid, so place +them at the lowest currently valid slot. Defer glass jars and chips to higher +slots with gentler handling. +``` + +Parsed action: + +```json +{ + "action": "PICK_AND_PLACE", + "box": "box_0008", + "target_pallet": 1, + "position": [0, 0, 2], + "speed_pct": 40, + "grip_strength": "firm", + "reason": "SPAM cans heavy and rigid; Pallet 1 closer to completion; delicate boxes deferred to high z." +} +``` + +Follow-up delicate-item action: + +```json +{ + "action": "PICK_AND_PLACE", + "box": "box_0029", + "target_pallet": 1, + "position": [0, 0, 3], + "speed_pct": 40, + "grip_strength": "gentle", + "reason": "box_0029 needs gentle handling; placing it at the top ensures it is not crushed by heavier boxes below." +} +``` + +Simulated outcome: the Doosan P3020 places `box_0008` in a mid-layer stable +slot, and a later iteration places fragile bottles at the top layer. + +

+ Mixed-SKU scenario places rigid items below delicate items +

+ +## What to Check in Cosmos3 Output + +For Nano and Super Diffusers runs, inspect the generated artifact against the +same operator-review criteria: + +- Mixed boxes, pallet grid, and robot cell are visible. +- Damage or fragile/handling cues are legible enough to support review. +- The scene leaves safe clearance around the robot arm. +- The prompt, seed, model ID, backend, and decoded artifact size are recorded. +- The artifact is treated as validation evidence, not as a production safety + decision. + +Super should be used when the Nano artifact is too small, noisy, or ambiguous +for the review objective. The full-stack robot-loop outcome still depends on +the reference app's parser, pallet constraints, and simulated execution checks. + +## Limitations + +- This is a simulated proof of concept, not a production robot safety system. +- Cosmos3-generated artifacts help validate scene prompts and review criteria; + they do not certify a real robot workcell. +- Real deployments need independent safety controls, guarded robot execution, + site-specific validation, and human-approved exception handling. +- The public Doosan stack can change independently of this cookbook, so treat + `make docker-test` as a live integration smoke rather than a guaranteed unit + test.