[
  {
    "path": "README.md",
    "content": "# 🖼️ HEIC Image Processing Tools\n\nA collection of Python tools for processing HEIC (High Efficiency Image Container) files, with a focus on HDR content extraction and EXR conversion.\n\n## 🛠️ Tools Overview\n\n### 1. gain_map_extract.py\nExtracts all components from HEIC files including:\n- Base images\n- HDR gain maps\n- Depth maps\n- Complete metadata (EXIF, XMP, ICC profiles)\n\n### 2. heic_to_exr.py\nConverts HEIC files to OpenEXR format:\n- Combines base image and gain map into HDR EXR using apples method\n- Preserves full dynamic range\n- Maintains metadata where possible\n- Supports batch processing\n\n### 3. merge_to_exr.sh\nShell script for batch processing:\n- Automates HEIC to EXR conversion\n- Handles multiple files\n- Provides progress feedback\n- Maintains directory structure\n\n## 🔧 Installation\n\n### Prerequisites\n- Python 3.8 or higher\n- pip (Python package manager)\n- Git (for cloning the repository)\n\n### macOS\n```bash\n# Install Homebrew if not already installed\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\n\n# Install Python and OpenEXR dependencies\nbrew install python3 openexr\n\n# Clone the repository\ngit clone https://github.com/finnschi/heic-shenanigans.git\ncd heic-shenanigans\n\n# Create and activate virtual environment\npython3 -m venv venv\nsource venv/bin/activate\n\n# Install Python dependencies\npip install -r requirements.txt\n```\n\n### Linux (Ubuntu/Debian)\n```bash\n# Install system dependencies\nsudo apt-get update\nsudo apt-get install python3 python3-pip python3-venv openexr libopenexr-dev\n\n# Clone the repository\ngit clone https://github.com/finnschi/heic-shenanigans.git\ncd heic-shenanigans\n\n# Create and activate virtual environment\npython3 -m venv venv\nsource venv/bin/activate\n\n# Install Python dependencies\npip install -r requirements.txt\n```\n\n### Windows\n```powershell\n# Install Python from https://www.python.org/downloads/\n# Install Git from https://git-scm.com/download/win\n\n# Clone the repository\ngit clone https://github.com/finnschi/heic-shenanigans.git\ncd heic-shenanigans\n\n# Create and activate virtual environment\npython -m venv venv\n.\\venv\\Scripts\\activate\n\n# Install Python dependencies\npip install -r requirements.txt\n```\n\n## 📋 Requirements\nAll required Python packages are listed in requirements.txt:\n- Pillow: Image processing library\n- pillow-heif: HEIC file support\n- numpy: Numerical operations\n- defusedxml: Safe XML parsing\n\nSystem dependencies (installed via package manager):\n- OpenEXR and OpenImageIO (oiiotool) for EXR file handling\n\n## 💻 Usage\n\n### Gain Map Extraction\n```bash\npython gain_map_extract.py input.heic [--output-dir OUTPUT_DIR]\n```\n\n### HEIC to EXR Conversion\n```bash\npython heic_to_exr.py input.heic [--output-dir OUTPUT_DIR]\n```\n\n### Batch Processing\n```bash\n./merge_to_exr.sh input_directory output_directory\n```\n\n## 📁 Output Files\n\n### gain_map_extract.py outputs:\n- Base image: `{filename}_base.tiff`\n- Gain maps: `{filename}_gain_map_{id}.tiff`\n- Depth maps: `{filename}_depth_{index}.tiff`\n- Metadata: `{filename}_metadata.json`\n\n### heic_to_exr.py outputs:\n- HDR EXR file: `{filename}.exr`\n\n## 🔍 Advanced Usage\n\n### Metadata Handling\n- Binary data is base64 encoded\n- ICC profiles are maintained\n- EXIF data is preserved where possible\n\n### HDR Processing\n- Gain maps are properly scaled\n- Linear color space is maintained\n- Full dynamic range is preserved in EXR output\n\n## ⚠️ Known Limitations\n- Some HEIC variants may not be fully supported\n- Depth map extraction is limited to supported devices\n- Windows OpenEXR support may require additional configuration\n\n## 🤝 Contributing\nContributions are welcome! Please feel free to submit a Pull Request.\n\n\n"
  },
  {
    "path": "gain_map_extract.py",
    "content": "#!/usr/bin/env python3\n\nimport os\nfrom PIL import Image\nimport pillow_heif\nimport numpy as np\nfrom pathlib import Path\nimport json\nimport base64\n\ndef extract_all_images(input_path, output_dir=None):\n    \"\"\"\n    Extract all images from a HEIC file including base image, gain map, depth map, and all auxiliary images.\n    Also dumps all metadata into a JSON file.\n    \n    Args:\n        input_path (str): Path to input HDR image (HEIC or JPEG)\n        output_dir (str, optional): Directory for output files. If None, will use input file's directory.\n    \"\"\"\n    input_path = Path(input_path)\n    \n    # Create output directory if not provided\n    if output_dir is None:\n        output_dir = input_path.parent\n    else:\n        output_dir = Path(output_dir)\n        output_dir.mkdir(parents=True, exist_ok=True)\n    \n    # Read HEIC file\n    heif_file = pillow_heif.read_heif(str(input_path))\n    \n    # Dictionary to store all extracted images and their paths\n    extracted_images = {}\n    \n    # Get primary image\n    base_image = Image.frombytes(\n        heif_file.mode,\n        heif_file.size,\n        heif_file.data,\n        \"raw\",\n        heif_file.mode,\n        heif_file.stride,\n    )\n    base_path = output_dir / f\"{input_path.stem}_base.tiff\"\n    base_image.save(base_path, format='TIFF')\n    extracted_images['base'] = str(base_path)\n    \n    # Extract all auxiliary images\n    if 'aux' in heif_file.info:\n        for aux_type, aux_ids in heif_file.info['aux'].items():\n            for aux_id in aux_ids:\n                try:\n                    aux_image = heif_file.get_aux_image(aux_id)\n                    aux_pil = Image.frombytes(\n                        aux_image.mode,\n                        aux_image.size,\n                        aux_image.data,\n                        \"raw\",\n                        aux_image.mode,\n                        aux_image.stride,\n                    )\n                    \n                    # Create a sanitized filename from the aux type\n                    aux_type_name = aux_type.split(':')[-1]\n                    aux_path = output_dir / f\"{input_path.stem}_{aux_type_name}_{aux_id}.tiff\"\n                    aux_pil.save(aux_path, format='TIFF')\n                    extracted_images[f\"{aux_type_name}_{aux_id}\"] = str(aux_path)\n                except Exception as e:\n                    print(f\"Warning: Could not extract auxiliary image {aux_id} of type {aux_type}: {str(e)}\")\n    \n    # Extract depth images if available\n    if 'depth_images' in heif_file.info and heif_file.info['depth_images']:\n        for i, depth_image in enumerate(heif_file.info['depth_images']):\n            depth_pil = Image.frombytes(\n                depth_image.mode,\n                depth_image.size,\n                depth_image.data,\n                \"raw\",\n                depth_image.mode,\n                depth_image.stride,\n            )\n            depth_path = output_dir / f\"{input_path.stem}_depth_{i}.tiff\"\n            depth_pil.save(depth_path, format='TIFF')\n            extracted_images[f\"depth_{i}\"] = str(depth_path)\n    \n    # Prepare metadata\n    metadata = {\n        'info': {},\n        'aux_images': {},\n        'depth_images': [],\n        'icc_profile': None,\n        'exif': None,\n        'xmp': None,\n        'primary': {\n            'mode': heif_file.mode,\n            'size': heif_file.size,\n            'stride': heif_file.stride\n        }\n    }\n    \n    # Copy all info\n    for key, value in heif_file.info.items():\n        if isinstance(value, (str, int, float, bool, type(None))):\n            metadata['info'][key] = value\n        elif isinstance(value, bytes):\n            # Convert bytes to base64 for JSON serialization\n            metadata['info'][key] = base64.b64encode(value).decode('utf-8')\n        elif isinstance(value, dict):\n            metadata['info'][key] = {\n                k: base64.b64encode(v).decode('utf-8') if isinstance(v, bytes) else v\n                for k, v in value.items()\n            }\n    \n    # Handle ICC profile\n    if 'icc_profile' in heif_file.info:\n        metadata['icc_profile'] = base64.b64encode(heif_file.info['icc_profile']).decode('utf-8')\n    \n    # Handle EXIF\n    if 'exif' in heif_file.info:\n        metadata['exif'] = base64.b64encode(heif_file.info['exif']).decode('utf-8')\n    \n    # Handle XMP\n    if 'xmp' in heif_file.info:\n        metadata['xmp'] = base64.b64encode(heif_file.info['xmp']).decode('utf-8')\n    \n    # Save metadata to file\n    metadata_path = output_dir / f\"{input_path.stem}_metadata.json\"\n    with open(metadata_path, 'w') as f:\n        json.dump(metadata, f, indent=2)\n    \n    # Return paths and metadata\n    result = {\n        'extracted_images': extracted_images,\n        'metadata_path': str(metadata_path)\n    }\n    \n    return result\n\nif __name__ == \"__main__\":\n    import argparse\n    \n    parser = argparse.ArgumentParser(description='Extract all images and metadata from HEIC files')\n    parser.add_argument('input', help='Input HEIC image path')\n    parser.add_argument('--output-dir', help='Output directory for extracted images')\n    \n    args = parser.parse_args()\n    \n    try:\n        result = extract_all_images(args.input, args.output_dir)\n        print(\"\\nExtracted images:\")\n        for name, path in result['extracted_images'].items():\n            print(f\"{name}: {path}\")\n        print(f\"\\nMetadata saved to: {result['metadata_path']}\")\n    except Exception as e:\n        print(f\"Error: {str(e)}\")\n"
  },
  {
    "path": "heic_to_exr.py",
    "content": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport tempfile\nimport shutil\nfrom pathlib import Path\nfrom PIL import Image\nimport pillow_heif\nimport numpy as np\nimport subprocess\nimport json\n\ndef extract_heic(input_path, output_dir):\n    \"\"\"Extract all images from HEIC file to TIFFs.\"\"\"\n    print(f\"\\nExtracting images from {input_path}...\")\n    \n    heif_file = pillow_heif.read_heif(str(input_path))\n    print(f\"HEIC info: {heif_file.info}\")\n    \n    # Initialize paths\n    base_path = None\n    gain_map_path = None\n    depth_path = None\n    matte_paths = []\n    headroom = None\n    \n    # Extract base image\n    print(\"\\nExtracting base image...\")\n    base_image = Image.frombytes(\n        heif_file.mode,\n        heif_file.size,\n        heif_file.data,\n        \"raw\",\n        heif_file.mode,\n        heif_file.stride,\n    )\n    base_path = output_dir / \"input_base.tiff\"\n    base_image.save(base_path, format='TIFF')\n    print(f\"Saved base image to {base_path}\")\n    \n    # Extract gain map\n    print(\"\\nLooking for gain map...\")\n    if 'aux' in heif_file.info:\n        print(f\"Found aux data: {heif_file.info['aux']}\")\n        if 'urn:com:apple:photo:2020:aux:hdrgainmap' in heif_file.info['aux']:\n            try:\n                aux_id = heif_file.info['aux']['urn:com:apple:photo:2020:aux:hdrgainmap'][0]\n                print(f\"Found gain map aux ID: {aux_id}\")\n                aux_image = heif_file.get_aux_image(aux_id)\n                gain_map = Image.frombytes(\n                    aux_image.mode,\n                    aux_image.size,\n                    aux_image.data,\n                    \"raw\",\n                    aux_image.mode,\n                    aux_image.stride,\n                )\n                gain_map_path = output_dir / \"input_hdrgainmap_50.tiff\"\n                gain_map.save(gain_map_path, format='TIFF')\n                print(f\"Saved gain map to {gain_map_path}\")\n            except Exception as e:\n                print(f\"Warning: Could not extract gain map: {str(e)}\")\n        else:\n            print(\"No gain map found in aux data\")\n    else:\n        print(\"No aux data found in HEIC\")\n    \n    # Extract depth map\n    print(\"\\nLooking for depth map...\")\n    if 'depth_images' in heif_file.info and heif_file.info['depth_images']:\n        try:\n            depth_image = heif_file.info['depth_images'][0]\n            depth_map = Image.frombytes(\n                depth_image.mode,\n                depth_image.size,\n                depth_image.data,\n                \"raw\",\n                depth_image.mode,\n                depth_image.stride,\n            )\n            depth_path = output_dir / \"input_depth_0.tiff\"\n            depth_map.save(depth_path, format='TIFF')\n            print(f\"Saved depth map to {depth_path}\")\n        except Exception as e:\n            print(f\"Warning: Could not extract depth map: {str(e)}\")\n    else:\n        print(\"No depth map found\")\n    \n    # Extract mattes\n    print(\"\\nLooking for mattes...\")\n    if 'aux' in heif_file.info:\n        for aux_type, aux_ids in heif_file.info['aux'].items():\n            if 'matte' in aux_type.lower():\n                print(f\"Found matte type: {aux_type}\")\n                for aux_id in aux_ids:\n                    try:\n                        aux_image = heif_file.get_aux_image(aux_id)\n                        aux_pil = Image.frombytes(\n                            aux_image.mode,\n                            aux_image.size,\n                            aux_image.data,\n                            \"raw\",\n                            aux_image.mode,\n                            aux_image.stride,\n                        )\n                        aux_type_name = aux_type.split(':')[-1]\n                        aux_path = output_dir / f\"input_{aux_type_name}_{aux_id}.tiff\"\n                        aux_pil.save(aux_path, format='TIFF')\n                        matte_paths.append(aux_path)\n                        print(f\"Saved matte {aux_id} to {aux_path}\")\n                    except Exception as e:\n                        print(f\"Warning: Could not extract matte {aux_id}: {str(e)}\")\n    else:\n        print(\"No mattes found\")\n    \n    # Get HDR headroom\n    if 'HDRGainMapHeadroom' in heif_file.info:\n        headroom = heif_file.info['HDRGainMapHeadroom']\n        print(f\"\\nFound HDR headroom: {headroom}\")\n    else:\n        print(\"\\nNo HDR headroom found in HEIC info\")\n    \n    return base_path, gain_map_path, depth_path, matte_paths, headroom\n\ndef merge_to_exr(input_dir, original_heic, output_path):\n    \"\"\"Merge extracted TIFFs into a multilayer EXR.\"\"\"\n    print(\"\\nMerging to EXR...\")\n    \n    # Get dimensions from base image\n    print(\"Getting image dimensions...\")\n    base_info = subprocess.check_output(['oiiotool', '--info', str(input_dir / \"input_base.tiff\")]).decode()\n    print(f\"Base image info: {base_info}\")\n    width = int(base_info.split()[2])\n    height = int(base_info.split()[4].rstrip(','))\n    print(f\"Image dimensions: {width}x{height}\")\n\n    # Process base image (RGB) - Convert from sRGB curve through Linear P3 to ACEScg\n    print(\"\\nProcessing base image...\")\n    subprocess.run([\n        'oiiotool', str(input_dir / \"input_base.tiff\"),\n        '--ch', 'R,G,B',\n        '--chnames', 'sdr.R,sdr.G,sdr.B',\n        '--colorconfig', 'studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio',\n        '--colorconvert', 'sRGB - Texture', 'Linear Rec.709 (sRGB)',\n        '--colorconvert', 'Linear P3-D65', 'ACES - ACEScg',\n        '-o', str(input_dir / \"base.exr\")\n    ], check=True)\n    print(\"Base image processed\")\n\n    # Process gain map if it exists\n    gain_map_path = input_dir / \"input_hdrgainmap_50.tiff\"\n    if gain_map_path.exists():\n        print(\"\\nProcessing gain map...\")\n        # Process gain map (Y) - Convert from Rec709 curve to Linear\n        subprocess.run([\n            'oiiotool', str(gain_map_path),\n            '--ch', 'Y',\n            '--chnames', 'gainmap.Y',\n            '--resize', f\"{width}x{height}\",\n            '--colorconfig', 'studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio',\n            '--ocionamedtransform', 'Rec.709 - Curve',\n            '-o', str(input_dir / \"gainmap.exr\")\n        ], check=True)\n        print(\"Gain map processed\")\n\n        # Create 3-channel gainmap by duplicating Y to RGB\n        subprocess.run([\n            'oiiotool', str(input_dir / \"gainmap.exr\"),\n            '--ch', 'gainmap.Y,gainmap.Y,gainmap.Y',\n            '--chnames', 'gainmap.R,gainmap.G,gainmap.B',\n            '-o', str(input_dir / \"gainmap_rgb.exr\")\n        ], check=True)\n        print(\"Gain map converted to RGB\")\n\n        # Calculate HDR: first multiply gainmap by (headroom - 1.0)\n        headroom = float(subprocess.check_output(['exiftool', '-HDRGainMapHeadroom', '-b', str(original_heic)]).decode())\n        print(f\"Using HDR headroom: {headroom}\")\n        subprocess.run([\n            'oiiotool', str(input_dir / \"gainmap_rgb.exr\"),\n            '--mulc', str(headroom - 1.0),\n            '--addc', '1.0',\n            '-o', str(input_dir / \"gainmap_scaled.exr\")\n        ], check=True)\n        print(\"Gain map scaled\")\n\n        # Then multiply base image by scaled gainmap\n        subprocess.run([\n            'oiiotool', str(input_dir / \"base.exr\"),\n            str(input_dir / \"gainmap_scaled.exr\"),\n            '--mul',\n            '--chnames', 'R,G,B',\n            '-o', str(input_dir / \"hdr_base.exr\")\n        ], check=True)\n        print(\"HDR base created\")\n    else:\n        print(\"\\nNo gain map found, using base image as HDR base\")\n        shutil.copy(str(input_dir / \"base.exr\"), str(input_dir / \"hdr_base.exr\"))\n\n    # Process depth if it exists\n    depth_path = input_dir / \"input_depth_0.tiff\"\n    if depth_path.exists():\n        print(\"\\nProcessing depth map...\")\n        subprocess.run([\n            'oiiotool', str(depth_path),\n            '--ch', 'Y',\n            '--chnames', 'depth.Y',\n            '--resize', f\"{width}x{height}\",\n            '-o', str(input_dir / \"depth.exr\")\n        ], check=True)\n        print(\"Depth map processed\")\n    else:\n        print(\"\\nNo depth map found\")\n\n    # Process mattes\n    print(\"\\nProcessing mattes...\")\n    for matte in input_dir.glob(\"input_*matte_*.tiff\"):\n        if matte.exists():\n            clean_name = matte.stem.replace(\"input_\", \"\").replace(\"matte_\", \"\")\n            print(f\"Processing matte: {clean_name}\")\n            subprocess.run([\n                'oiiotool', str(matte),\n                '--ch', 'Y',\n                '--chnames', f\"mattes.{clean_name}.Y\",\n                '--resize', f\"{width}x{height}\",\n                '-o', str(input_dir / f\"{clean_name}.exr\")\n            ], check=True)\n            print(f\"Matte {clean_name} processed\")\n    else:\n        print(\"No mattes found\")\n\n    # Create final EXR with HDR as main RGB\n    print(\"\\nCreating final EXR...\")\n    subprocess.run([\n        'oiiotool', str(input_dir / \"hdr_base.exr\"),\n        '--ch', 'R,G,B',\n        '-o', str(input_dir / \"final.exr\")\n    ], check=True)\n    print(\"Base layer created\")\n\n    # Add SDR layer\n    print(\"Adding SDR layer...\")\n    subprocess.run([\n        'oiiotool', str(input_dir / \"final.exr\"),\n        str(input_dir / \"base.exr\"),\n        '--ch', 'sdr.R,sdr.G,sdr.B',\n        '--siappend',\n        '-o', str(input_dir / \"final.exr\")\n    ], check=True)\n    print(\"SDR layer added\")\n\n    # Add gainmap layer if it exists\n    if gain_map_path.exists():\n        print(\"Adding gainmap layer...\")\n        subprocess.run([\n            'oiiotool', str(input_dir / \"final.exr\"),\n            str(input_dir / \"gainmap_rgb.exr\"),\n            '--ch', 'gainmap.R,gainmap.G,gainmap.B',\n            '--siappend',\n            '-o', str(input_dir / \"final.exr\")\n        ], check=True)\n        print(\"Gainmap layer added\")\n\n    # Add depth layer if it exists\n    if depth_path.exists():\n        print(\"Adding depth layer...\")\n        subprocess.run([\n            'oiiotool', str(input_dir / \"final.exr\"),\n            str(input_dir / \"depth.exr\"),\n            '--ch', 'depth.Y',\n            '--siappend',\n            '-o', str(input_dir / \"final.exr\")\n        ], check=True)\n        print(\"Depth layer added\")\n\n    # Add matte layers\n    print(\"Adding matte layers...\")\n    for matte in input_dir.glob(\"*.exr\"):\n        if matte.stem.startswith(\"semantic\"):\n            clean_name = matte.stem\n            print(f\"Adding matte layer: {clean_name}\")\n            subprocess.run([\n                'oiiotool', str(input_dir / \"final.exr\"),\n                str(matte),\n                '--ch', f\"mattes.{clean_name}.Y\",\n                '--siappend',\n                '-o', str(input_dir / \"final.exr\")\n            ], check=True)\n            print(f\"Matte layer {clean_name} added\")\n\n    # Move to final destination\n    print(f\"\\nMoving final EXR to {output_path}\")\n    shutil.move(str(input_dir / \"final.exr\"), str(output_path))\n    print(\"Done!\")\n\ndef main():\n    if len(sys.argv) != 2:\n        print(\"Usage: python heic_to_exr.py <input.heic>\")\n        sys.exit(1)\n\n    input_path = Path(sys.argv[1])\n    if not input_path.exists():\n        print(f\"Error: Input file {input_path} does not exist\")\n        sys.exit(1)\n\n    # Create output path next to input file\n    output_path = input_path.parent / f\"{input_path.stem}_acesCG.exr\"\n\n    # Create temporary directory\n    with tempfile.TemporaryDirectory() as temp_dir:\n        temp_dir = Path(temp_dir)\n        print(f\"Using temporary directory: {temp_dir}\")\n        \n        # Extract images from HEIC\n        base_path, gain_map_path, depth_path, matte_paths, headroom = extract_heic(input_path, temp_dir)\n        \n        # Merge to EXR\n        merge_to_exr(temp_dir, input_path, output_path)\n\n    print(f\"\\nSuccessfully created: {output_path}\")\n\nif __name__ == \"__main__\":\n    main() "
  },
  {
    "path": "merge_to_exr.sh",
    "content": "#!/bin/bash\n\nif [ $# -lt 2 ]; then\n    echo \"Usage: ./merge_to_exr.sh <input_folder> <original.HEIC> [output.exr]\"\n    exit 1\nfi\n\ninput_folder=\"$1\"\noriginal_heic=\"$2\"\noutput_path=\"${3:-output_acesCG.exr}\"\n\n# Create a temporary directory for intermediate files\ntemp_dir=$(mktemp -d)\necho \"Using temporary directory: $temp_dir\"\n\n# Get dimensions from base image\nbase_info=$(oiiotool --info \"$input_folder/input_base.tiff\" | head -n1)\nwidth=$(echo \"$base_info\" | cut -d' ' -f3)\nheight=$(echo \"$base_info\" | cut -d' ' -f5 | tr -d ',')\n\nif [ -z \"$width\" ] || [ -z \"$height\" ]; then\n    echo \"Error: Could not determine image dimensions\"\n    echo \"Debug info: $base_info\"\n    exit 1\nfi\necho \"Image dimensions: ${width}x${height}\"\n\n# Extract headroom from original HEIC\nheadroom=$(exiftool -HDRGainMapHeadroom -b \"$original_heic\")\nif [ -z \"$headroom\" ]; then\n    echo \"Error: Could not extract HDR headroom\"\n    exit 1\nfi\necho \"Extracted HDR headroom: $headroom\"\n\n# List all input files\necho \"Input files found:\"\nls -1 \"$input_folder\"/*.tiff\n\n# Process base image (RGB) - Convert from sRGB curve through Linear P3 to ACEScg\necho \"Processing base image...\"\noiiotool \"$input_folder/input_base.tiff\" \\\n    --ch R,G,B \\\n    --chnames sdr.R,sdr.G,sdr.B \\\n    --colorconfig studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio \\\n    --colorconvert \"sRGB - Texture\" \"Linear Rec.709 (sRGB)\" \\\n    --colorconvert \"Linear P3-D65\" \"ACES - ACEScg\" \\\n    -o \"$temp_dir/base.exr\" || exit 1\n\n# Process gain map (Y) - Convert from Rec709 curve to Linear\necho \"Processing gain map...\"\noiiotool \"$input_folder/input_hdrgainmap_50.tiff\" \\\n    --ch Y \\\n    --chnames gainmap.Y \\\n    --resize \"${width}x${height}\" \\\n    --colorconfig studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio \\\n    --ocionamedtransform \"Rec.709 - Curve\" \\\n    -o \"$temp_dir/gainmap.exr\" || exit 1\n\n# Process depth (Y)\necho \"Processing depth map...\"\noiiotool \"$input_folder/input_depth_0.tiff\" \\\n    --ch Y \\\n    --chnames depth.Y \\\n    --resize \"${width}x${height}\" \\\n    -o \"$temp_dir/depth.exr\" || exit 1\n\n# Process all mattes (Y)\necho \"Processing mattes...\"\nfor matte in \"$input_folder\"/input_*matte_*.tiff; do\n    if [ -f \"$matte\" ]; then\n        name=$(basename \"$matte\" .tiff)\n        # Clean up the matte name to be more Nuke-friendly\n        clean_name=$(echo \"$name\" | sed 's/input_//' | sed 's/matte_//')\n        echo \"Processing matte: $clean_name\"\n        oiiotool \"$matte\" \\\n            --ch Y \\\n            --chnames \"mattes.$clean_name.Y\" \\\n            --resize \"${width}x${height}\" \\\n            -o \"$temp_dir/$clean_name.exr\" || exit 1\n    else\n        echo \"Warning: No matte files found matching pattern: $matte\"\n    fi\ndone\n\n# Apply HDR formula: hdr_rgb = sdr_rgb * (1.0 + (headroom - 1.0) * gainmap)\necho \"Applying HDR formula...\"\n# Create 3-channel gainmap by duplicating Y to RGB\noiiotool \"$temp_dir/gainmap.exr\" \\\n    --ch gainmap.Y,gainmap.Y,gainmap.Y \\\n    --chnames R,G,B \\\n    -o \"$temp_dir/gainmap_rgb.exr\" || exit 1\n\n# Calculate HDR: first multiply gainmap by (headroom - 1.0)\noiiotool \"$temp_dir/gainmap_rgb.exr\" \\\n    --mulc \"$(echo \"$headroom - 1.0\" | bc -l)\" \\\n    --addc 1.0 \\\n    -o \"$temp_dir/gainmap_scaled.exr\" || exit 1\n\n# Then multiply base image by scaled gainmap\noiiotool \"$temp_dir/base.exr\" \\\n    \"$temp_dir/gainmap_scaled.exr\" \\\n    --mul \\\n    --chnames R,G,B \\\n    -o \"$temp_dir/hdr_base.exr\" || exit 1\n\n# Create final EXR\necho \"Creating final multilayer EXR...\"\n\n# First, create with HDR as main RGB\noiiotool \"$temp_dir/hdr_base.exr\" \\\n    --ch R,G,B \\\n    -o \"$temp_dir/final.exr\" || exit 1\n\n# Add SDR layer\noiiotool \"$temp_dir/final.exr\" \"$temp_dir/base.exr\" \\\n    --ch sdr.R,sdr.G,sdr.B \\\n    --siappend \\\n    -o \"$temp_dir/final.exr\" || exit 1\n\n# Add gainmap layer (using the RGB version we created earlier)\noiiotool \"$temp_dir/final.exr\" \"$temp_dir/gainmap_rgb.exr\" \\\n    --ch R,G,B \\\n    --chnames gainmap.R,gainmap.G,gainmap.B \\\n    --siappend \\\n    -o \"$temp_dir/final.exr\" || exit 1\n\n# Add depth layer\noiiotool \"$temp_dir/final.exr\" \"$temp_dir/depth.exr\" \\\n    --ch depth.Y \\\n    --siappend \\\n    -o \"$temp_dir/final.exr\" || exit 1\n\n# Add matte layers\nfor m in \"$temp_dir\"/semantic*.exr; do\n    if [ -f \"$m\" ]; then\n        clean_name=$(basename \"$m\" .exr)\n        oiiotool \"$temp_dir/final.exr\" \"$m\" \\\n            --ch \"mattes.$clean_name.Y\" \\\n            --siappend \\\n            -o \"$temp_dir/final.exr\" || exit 1\n    fi\ndone\n\n# Move to final destination\nmv \"$temp_dir/final.exr\" \"$output_path\"\n\n# Clean up temporary files\nrm -rf \"$temp_dir\"\n\necho \"Successfully merged TIFFs into: $output_path\" "
  },
  {
    "path": "requirements.txt",
    "content": "Pillow>=10.0.0\npillow-heif>=0.13.0\nnumpy>=1.24.0\ndefusedxml>=0.7.1 "
  },
  {
    "path": "studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio",
    "content": "ocio_profile_version: 2.1\n\nenvironment:\n  {}\nsearch_path: \"\"\nstrictparsing: true\nluma: [0.2126, 0.7152, 0.0722]\nname: studio-config-v1.0.0_aces-v1.3_ocio-v2.1\ndescription: |\n  Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]\n  ------------------------------------------------------------------------------------------\n  \n  This \"OpenColorIO\" config is geared toward studios requiring a config that includes a wide variety of camera colorspaces, displays and looks.\n  \n  Generated with \"OpenColorIO-Config-ACES\" v1.0.0 on the 2022/10/26 at 05:59.\n\nroles:\n  aces_interchange: ACES2065-1\n  cie_xyz_d65_interchange: CIE-XYZ-D65\n  color_picking: sRGB - Texture\n  color_timing: ACEScct\n  compositing_log: ACEScct\n  data: Raw\n  matte_paint: sRGB - Texture\n  scene_linear: ACEScg\n  texture_paint: ACEScct\n\nfile_rules:\n  - !<Rule> {name: Default, colorspace: ACES2065-1}\n\nshared_views:\n  - !<View> {name: ACES 1.0 - SDR Video, view_transform: ACES 1.0 - SDR Video, display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.0 - SDR Video (D60 sim on D65), view_transform: ACES 1.0 - SDR Video (D60 sim on D65), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - SDR Video (P3 lim), view_transform: ACES 1.1 - SDR Video (P3 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - SDR Video (Rec.709 lim), view_transform: ACES 1.1 - SDR Video (Rec.709 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim), view_transform: ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (2000 nits & Rec.2020 lim), view_transform: ACES 1.1 - HDR Video (2000 nits & Rec.2020 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (4000 nits & Rec.2020 lim), view_transform: ACES 1.1 - HDR Video (4000 nits & Rec.2020 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (1000 nits & P3 lim), view_transform: ACES 1.1 - HDR Video (1000 nits & P3 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (2000 nits & P3 lim), view_transform: ACES 1.1 - HDR Video (2000 nits & P3 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Video (4000 nits & P3 lim), view_transform: ACES 1.1 - HDR Video (4000 nits & P3 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.0 - SDR Cinema, view_transform: ACES 1.0 - SDR Cinema, display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - SDR Cinema (D60 sim on D65), view_transform: ACES 1.1 - SDR Cinema (D60 sim on D65), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - SDR Cinema (Rec.709 lim), view_transform: ACES 1.1 - SDR Cinema (Rec.709 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.0 - SDR Cinema (D60 sim on DCI), view_transform: ACES 1.0 - SDR Cinema (D60 sim on DCI), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - SDR Cinema (D65 sim on DCI), view_transform: ACES 1.1 - SDR Cinema (D65 sim on DCI), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: ACES 1.1 - HDR Cinema (108 nits & P3 lim), view_transform: ACES 1.1 - HDR Cinema (108 nits & P3 lim), display_colorspace: <USE_DISPLAY_NAME>}\n  - !<View> {name: Un-tone-mapped, view_transform: Un-tone-mapped, display_colorspace: <USE_DISPLAY_NAME>}\n\ndisplays:\n  sRGB - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Video, ACES 1.0 - SDR Video (D60 sim on D65), Un-tone-mapped]\n  Rec.1886 Rec.709 - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Video, ACES 1.0 - SDR Video (D60 sim on D65), Un-tone-mapped]\n  Rec.1886 Rec.2020 - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Video, ACES 1.1 - SDR Video (P3 lim), ACES 1.1 - SDR Video (Rec.709 lim), Un-tone-mapped]\n  Rec.2100-HLG - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim), Un-tone-mapped]\n  Rec.2100-PQ - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim), ACES 1.1 - HDR Video (2000 nits & Rec.2020 lim), ACES 1.1 - HDR Video (4000 nits & Rec.2020 lim), Un-tone-mapped]\n  ST2084-P3-D65 - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.1 - HDR Video (1000 nits & P3 lim), ACES 1.1 - HDR Video (2000 nits & P3 lim), ACES 1.1 - HDR Video (4000 nits & P3 lim), ACES 1.1 - HDR Cinema (108 nits & P3 lim), Un-tone-mapped]\n  P3-D60 - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Cinema, Un-tone-mapped]\n  P3-D65 - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Cinema, ACES 1.1 - SDR Cinema (D60 sim on D65), ACES 1.1 - SDR Cinema (Rec.709 lim), Un-tone-mapped]\n  P3-DCI - Display:\n    - !<View> {name: Raw, colorspace: Raw}\n    - !<Views> [ACES 1.0 - SDR Cinema (D60 sim on DCI), ACES 1.1 - SDR Cinema (D65 sim on DCI), Un-tone-mapped]\n\nactive_displays: [sRGB - Display, Rec.1886 Rec.709 - Display, Rec.1886 Rec.2020 - Display, Rec.2100-HLG - Display, Rec.2100-PQ - Display, ST2084-P3-D65 - Display, P3-D60 - Display, P3-D65 - Display, P3-DCI - Display]\nactive_views: [ACES 1.0 - SDR Video, ACES 1.0 - SDR Video (D60 sim on D65), ACES 1.1 - SDR Video (P3 lim), ACES 1.1 - SDR Video (Rec.709 lim), ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim), ACES 1.1 - HDR Video (2000 nits & Rec.2020 lim), ACES 1.1 - HDR Video (4000 nits & Rec.2020 lim), ACES 1.1 - HDR Video (1000 nits & P3 lim), ACES 1.1 - HDR Video (2000 nits & P3 lim), ACES 1.1 - HDR Video (4000 nits & P3 lim), ACES 1.0 - SDR Cinema, ACES 1.1 - SDR Cinema (D60 sim on D65), ACES 1.1 - SDR Cinema (Rec.709 lim), ACES 1.0 - SDR Cinema (D60 sim on DCI), ACES 1.1 - SDR Cinema (D65 sim on DCI), ACES 1.1 - HDR Cinema (108 nits & P3 lim), Un-tone-mapped, Raw]\ninactive_colorspaces: [CIE-XYZ-D65, sRGB - Display, Rec.1886 Rec.709 - Display, Rec.1886 Rec.2020 - Display, sRGB - Display, Rec.1886 Rec.709 - Display, Rec.1886 Rec.2020 - Display, Rec.1886 Rec.2020 - Display, Rec.2100-HLG - Display, Rec.2100-PQ - Display, Rec.2100-PQ - Display, Rec.2100-PQ - Display, ST2084-P3-D65 - Display, ST2084-P3-D65 - Display, ST2084-P3-D65 - Display, P3-D60 - Display, P3-D65 - Display, P3-D65 - Display, P3-D65 - Display, P3-DCI - Display, P3-DCI - Display, ST2084-P3-D65 - Display]\n\nlooks:\n  - !<Look>\n    name: ACES 1.3 Reference Gamut Compression\n    process_space: ACES2065-1\n    description: |\n      LMT (applied in ACES2065-1) to compress scene-referred values from common cameras into the AP1 gamut\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:LMT.Academy.GamutCompress.a1.3.0\n    transform: !<BuiltinTransform> {style: ACES-LMT - ACES 1.3 Reference Gamut Compression}\n\n\ndefault_view_transform: Un-tone-mapped\n\nview_transforms:\n  - !<ViewTransform>\n    name: ACES 1.0 - SDR Video\n    description: |\n      Component of ACES Output Transforms for SDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.RGBmonitor_100nits_dim.a1.0.3\n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.Rec709_100nits_dim.a1.0.3\n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.Rec2020_100nits_dim.a1.0.3\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO_1.0}\n\n  - !<ViewTransform>\n    name: ACES 1.0 - SDR Video (D60 sim on D65)\n    description: |\n      Component of ACES Output Transforms for SDR D65 video simulating D60 white\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.RGBmonitor_D60sim_100nits_dim.a1.0.3\n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.Rec709_D60sim_100nits_dim.a1.0.3\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-D60sim-D65_1.0}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - SDR Video (P3 lim)\n    description: |\n      Component of ACES Output Transforms for SDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.Rec2020_P3D65limited_100nits_dim.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-P3lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - SDR Video (Rec.709 lim)\n    description: |\n      Component of ACES Output Transforms for SDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.Rec2020_Rec709limited_100nits_dim.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (1000 nits & Rec.2020 lim)\n    description: |\n      Component of ACES Output Transforms for 1000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.Rec2020_1000nits_15nits_HLG.a1.1.0\n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.Rec2020_1000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-REC2020lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (2000 nits & Rec.2020 lim)\n    description: |\n      Component of ACES Output Transforms for 2000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.Rec2020_2000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-REC2020lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (4000 nits & Rec.2020 lim)\n    description: |\n      Component of ACES Output Transforms for 4000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.Rec2020_4000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-REC2020lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (1000 nits & P3 lim)\n    description: |\n      Component of ACES Output Transforms for 1000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.P3D65_1000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-P3lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (2000 nits & P3 lim)\n    description: |\n      Component of ACES Output Transforms for 2000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.P3D65_2000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-P3lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Video (4000 nits & P3 lim)\n    description: |\n      Component of ACES Output Transforms for 4000 nit HDR D65 video\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.P3D65_4000nits_15nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-P3lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.0 - SDR Cinema\n    description: |\n      Component of ACES Output Transforms for SDR cinema\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3D60_48nits.a1.0.3\n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3D65_48nits.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA_1.0}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - SDR Cinema (D60 sim on D65)\n    description: |\n      Component of ACES Output Transforms for SDR D65 cinema simulating D60 white\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3D65_D60sim_48nits.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-D65_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - SDR Cinema (Rec.709 lim)\n    description: |\n      Component of ACES Output Transforms for SDR cinema\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3D65_Rec709limited_48nits.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-REC709lim_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.0 - SDR Cinema (D60 sim on DCI)\n    description: |\n      Component of ACES Output Transforms for SDR DCI cinema simulating D60 white\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3DCI_48nits.a1.0.3\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-DCI_1.0}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - SDR Cinema (D65 sim on DCI)\n    description: |\n      Component of ACES Output Transforms for SDR DCI cinema simulating D65 white\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ODT.Academy.P3DCI_D65sim_48nits.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D65sim-DCI_1.1}\n\n  - !<ViewTransform>\n    name: ACES 1.1 - HDR Cinema (108 nits & P3 lim)\n    description: |\n      Component of ACES Output Transforms for 108 nit HDR D65 cinema\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:RRTODT.Academy.P3D65_108nits_7point2nits_ST2084.a1.1.0\n    from_scene_reference: !<BuiltinTransform> {style: ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1}\n\n  - !<ViewTransform>\n    name: Un-tone-mapped\n    from_scene_reference: !<BuiltinTransform> {style: UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD}\n\ndisplay_colorspaces:\n  - !<ColorSpace>\n    name: CIE-XYZ-D65\n    aliases: [cie_xyz_d65]\n    family: \"\"\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: The \"CIE XYZ (D65)\" display connection colorspace.\n    isdata: false\n    allocation: uniform\n\n  - !<ColorSpace>\n    name: sRGB - Display\n    aliases: [srgb_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to sRGB (piecewise EOTF)\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_sRGB}\n\n  - !<ColorSpace>\n    name: Rec.1886 Rec.709 - Display\n    aliases: [rec1886_rec709_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Rec.1886/Rec.709 (HD video)\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.709}\n\n  - !<ColorSpace>\n    name: Rec.1886 Rec.2020 - Display\n    aliases: [rec1886_rec2020_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Rec.1886/Rec.2020 (UHD video)\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.2020}\n\n  - !<ColorSpace>\n    name: Rec.2100-HLG - Display\n    aliases: [rec2100_hlg_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Rec.2100-HLG, 1000 nit\n    isdata: false\n    categories: [file-io]\n    encoding: hdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_REC.2100-HLG-1000nit}\n\n  - !<ColorSpace>\n    name: Rec.2100-PQ - Display\n    aliases: [rec2100_pq_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Rec.2100-PQ\n    isdata: false\n    categories: [file-io]\n    encoding: hdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ}\n\n  - !<ColorSpace>\n    name: ST2084-P3-D65 - Display\n    aliases: [st2084_p3d65_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to ST-2084 (PQ), P3-D65 primaries\n    isdata: false\n    categories: [file-io]\n    encoding: hdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_ST2084-P3-D65}\n\n  - !<ColorSpace>\n    name: P3-D60 - Display\n    aliases: [p3d60_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D60 (Bradford adaptation)\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D60-BFD}\n\n  - !<ColorSpace>\n    name: P3-D65 - Display\n    aliases: [p3d65_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D65\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65}\n\n  - !<ColorSpace>\n    name: P3-DCI - Display\n    aliases: [p3_dci_display]\n    family: Display\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert CIE XYZ (D65 white) to Gamma 2.6, P3-DCI (DCI white with Bradford adaptation)\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_display_reference: !<BuiltinTransform> {style: DISPLAY - CIE-XYZ-D65_to_G2.6-P3-DCI-BFD}\n\ncolorspaces:\n  - !<ColorSpace>\n    name: ACES2065-1\n    aliases: [aces2065_1, ACES - ACES2065-1, lin_ap0]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: The \"Academy Color Encoding System\" reference colorspace.\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n\n  - !<ColorSpace>\n    name: ACEScc\n    aliases: [ACES - ACEScc, acescc_ap1]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACEScc to ACES2065-1\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScc_to_ACES.a1.0.3\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: ACEScc_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: ACEScct\n    aliases: [ACES - ACEScct, acescct_ap1]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACEScct to ACES2065-1\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScct_to_ACES.a1.0.3\n    isdata: false\n    categories: [file-io, working-space]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: ACEScct_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: ACEScg\n    aliases: [ACES - ACEScg, lin_ap1]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACEScg to ACES2065-1\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScg_to_ACES.a1.0.3\n    isdata: false\n    categories: [file-io, working-space]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: ACEScg_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: ADX10\n    aliases: [Input - ADX - ADX10]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ADX10 to ACES2065-1\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ADX10_to_ACES.a1.0.3\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: ADX10_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: ADX16\n    aliases: [Input - ADX - ADX16]\n    family: ACES\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ADX16 to ACES2065-1\n      \n      ACEStransformID: urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ADX16_to_ACES.a1.0.3\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: ADX16_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: Linear ARRI Wide Gamut 3\n    aliases: [lin_arri_wide_gamut_3, Input - ARRI - Linear - ALEXA Wide Gamut, lin_alexawide]\n    family: Input/ARRI\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear ARRI Wide Gamut 3 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:Linear_ARRI_Wide_Gamut_3_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear ARRI Wide Gamut 3 to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.680205505106279, 0.236136601606481, 0.0836578932872399, 0, 0.0854149797421404, 1.01747087860704, -0.102885858349182, 0, 0.00205652166929683, -0.0625625003847921, 1.0605059787155, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: ARRI LogC3 (EI800)\n    aliases: [arri_logc3_ei800, Input - ARRI - V3 LogC (EI800) - Wide Gamut, logc3ei800_alexawide]\n    family: Input/ARRI\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ARRI LogC3 (EI800) to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:ARRI_LogC3_EI800_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: ARRI LogC3 (EI800) to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.247189638318671, log_side_offset: 0.385536998692443, lin_side_slope: 5.55555555555556, lin_side_offset: 0.0522722750251688, lin_side_break: 0.0105909904954696, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.680205505106279, 0.236136601606481, 0.0836578932872399, 0, 0.0854149797421404, 1.01747087860704, -0.102885858349182, 0, 0.00205652166929683, -0.0625625003847921, 1.0605059787155, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear ARRI Wide Gamut 4\n    aliases: [lin_arri_wide_gamut_4, lin_awg4]\n    family: Input/ARRI\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear ARRI Wide Gamut 4 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:Linear_ARRI_Wide_Gamut_4_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear ARRI Wide Gamut 4 to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.750957362824734, 0.144422786709757, 0.104619850465509, 0, 0.000821837079380207, 1.007397584885, -0.00821942196438358, 0, -0.000499952143533471, -0.000854177231436971, 1.00135412937497, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: ARRI LogC4\n    aliases: [arri_logc4]\n    family: Input/ARRI\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ARRI LogC4 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:ARRI_LogC4_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: ARRI LogC4 to ACES2065-1\n      children:\n        - !<LogCameraTransform> {log_side_slope: 0.0647954196341293, log_side_offset: -0.295908392682586, lin_side_slope: 2231.82630906769, lin_side_offset: 64, lin_side_break: -0.0180569961199113, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.750957362824734, 0.144422786709757, 0.104619850465509, 0, 0.000821837079380207, 1.007397584885, -0.00821942196438358, 0, -0.000499952143533471, -0.000854177231436971, 1.00135412937497, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: BMDFilm WideGamut Gen5\n    aliases: [bmdfilm_widegamut_gen5]\n    family: Input/BlackmagicDesign\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Blackmagic Film Wide Gamut (Gen 5) to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:BMDFilm_WideGamut_Gen5_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Blackmagic Film Wide Gamut (Gen 5) to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 2.71828182845905, log_side_slope: 0.0869287606549122, log_side_offset: 0.530013339229194, lin_side_offset: 0.00549407243225781, lin_side_break: 0.005, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.647091325580708, 0.242595385134207, 0.110313289285085, 0, 0.0651915997328519, 1.02504756760476, -0.0902391673376125, 0, -0.0275570729194699, -0.0805887097177784, 1.10814578263725, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: DaVinci Intermediate WideGamut\n    aliases: [davinci_intermediate_widegamut]\n    family: Input/BlackmagicDesign\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert DaVinci Intermediate Wide Gamut to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:DaVinci_Intermediate_WideGamut_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: DaVinci Intermediate Wide Gamut to ACES2065-1\n      children:\n        - !<LogCameraTransform> {log_side_slope: 0.07329248, log_side_offset: 0.51304736, lin_side_offset: 0.0075, lin_side_break: 0.00262409, linear_slope: 10.44426855, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.748270290272981, 0.167694659554328, 0.0840350501726906, 0, 0.0208421234689102, 1.11190474268894, -0.132746866157851, 0, -0.0915122574225729, -0.127746712807307, 1.21925897022988, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear BMD WideGamut Gen5\n    aliases: [lin_bmd_widegamut_gen5]\n    family: Input/BlackmagicDesign\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear Blackmagic Wide Gamut (Gen 5) to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:Linear_BMD_WideGamut_Gen5_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear Blackmagic Wide Gamut (Gen 5) to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.647091325580708, 0.242595385134207, 0.110313289285085, 0, 0.0651915997328519, 1.02504756760476, -0.0902391673376125, 0, -0.0275570729194699, -0.0805887097177784, 1.10814578263725, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear DaVinci WideGamut\n    aliases: [lin_davinci_widegamut]\n    family: Input/BlackmagicDesign\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear DaVinci Wide Gamut to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:Linear_DaVinci_WideGamut_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear DaVinci Wide Gamut to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.748270290272981, 0.167694659554328, 0.0840350501726906, 0, 0.0208421234689102, 1.11190474268894, -0.132746866157851, 0, -0.0915122574225729, -0.127746712807307, 1.21925897022988, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: CanonLog3 CinemaGamut D55\n    aliases: [canonlog3_cinemagamut_d55, Input - Canon - Canon-Log3 - Cinema Gamut Daylight, canonlog3_cgamutday]\n    family: Input/Canon\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: Convert Canon Log 3 Cinema Gamut to ACES2065-1\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<BuiltinTransform> {style: CANON_CLOG3-CGAMUT_to_ACES2065-1}\n\n  - !<ColorSpace>\n    name: Linear CinemaGamut D55\n    aliases: [lin_cinemagamut_d55, Input - Canon - Linear - Canon Cinema Gamut Daylight, lin_canoncgamutday]\n    family: Input/Canon\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear Canon Cinema Gamut (Daylight) to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Canon:Input:Linear-CinemaGamut-D55_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear Canon Cinema Gamut (Daylight) to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.763064454775734, 0.14902116113706, 0.0879143840872056, 0, 0.00365745670512393, 1.10696038037622, -0.110617837081339, 0, -0.0094077940457189, -0.218383304989987, 1.22779109903571, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear V-Gamut\n    aliases: [lin_vgamut, Input - Panasonic - Linear - V-Gamut]\n    family: Input/Panasonic\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear Panasonic V-Gamut to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Panasonic:Input:Linear_VGamut_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear Panasonic V-Gamut to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.72461670413153, 0.166915288193706, 0.108468007674764, 0, 0.021390245413146, 0.984908155703054, -0.00629840111620089, 0, -0.00923556287076561, -0.00105690563900513, 1.01029246850977, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: V-Log V-Gamut\n    aliases: [vlog_vgamut, Input - Panasonic - V-Log - V-Gamut]\n    family: Input/Panasonic\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Panasonic V-Log - V-Gamut to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Panasonic:Input:VLog_VGamut_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Panasonic V-Log - V-Gamut to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.241514, log_side_offset: 0.598206, lin_side_offset: 0.00873, lin_side_break: 0.01, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.72461670413153, 0.166915288193706, 0.108468007674764, 0, 0.021390245413146, 0.984908155703054, -0.00629840111620089, 0, -0.00923556287076561, -0.00105690563900513, 1.01029246850977, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear REDWideGamutRGB\n    aliases: [lin_redwidegamutrgb, Input - RED - Linear - REDWideGamutRGB, lin_rwg]\n    family: Input/RED\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear REDWideGamutRGB to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:RED:Input:Linear_REDWideGamutRGB_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear REDWideGamutRGB to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.785058804068092, 0.0838587565440846, 0.131082439387823, 0, 0.0231738348454756, 1.08789754919233, -0.111071384037806, 0, -0.0737604353682082, -0.314590072290208, 1.38835050765842, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Log3G10 REDWideGamutRGB\n    aliases: [log3g10_redwidegamutrgb, Input - RED - REDLog3G10 - REDWideGamutRGB, rl3g10_rwg]\n    family: Input/RED\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert RED Log3G10 REDWideGamutRGB to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:RED:Input:Log3G10_REDWideGamutRGB_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: RED Log3G10 REDWideGamutRGB to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.224282, lin_side_slope: 155.975327, lin_side_offset: 2.55975327, lin_side_break: -0.01, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.785058804068092, 0.0838587565440846, 0.131082439387823, 0, 0.0231738348454756, 1.08789754919233, -0.111071384037806, 0, -0.0737604353682082, -0.314590072290208, 1.38835050765842, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear S-Gamut3\n    aliases: [lin_sgamut3, Input - Sony - Linear - S-Gamut3]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear S-Gamut3 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:Linear_SGamut3_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear S-Gamut3 to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.75298259539984, 0.143370216235557, 0.103647188364603, 0, 0.0217076974414429, 1.01531883550528, -0.0370265329467195, 0, -0.00941605274963355, 0.00337041785882367, 1.00604563489081, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear S-Gamut3.Cine\n    aliases: [lin_sgamut3cine, Input - Sony - Linear - S-Gamut3.Cine]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear S-Gamut3.Cine to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:Linear_SGamut3Cine_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear S-Gamut3.Cine to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.638788667185978, 0.272351433711262, 0.0888598991027595, 0, -0.00391590602528224, 1.0880732308974, -0.0841573248721177, 0, -0.0299072021239151, -0.0264325799101947, 1.05633978203411, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear Venice S-Gamut3\n    aliases: [lin_venice_sgamut3, Input - Sony - Linear - Venice S-Gamut3]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear Venice S-Gamut3 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:Linear_Venice_SGamut3_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear Venice S-Gamut3 to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.793329741146434, 0.0890786256206771, 0.117591633232888, 0, 0.0155810585252582, 1.03271230692988, -0.0482933654551394, 0, -0.0188647477991488, 0.0127694120973433, 1.0060953357018, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear Venice S-Gamut3.Cine\n    aliases: [lin_venice_sgamut3cine, Input - Sony - Linear - Venice S-Gamut3.Cine]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Linear Venice S-Gamut3.Cine to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:Linear_Venice_SGamut3Cine_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Linear Venice S-Gamut3.Cine to ACES2065-1\n      children:\n        - !<MatrixTransform> {matrix: [0.674257092126512, 0.220571735923397, 0.10517117195009, 0, -0.00931360607857167, 1.10595886142466, -0.0966452553460855, 0, -0.0382090673002312, -0.017938376600236, 1.05614744390047, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: S-Log3 S-Gamut3\n    aliases: [slog3_sgamut3, Input - Sony - S-Log3 - S-Gamut3]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Sony S-Log3 S-Gamut3 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:SLog3_SGamut3_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Sony S-Log3 S-Gamut3 to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.255620723362659, log_side_offset: 0.410557184750733, lin_side_slope: 5.26315789473684, lin_side_offset: 0.0526315789473684, lin_side_break: 0.01125, linear_slope: 6.62194371177582, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.75298259539984, 0.143370216235557, 0.103647188364603, 0, 0.0217076974414429, 1.01531883550528, -0.0370265329467195, 0, -0.00941605274963355, 0.00337041785882367, 1.00604563489081, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: S-Log3 S-Gamut3.Cine\n    aliases: [slog3_sgamut3cine, Input - Sony - S-Log3 - S-Gamut3.Cine, slog3_sgamutcine]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Sony S-Log3 S-Gamut3.Cine to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:SLog3_SGamut3Cine_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Sony S-Log3 S-Gamut3.Cine to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.255620723362659, log_side_offset: 0.410557184750733, lin_side_slope: 5.26315789473684, lin_side_offset: 0.0526315789473684, lin_side_break: 0.01125, linear_slope: 6.62194371177582, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.638788667185978, 0.272351433711262, 0.0888598991027595, 0, -0.00391590602528224, 1.0880732308974, -0.0841573248721177, 0, -0.0299072021239151, -0.0264325799101947, 1.05633978203411, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: S-Log3 Venice S-Gamut3\n    aliases: [slog3_venice_sgamut3, Input - Sony - S-Log3 - Venice S-Gamut3]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Sony S-Log3 Venice S-Gamut3 to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:SLog3_Venice_SGamut3_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Sony S-Log3 Venice S-Gamut3 to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.255620723362659, log_side_offset: 0.410557184750733, lin_side_slope: 5.26315789473684, lin_side_offset: 0.0526315789473684, lin_side_break: 0.01125, linear_slope: 6.62194371177582, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.793329741146434, 0.089078625620677, 0.117591633232888, 0, 0.0155810585252582, 1.03271230692988, -0.0482933654551394, 0, -0.0188647477991488, 0.0127694120973433, 1.00609533570181, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: S-Log3 Venice S-Gamut3.Cine\n    aliases: [slog3_venice_sgamut3cine, Input - Sony - S-Log3 - Venice S-Gamut3.Cine, slog3_venice_sgamutcine]\n    family: Input/Sony\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert Sony S-Log3 Venice S-Gamut3.Cine to ACES2065-1\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:SLog3_Venice_SGamut3Cine_to_ACES2065-1:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: log\n    allocation: uniform\n    to_scene_reference: !<GroupTransform>\n      name: Sony S-Log3 Venice S-Gamut3.Cine to ACES2065-1\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.255620723362659, log_side_offset: 0.410557184750733, lin_side_slope: 5.26315789473684, lin_side_offset: 0.0526315789473684, lin_side_break: 0.01125, linear_slope: 6.62194371177582, direction: inverse}\n        - !<MatrixTransform> {matrix: [0.674257092126512, 0.220571735923397, 0.10517117195009, 0, -0.00931360607857167, 1.10595886142466, -0.0966452553460855, 0, -0.0382090673002312, -0.017938376600236, 1.05614744390047, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Camera Rec.709\n    aliases: [camera_rec709, Utility - Rec.709 - Camera, rec709_camera]\n    family: Utility/ITU\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to Rec.709 camera OETF Rec.709 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ITU:Utility:AP0_to_Camera_Rec709:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Camera Rec.709\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n        - !<ExponentWithLinearTransform> {gamma: 2.22222222222222, offset: 0.099, direction: inverse}\n\n  - !<ColorSpace>\n    name: Linear P3-D65\n    aliases: [lin_p3d65, Utility - Linear - P3-D65]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to linear P3 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Linear_P3-D65:1.0\n    isdata: false\n    categories: [file-io, working-space]\n    encoding: scene-linear\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Linear P3-D65\n      children:\n        - !<MatrixTransform> {matrix: [2.02490528596679, -0.689069761034766, -0.335835524932019, 0, -0.183597032256178, 1.28950620775902, -0.105909175502841, 0, 0.00905856112234766, -0.0592796840575522, 1.0502211229352, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear Rec.2020\n    aliases: [lin_rec2020, Utility - Linear - Rec.2020]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to linear Rec.2020 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Linear_Rec2020:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: scene-linear\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Linear Rec.2020\n      children:\n        - !<MatrixTransform> {matrix: [1.49040952054172, -0.26617091926613, -0.224238601275593, 0, -0.0801674998722558, 1.18216712109757, -0.10199962122531, 0, 0.00322763119162216, -0.0347764757450576, 1.03154884455344, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Linear Rec.709 (sRGB)\n    aliases: [lin_rec709_srgb, Utility - Linear - Rec.709, lin_rec709, lin_srgb, Utility - Linear - sRGB]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to linear Rec.709 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Linear_Rec709:1.0\n    isdata: false\n    categories: [file-io, working-space]\n    encoding: scene-linear\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Linear Rec.709 (sRGB)\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n\n  - !<ColorSpace>\n    name: Gamma 1.8 Rec.709 - Texture\n    aliases: [g18_rec709_tx, Utility - Gamma 1.8 - Rec.709 - Texture, g18_rec709]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to 1.8 gamma-corrected Rec.709 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Gamma1.8_Rec709-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Gamma 1.8 Rec.709 - Texture\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n        - !<ExponentTransform> {value: 1.8, style: pass_thru, direction: inverse}\n\n  - !<ColorSpace>\n    name: Gamma 2.2 AP1 - Texture\n    aliases: [g22_ap1_tx, g22_ap1]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to 2.2 gamma-corrected AP1 primaries, D60 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Gamma2.2_AP1-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Gamma 2.2 AP1 - Texture\n      children:\n        - !<MatrixTransform> {matrix: [1.45143931614567, -0.23651074689374, -0.214928569251925, 0, -0.0765537733960206, 1.17622969983357, -0.0996759264375522, 0, 0.00831614842569772, -0.00603244979102102, 0.997716301365323, 0, 0, 0, 0, 1]}\n        - !<ExponentTransform> {value: 2.2, style: pass_thru, direction: inverse}\n\n  - !<ColorSpace>\n    name: Gamma 2.2 Rec.709 - Texture\n    aliases: [g22_rec709_tx, Utility - Gamma 2.2 - Rec.709 - Texture, g22_rec709]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to 2.2 gamma-corrected Rec.709 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Gamma2.2_Rec709-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Gamma 2.2 Rec.709 - Texture\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n        - !<ExponentTransform> {value: 2.2, style: pass_thru, direction: inverse}\n\n  - !<ColorSpace>\n    name: Gamma 2.4 Rec.709 - Texture\n    aliases: [g24_rec709_tx, g24_rec709, rec709_display, Utility - Rec.709 - Display]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to 2.4 gamma-corrected Rec.709 primaries, D65 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_Gamma2.4_Rec709-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to Gamma 2.4 Rec.709 - Texture\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n        - !<ExponentTransform> {value: 2.4, style: pass_thru, direction: inverse}\n\n  - !<ColorSpace>\n    name: sRGB Encoded AP1 - Texture\n    aliases: [srgb_encoded_ap1_tx, srgb_ap1]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to sRGB Encoded AP1 primaries, D60 white point\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_sRGB_Encoded_AP1-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    encoding: sdr-video\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to sRGB Encoded AP1 - Texture\n      children:\n        - !<MatrixTransform> {matrix: [1.45143931614567, -0.23651074689374, -0.214928569251925, 0, -0.0765537733960206, 1.17622969983357, -0.0996759264375522, 0, 0.00831614842569772, -0.00603244979102102, 0.997716301365323, 0, 0, 0, 0, 1]}\n        - !<ExponentWithLinearTransform> {gamma: 2.4, offset: 0.055, direction: inverse}\n\n  - !<ColorSpace>\n    name: sRGB - Texture\n    aliases: [srgb_tx, Utility - sRGB - Texture, srgb_texture, Input - Generic - sRGB - Texture]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: |\n      Convert ACES2065-1 to sRGB\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:AP0_to_sRGB-Texture:1.0\n    isdata: false\n    categories: [file-io]\n    allocation: uniform\n    from_scene_reference: !<GroupTransform>\n      name: AP0 to sRGB Rec.709\n      children:\n        - !<MatrixTransform> {matrix: [2.52168618674388, -1.13413098823972, -0.387555198504164, 0, -0.276479914229922, 1.37271908766826, -0.096239173438334, 0, -0.0153780649660342, -0.152975335867399, 1.16835340083343, 0, 0, 0, 0, 1]}\n        - !<ExponentWithLinearTransform> {gamma: 2.4, offset: 0.055, direction: inverse}\n\n  - !<ColorSpace>\n    name: Raw\n    aliases: [Utility - Raw]\n    family: Utility\n    equalitygroup: \"\"\n    bitdepth: 32f\n    description: The utility \"Raw\" colorspace.\n    isdata: true\n    categories: [file-io]\n    allocation: uniform\n\nnamed_transforms:\n  - !<NamedTransform>\n    name: ARRI LogC3 - Curve (EI800)\n    aliases: [arri_logc3_crv_ei800, Input - ARRI - Curve - V3 LogC (EI800), crv_logc3ei800]\n    description: |\n      Convert ARRI LogC3 Curve (EI800) to Relative Scene Linear\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:ARRI_LogC3_Curve_EI800_to_Linear:1.0\n    family: Input/ARRI\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: ARRI LogC3 Curve (EI800) to Relative Scene Linear\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.247189638318671, log_side_offset: 0.385536998692443, lin_side_slope: 5.55555555555556, lin_side_offset: 0.0522722750251688, lin_side_break: 0.0105909904954696, direction: inverse}\n\n  - !<NamedTransform>\n    name: ARRI LogC4 - Curve\n    aliases: [arri_logc4_crv]\n    description: |\n      Convert ARRI LogC4 Curve to Relative Scene Linear\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ARRI:Input:ARRI_LogC4_Curve_to_Linear:1.0\n    family: Input/ARRI\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: ARRI LogC4 Curve to Relative Scene Linear\n      children:\n        - !<LogCameraTransform> {log_side_slope: 0.0647954196341293, log_side_offset: -0.295908392682586, lin_side_slope: 2231.82630906769, lin_side_offset: 64, lin_side_break: -0.0180569961199113, direction: inverse}\n\n  - !<NamedTransform>\n    name: BMDFilm Gen5 Log - Curve\n    aliases: [bmdfilm_gen5_log_crv]\n    description: |\n      Convert Blackmagic Film (Gen 5) Log to Blackmagic Film (Gen 5) Linear\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:BMDFilm_Gen5_Log-Curve_to_Linear:1.0\n    family: Input/BlackmagicDesign\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: Blackmagic Film (Gen 5) Log to Linear Curve\n      children:\n        - !<LogCameraTransform> {base: 2.71828182845905, log_side_slope: 0.0869287606549122, log_side_offset: 0.530013339229194, lin_side_offset: 0.00549407243225781, lin_side_break: 0.005, direction: inverse}\n\n  - !<NamedTransform>\n    name: DaVinci Intermediate Log - Curve\n    aliases: [davinci_intermediate_log_crv]\n    description: |\n      Convert DaVinci Intermediate Log to DaVinci Intermediate Linear\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:BlackmagicDesign:Input:DaVinci_Intermediate_Log-Curve_to_Linear:1.0\n    family: Input/BlackmagicDesign\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: DaVinci Intermediate Log to Linear Curve\n      children:\n        - !<LogCameraTransform> {log_side_slope: 0.07329248, log_side_offset: 0.51304736, lin_side_offset: 0.0075, lin_side_break: 0.00262409, linear_slope: 10.44426855, direction: inverse}\n\n  - !<NamedTransform>\n    name: V-Log - Curve\n    aliases: [vlog_crv, Input - Panasonic - Curve - V-Log, crv_vlog]\n    description: |\n      Convert Panasonic V-Log Log (arbitrary primaries) to Panasonic V-Log Linear (arbitrary primaries)\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Panasonic:Input:VLog-Curve_to_Linear:1.0\n    family: Input/Panasonic\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: Panasonic V-Log Log to Linear Curve\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.241514, log_side_offset: 0.598206, lin_side_offset: 0.00873, lin_side_break: 0.01, direction: inverse}\n\n  - !<NamedTransform>\n    name: Log3G10 - Curve\n    aliases: [log3g10_crv, Input - RED - Curve - REDLog3G10, crv_rl3g10]\n    description: |\n      Convert RED Log3G10 Log (arbitrary primaries) to RED Log3G10 Linear (arbitrary primaries)\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:RED:Input:Log3G10-Curve_to_Linear:1.0\n    family: Input/RED\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: RED Log3G10 Log to Linear Curve\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.224282, lin_side_slope: 155.975327, lin_side_offset: 2.55975327, lin_side_break: -0.01, direction: inverse}\n\n  - !<NamedTransform>\n    name: S-Log3 - Curve\n    aliases: [slog3_crv, Input - Sony - Curve - S-Log3, crv_slog3]\n    description: |\n      Convert S-Log3 Log (arbitrary primaries) to S-Log3 Linear (arbitrary primaries)\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:Sony:Input:SLog3-Curve_to_Linear:1.0\n    family: Input/Sony\n    categories: [file-io]\n    encoding: log\n    transform: !<GroupTransform>\n      name: S-Log3 Log to Linear Curve\n      children:\n        - !<LogCameraTransform> {base: 10, log_side_slope: 0.255620723362659, log_side_offset: 0.410557184750733, lin_side_slope: 5.26315789473684, lin_side_offset: 0.0526315789473684, lin_side_break: 0.01125, linear_slope: 6.62194371177582, direction: inverse}\n\n  - !<NamedTransform>\n    name: Rec.1886 - Curve\n    aliases: [rec1886_crv, Utility - Curve - Rec.1886, crv_rec1886]\n    description: |\n      Convert generic linear RGB to generic gamma-corrected RGB\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:Linear_to_Rec1886-Curve:1.0\n    family: Utility\n    categories: [file-io]\n    encoding: sdr-video\n    inverse_transform: !<GroupTransform>\n      name: Linear to Rec.1886\n      children:\n        - !<ExponentTransform> {value: 2.4, style: pass_thru, direction: inverse}\n\n  - !<NamedTransform>\n    name: Rec.709 - Curve\n    aliases: [rec709_crv, Utility - Curve - Rec.709, crv_rec709]\n    description: |\n      Convert generic linear RGB to generic gamma-corrected RGB\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:ITU:Utility:Linear_to_Rec709-Curve:1.0\n    family: Utility/ITU\n    categories: [file-io]\n    encoding: sdr-video\n    inverse_transform: !<GroupTransform>\n      name: Linear to Rec.709\n      children:\n        - !<ExponentWithLinearTransform> {gamma: 2.22222222222222, offset: 0.099, direction: inverse}\n\n  - !<NamedTransform>\n    name: sRGB - Curve\n    aliases: [srgb_crv, Utility - Curve - sRGB, crv_srgb]\n    description: |\n      Convert generic linear RGB to generic gamma-corrected RGB\n      \n      CLFtransformID: urn:aswf:ocio:transformId:1.0:OCIO:Utility:Linear_to_sRGB-Curve:1.0\n    family: Utility\n    categories: [file-io]\n    encoding: sdr-video\n    inverse_transform: !<GroupTransform>\n      name: Linear to sRGB\n      children:\n        - !<ExponentWithLinearTransform> {gamma: 2.4, offset: 0.055, direction: inverse}\n\n  - !<NamedTransform>\n    name: ST-2084 - Curve\n    aliases: [st_2084_crv]\n    description: Convert linear nits/100 to SMPTE ST-2084 (PQ) full-range\n    family: Utility\n    categories: [file-io]\n    encoding: hdr-video\n    inverse_transform: !<BuiltinTransform> {style: CURVE - LINEAR_to_ST-2084}\n"
  }
]