pixi-effects 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +5 -5
- package/ai/chat-template.html +3 -3
- package/ai/tools/check.mjs +117 -2
- package/ai/tools/lookup.mjs +1 -0
- package/dist/Composition-NSY7A32Y.js +7 -0
- package/dist/{Composition-YGBQX3HZ.js.map → Composition-NSY7A32Y.js.map} +1 -1
- package/dist/Composition-PME3P5LP.cjs +16 -0
- package/dist/{Composition-N6BOROJ2.cjs.map → Composition-PME3P5LP.cjs.map} +1 -1
- package/dist/Controller.d.cts +2 -2
- package/dist/Controller.d.ts +2 -2
- package/dist/{Movie-B3VOAgwc.d.cts → Movie-BqrAWN0g.d.cts} +13 -1
- package/dist/{Movie-CQCVUqRs.d.ts → Movie-sV8nJr_f.d.ts} +13 -1
- package/dist/{Spans-XTIWYSNO.cjs → Spans-2TZCNREQ.cjs} +9 -9
- package/dist/{Spans-XTIWYSNO.cjs.map → Spans-2TZCNREQ.cjs.map} +1 -1
- package/dist/{Spans-6L2ZVECX.js → Spans-TESJPQKX.js} +4 -4
- package/dist/{Spans-6L2ZVECX.js.map → Spans-TESJPQKX.js.map} +1 -1
- package/dist/{chunk-4MBTYREC.js → chunk-2E74SP63.js} +72 -17
- package/dist/chunk-2E74SP63.js.map +1 -0
- package/dist/{chunk-MAAM45ZX.cjs → chunk-7M63Y6MO.cjs} +114 -59
- package/dist/chunk-7M63Y6MO.cjs.map +1 -0
- package/dist/{chunk-3HZV3UHU.cjs → chunk-DKCMJILW.cjs} +67 -65
- package/dist/chunk-DKCMJILW.cjs.map +1 -0
- package/dist/{chunk-4QVQ5UJJ.js → chunk-DM2OLQOJ.js} +5 -6
- package/dist/chunk-DM2OLQOJ.js.map +1 -0
- package/dist/{chunk-ICI6ACHY.js → chunk-FPV3NPYC.js} +8 -6
- package/dist/chunk-FPV3NPYC.js.map +1 -0
- package/dist/{chunk-UHNSL2KJ.js → chunk-K24FF4BT.js} +10 -5
- package/dist/chunk-K24FF4BT.js.map +1 -0
- package/dist/{chunk-X62H3RBG.cjs → chunk-LALEBV63.cjs} +5 -6
- package/dist/chunk-LALEBV63.cjs.map +1 -0
- package/dist/{chunk-LQDDDIC4.cjs → chunk-O66JGPVV.cjs} +10 -4
- package/dist/chunk-O66JGPVV.cjs.map +1 -0
- package/dist/index.cjs +35 -35
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/loader.css +1 -1
- package/dist/present.cjs +4 -4
- package/dist/present.d.cts +2 -2
- package/dist/present.d.ts +2 -2
- package/dist/present.js +4 -4
- package/dist/sound.cjs +2 -2
- package/dist/sound.js +1 -1
- package/dist/three.cjs +194 -15
- package/dist/three.cjs.map +1 -1
- package/dist/three.d.cts +75 -4
- package/dist/three.d.ts +75 -4
- package/dist/three.js +191 -13
- package/dist/three.js.map +1 -1
- package/dist/{types-C5xo0fzb.d.cts → types-CTSrPvY3.d.cts} +64 -58
- package/dist/{types-C5xo0fzb.d.ts → types-CTSrPvY3.d.ts} +64 -58
- package/docs/api.md +2 -0
- package/docs/dsl.md +26 -0
- package/llms-full.txt +66 -4
- package/package.json +1 -1
- package/skills/pixi-effects/SKILL.md +2 -2
- package/skills/pixi-effects/reference/cheatsheet.md +2 -2
- package/skills/pixi-effects/reference/recipes.md +34 -0
- package/skills/pixi-effects/template.html +6 -6
- package/dist/Composition-N6BOROJ2.cjs +0 -16
- package/dist/Composition-YGBQX3HZ.js +0 -7
- package/dist/chunk-3HZV3UHU.cjs.map +0 -1
- package/dist/chunk-4MBTYREC.js.map +0 -1
- package/dist/chunk-4QVQ5UJJ.js.map +0 -1
- package/dist/chunk-ICI6ACHY.js.map +0 -1
- package/dist/chunk-LQDDDIC4.cjs.map +0 -1
- package/dist/chunk-MAAM45ZX.cjs.map +0 -1
- package/dist/chunk-UHNSL2KJ.js.map +0 -1
- package/dist/chunk-X62H3RBG.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/space/lightChecks.ts","../src/space/camera.ts","../src/space/depth.ts","../src/filters/DiscBlur.ts","../src/space/LitMaterial.ts","../src/space/Layer3D.ts","../src/space/lint.ts","../src/core/matte.ts","../src/filters/Matte.ts","../src/core/MatteSet.ts","../src/sequences/Composition.ts"],"names":["i","GL_VERTEX","GL_FRAGMENT","GlProgram","UniformGroup","frameOf","Texture","Matrix","WGSL","Filter","GpuProgram","Container","RenderTexture","cam"],"mappings":"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","file":"chunk-ICI6ACHY.js","sourcesContent":["/**\n * What is wrong with the way a composition writes its lights and fog, as sentences (the caller puts `pixi-effects: <where>: ` in front).\n * Pure: no Pixi. Every sentence says what to write instead; nothing here throws.\n */\nimport { suggestName } from '../core/options';\nimport { collectPropKeys } from './specKeys';\nimport { FALLOFFS, LIGHT_KINDS, LIGHT_PROPS, MAX_CASTERS, MAX_LIGHTS } from './lighting';\nimport type { SequenceSpec } from '../types';\n\n/** This many lights with soft shadows warn (measured: 3 soft lights over 20 layers cost about 20 ms a frame at 1080p). */\nconst SOFT_LIGHTS = 3;\n\ntype Bag = Record<string, unknown>;\nconst bagsOf = (spec: SequenceSpec): Bag[] => {\n const s = spec as unknown as { initial?: Bag; keyframes?: Array<{ set?: Bag; to?: Bag; from?: Bag }> };\n const out: Bag[] = [];\n if (s.initial) out.push(s.initial);\n for (const k of s.keyframes ?? []) for (const b of [k.set, k.to, k.from]) if (b) out.push(b);\n return out;\n};\nconst numbersOf = (spec: SequenceSpec, key: string): number[] => bagsOf(spec).map(b => b[key]).filter((v): v is number => typeof v === 'number' && Number.isFinite(v));\nconst nameOf = (s: SequenceSpec, i: number) => ((s as { name?: string }).name ? `\"${(s as { name?: string }).name}\"` : `#${i + 1}`);\n\nconst KIND_ALIASES: Record<string, string> = {\n directional: 'parallel', sun: 'parallel', sunlight: 'parallel', distant: 'parallel',\n omni: 'point', lamp: 'point', bulb: 'point', pointlight: 'point',\n spotlight: 'spot', cone: 'spot',\n ambience: 'ambient', global: 'ambient', fill: 'ambient',\n};\n\n/** Why `kind` is not a light kind, with the likely name and the choices; null when it is one (or left out: the default is `point`). */\nexport function lightKindProblem(kind: unknown): string | null {\n if (kind === undefined || (typeof kind === 'string' && (LIGHT_KINDS as readonly string[]).includes(kind))) return null;\n const guess = typeof kind === 'string' ? (KIND_ALIASES[kind.toLowerCase()] ?? suggestName(kind, LIGHT_KINDS)) : null;\n const shown = typeof kind === 'string' ? `\"${kind}\"` : String(kind);\n return `kind ${shown} is not a light kind${guess ? `; did you mean \"${guess}\"?` : ''} (use ${LIGHT_KINDS.join(', ')}); point is used`;\n}\n\nconst LIGHT_ALIASES: Record<string, string> = {\n pointOfInterest: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?', target: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?', lookAt: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n angle: 'did you mean \"coneAngle\"?', cone: 'did you mean \"coneAngle\"?', spread: 'did you mean \"coneAngle\"?',\n feather: 'did you mean \"coneFeather\"?', penumbra: 'did you mean \"coneFeather\" (the cone edge) or \"shadowDiffusion\" (the shadow edge)?',\n castShadows: 'did you mean \"castsShadows\"?', castShadow: 'did you mean \"castsShadows\"?', shadows: 'did you mean \"castsShadows\"?', shadow: 'did you mean \"castsShadows\"?',\n brightness: 'did you mean \"intensity\"?', strength: 'did you mean \"intensity\"?',\n distance: 'did you mean \"radius\" (where the falloff starts) or \"falloffDistance\"?', range: 'did you mean \"radius\" or \"falloffDistance\"?',\n};\n\n/** What is wrong with one `light` layer written on its own (misplaced keys, aliases, ranges, a threeD light). */\nexport function lightLayerProblems(spec: SequenceSpec): string[] {\n const out: string[] = [];\n const raw = spec as unknown as Bag;\n const kind = lightKindProblem(raw.kind);\n if (kind) out.push(kind);\n if (raw.falloff !== undefined && !(FALLOFFS as readonly string[]).includes(raw.falloff as string)) {\n const guess = typeof raw.falloff === 'string' ? suggestName(raw.falloff, FALLOFFS) : null;\n out.push(`falloff ${JSON.stringify(raw.falloff)} is not supported${guess ? `; did you mean \"${guess}\"?` : ''} (use ${FALLOFFS.join(', ')}); none is used`);\n }\n for (const k of Object.keys(raw)) {\n if ((LIGHT_PROPS as readonly string[]).includes(k) || k === 'intensity' || k === 'shadowDarkness' || k === 'shadowDiffusion') {\n out.push(`\"${k}\" must go inside initial / keyframes, not on the light itself`);\n } else if (LIGHT_ALIASES[k]) out.push(`\"${k}\" is not a property — ${LIGHT_ALIASES[k]}`);\n }\n const explained = new Set(Object.keys(LIGHT_ALIASES));\n for (const k of collectPropKeys(spec as never)) {\n if (LIGHT_ALIASES[k]) out.push(`\"${k}\" is not a property — ${LIGHT_ALIASES[k]}`);\n else if (!explained.has(k) && !(LIGHT_PROPS as readonly string[]).includes(k)) out.push(`\"${k}\" has no effect on a light (use ${LIGHT_PROPS.join(', ')})`);\n }\n if (numbersOf(spec, 'coneFeather').some(v => v > 1 || v < 0)) out.push('coneFeather is 0..1 (the soft part of the cone edge, as a fraction of the half angle); it is clamped');\n const big = numbersOf(spec, 'intensity').find(v => v > 10);\n if (big !== undefined) out.push(`intensity ${big} looks like a percentage: it is a multiplier (1 = full, 0.25 = a quarter); did you mean ${big / 100}?`);\n const kindNow = typeof raw.kind === 'string' && (LIGHT_KINDS as readonly string[]).includes(raw.kind) ? raw.kind : 'point';\n const has = (...keys: string[]) => keys.filter(k => bagsOf(spec).some(b => b[k] !== undefined));\n const falloffOn = raw.falloff === 'smooth' || raw.falloff === 'inverseSquare';\n if (kindNow === 'ambient' && raw.castsShadows) out.push('an ambient light has no direction, so it makes no shadow: castsShadows is ignored (put it on a point, spot or parallel light)');\n const dist = has('radius', 'falloffDistance');\n if (dist.length && !falloffOn && kindNow !== 'ambient' && kindNow !== 'parallel') out.push(`${dist.join(' / ')} only matter with falloff: 'smooth' or 'inverseSquare' (the default 'none' does not fade with distance): write falloff on the layer`);\n const shadowNums = has('shadowDarkness', 'shadowDiffusion');\n if (shadowNums.length && !raw.castsShadows) out.push(`${shadowNums.join(' / ')} only matter with castsShadows: true on the light (and on the layers that cast)`);\n const cone = has('coneAngle', 'coneFeather');\n if (cone.length && kindNow !== 'spot') out.push(`${cone.join(' / ')} only matter for kind: 'spot' (this light is ${kindNow})`);\n if (kindNow === 'parallel' && raw.falloff !== undefined && raw.falloff !== 'none') out.push('a parallel light has no distance, so falloff has no effect on it');\n const init = (spec as { initial?: Bag }).initial ?? {};\n const pos = ['x', 'y', 'z'].map(k => init[k]), look = ['lookAtX', 'lookAtY', 'lookAtZ'].map(k => init[k]);\n if ((kindNow === 'spot' || kindNow === 'parallel') && pos.every(v => typeof v === 'number') && pos.every((v, i) => v === look[i])) {\n out.push('lookAt equals the position, so the light has no direction and lights nothing: move lookAtX / lookAtY / lookAtZ to where it should point');\n }\n if ((spec as { threeD?: boolean }).threeD) out.push('a light has no picture, so threeD has no effect on it (write it without threeD)');\n return out;\n}\n\n/** What is wrong with the lights of a composition taken together; empty when there is no light (a composition without light is not touched). */\nexport function lightSetProblems(layers: readonly SequenceSpec[]): string[] {\n const lights = layers.filter(l => l.type === 'light');\n if (lights.length === 0) return [];\n const out: string[] = [];\n const kindOf = (l: SequenceSpec) => ((l as { kind?: string }).kind ?? 'point');\n if (!lights.some(l => kindOf(l) === 'ambient')) {\n out.push('there is no ambient light, so what no light reaches is black; add { type: \\'light\\', kind: \\'ambient\\', initial: { intensity: 0.25 } }');\n }\n const direct = lights.filter(l => kindOf(l) !== 'ambient');\n if (direct.length > MAX_LIGHTS) {\n const dropped = direct.slice(MAX_LIGHTS).map(l => nameOf(l, layers.indexOf(l)));\n out.push(`${direct.length} lights, but at most ${MAX_LIGHTS} are used (the first ${MAX_LIGHTS}, in layer order); ${dropped.join(', ')} and later are dropped. Use fewer lights`);\n }\n const lightsCast = lights.some(l => kindOf(l) !== 'ambient' && (l as { castsShadows?: boolean }).castsShadows);\n const casters = layers.filter(l => l.type !== 'light' && (l as { castsShadows?: boolean }).castsShadows && (l as { threeD?: boolean }).threeD);\n if (casters.length > 0 && !lightsCast) out.push(`${casters.length} layer${casters.length > 1 ? 's have' : ' has'} castsShadows but no light has castsShadows: add castsShadows: true to the light that should make the shadows`);\n const hostsThree = layers.some(l => (l as { type?: string }).type === 'three' && (l as { followLights?: boolean }).followLights); // its own meshes cast, in three\n if (lightsCast && casters.length === 0 && !hostsThree) out.push('a light has castsShadows but no layer has castsShadows: add castsShadows: true to the threeD layers that should cast a shadow');\n if (lightsCast && casters.length > MAX_CASTERS) {\n const dropped = casters.slice(MAX_CASTERS).map(c => nameOf(c, layers.indexOf(c)));\n out.push(`${casters.length} layers cast shadows, but a layer receives shadows from at most ${MAX_CASTERS} (the first ${MAX_CASTERS}, in layer order); ${dropped.join(', ')} and later cast none`);\n }\n const softLights = lights.filter(l => (l as { castsShadows?: boolean }).castsShadows && numbersOf(l, 'shadowDiffusion').some(v => v > 0));\n if (softLights.length >= SOFT_LIGHTS) {\n out.push(`${softLights.length} lights make soft shadows (shadowDiffusion above 0): each is a 16-sample search per pixel and per caster, costly (about 20 ms more a frame at 1080p with 20 lit layers in our measurement). Give shadowDiffusion to one or two lights; the others keep hard shadows`);\n }\n layers.forEach((l, i) => {\n if (l.type === 'light' || (l as { threeD?: boolean }).threeD) return;\n const bad = (['castsShadows', 'lit'] as const).filter(k => (l as unknown as Bag)[k] !== undefined);\n if (bad.length) out.push(`layer ${nameOf(l, i)}: ${bad.map(k => `\"${k}\"`).join(' and ')} only work${bad.length > 1 ? '' : 's'} on threeD layers (add threeD: true; a 2D layer is not lit and casts no shadow)`);\n });\n return out;\n}\n\n/** What is wrong with the fog a camera writes (`fogFar` not beyond `fogNear`, an amount outside 0..1). */\nexport function fogProblems(camera: SequenceSpec): string[] {\n const out: string[] = [];\n const near = numbersOf(camera, 'fogNear')[0], far = numbersOf(camera, 'fogFar')[0];\n if (near !== undefined && far !== undefined && far <= near) out.push(`fogFar (${far}) is not beyond fogNear (${near}): the fog is a hard step at fogNear. Make fogFar larger (the distance where the fog is complete)`);\n if (numbersOf(camera, 'fogAmount').some(v => v < 0 || v > 1)) out.push('fogAmount is 0..1 (how much of the fog colour the farthest things get); it is clamped');\n return out;\n}\n","/** A camera layer's lifespan on the global timeline, seconds. */\nexport interface CameraWindow { start: number; end: number }\n\n/**\n * The active camera at time `t`: the last-listed (top-most) camera whose\n * lifespan covers `t`. Windows are [start, end), except that a camera running\n * to the end of its composition also covers the final instant `t === compEnd`.\n */\nexport function pickActiveCamera<T extends CameraWindow>(\n cams: readonly T[],\n t: number,\n compEnd: number,\n): T | null {\n for (let i = cams.length - 1; i >= 0; i--) {\n const c = cams[i]!;\n const inside = t >= c.start && (t < c.end || (c.end >= compEnd && t <= compEnd));\n if (inside) return c;\n }\n return null;\n}\n\n/** First pair of camera indices whose lifespans strictly overlap, or null. */\nexport function findOverlap(cams: readonly CameraWindow[]): [number, number] | null {\n for (let i = 0; i < cams.length; i++) {\n for (let j = i + 1; j < cams.length; j++) {\n const a = cams[i]!;\n const b = cams[j]!;\n if (a.start < b.end && b.start < a.end) return [i, j];\n }\n }\n return null;\n}\n","export interface DepthItem {\n /** Position in the composition's stack (monotonic; gaps allowed). */\n stackIndex: number;\n threeD: boolean;\n /** Camera-space depth (larger = farther). Only read for threeD items. */\n depth: number;\n}\n\nconst finite = (n: number): number => (Number.isFinite(n) ? n : 0);\n\n/**\n * zIndex per item. Non-3D items keep their stack index. Each run of\n * consecutive threeD items is redistributed over the same index slots,\n * farthest first (drawn first), ties in stack order.\n */\nexport function assignDepthOrder(items: readonly DepthItem[]): number[] {\n const out = items.map(i => i.stackIndex);\n let i = 0;\n while (i < items.length) {\n if (!items[i]!.threeD) { i++; continue; }\n let j = i;\n while (j + 1 < items.length && items[j + 1]!.threeD) j++;\n const run = items.slice(i, j + 1).map((it, k) => ({ it, pos: i + k }));\n const slots = run.map(r => r.it.stackIndex);\n const farthestFirst = [...run].sort((a, b) => finite(b.it.depth) - finite(a.it.depth));\n farthestFirst.forEach((r, k) => { out[r.pos] = slots[k]!; });\n i = j + 1;\n }\n return out;\n}\n","import { Filter, GlProgram, GpuProgram, UniformGroup } from 'pixi.js';\n\n/**\n * One-pass disc (\"bokeh\") blur for depth of field: the taps sit on a golden-angle spiral, so the result is a pure function of the\n * pixels (no noise, no time) and the same frame is the same picture whichever way it was reached. The radius is in pixels.\n */\nexport const DISC_TAPS = 48;\n\n// pixi compiles GLSL as WebGL1-compatible by default; a shader that starts with `#version 300 es` is kept as ES 3.00,\n// and then the vertex shader must be ES 3.00 too.\nconst GL_VERTEX = `#version 300 es\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvoid main(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition * (uOutputFrame.zw * uInputSize.zw);\n}`;\n\nconst GL_FRAGMENT = `#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform vec4 uInputSize;\nuniform float uRadius;\nout vec4 finalColor;\nvoid main(void) {\n vec4 acc = vec4(0.0);\n for (int i = 0; i < ${DISC_TAPS}; i++) {\n float r = sqrt((float(i) + 0.5) / ${DISC_TAPS}.0) * uRadius;\n float a = float(i) * 2.39996323;\n acc += texture(uTexture, vTextureCoord + vec2(cos(a), sin(a)) * r * uInputSize.zw);\n }\n finalColor = acc / ${DISC_TAPS}.0;\n}`;\n\nconst WGSL = `\nstruct GlobalFilterUniforms {\n uInputSize: vec4<f32>, uInputPixel: vec4<f32>, uInputClamp: vec4<f32>,\n uOutputFrame: vec4<f32>, uGlobalFrame: vec4<f32>, uOutputTexture: vec4<f32>,\n};\nstruct DiscUniforms { uRadius: f32 };\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;\n@group(0) @binding(1) var uTexture: texture_2d<f32>;\n@group(0) @binding(2) var uSampler : sampler;\n@group(1) @binding(0) var<uniform> disc : DiscUniforms;\nstruct VSOutput { @builtin(position) position: vec4<f32>, @location(0) uv : vec2<f32> };\nfn filterVertexPosition(aPosition : vec2<f32>) -> vec4<f32> {\n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;\n return vec4<f32>(position, 0.0, 1.0);\n}\nfn filterTextureCoord(aPosition : vec2<f32>) -> vec2<f32> {\n return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);\n}\n@vertex\nfn mainVertex(@location(0) aPosition : vec2<f32>) -> VSOutput {\n return VSOutput(filterVertexPosition(aPosition), filterTextureCoord(aPosition));\n}\n@fragment\nfn mainFragment(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\n var acc = vec4<f32>(0.0);\n for (var i = 0; i < ${DISC_TAPS}; i++) {\n let r = sqrt((f32(i) + 0.5) / ${DISC_TAPS}.0) * disc.uRadius;\n let a = f32(i) * 2.39996323;\n acc += textureSampleLevel(uTexture, uSampler, uv + vec2<f32>(cos(a), sin(a)) * r * gfu.uInputSize.zw, 0.0);\n }\n return acc / ${DISC_TAPS}.0;\n}`;\n\nexport class DiscBlurFilter extends Filter {\n constructor(radius = 8) {\n super({\n glProgram: GlProgram.from({ vertex: GL_VERTEX, fragment: GL_FRAGMENT, name: 'disc-blur' }),\n gpuProgram: GpuProgram.from({ vertex: { source: WGSL, entryPoint: 'mainVertex' }, fragment: { source: WGSL, entryPoint: 'mainFragment' } }),\n resources: { disc: new UniformGroup({ uRadius: { value: radius, type: 'f32' } }) },\n });\n this.radius = radius;\n }\n\n /** Blur radius in pixels. The padding follows it, so the blurred edge is not cut off. */\n get radius(): number { return (this.resources.disc as UniformGroup).uniforms.uRadius as number; }\n set radius(v: number) {\n const r = Math.max(0, v);\n (this.resources.disc as UniformGroup).uniforms.uRadius = r;\n this.padding = Math.ceil(r) + 2;\n }\n}\n","/**\n * The shader a lit threeD layer's PerspectiveMesh draws with. It is Pixi's own mesh shader (the same high-shader\n * bits: local uniforms, texture, round pixels) plus one more bit that runs after the texel is read: it rebuilds the fragment's world\n * position from its uv (the plane is flat, so world = origin + u·U + v·V exactly), shades it (ambient + point / spot / parallel,\n * Lambert, falloff, cone, planar shadows of up to MAX_CASTERS other layers) and adds depth fog. No extra pass, no extra texture:\n * the layer's own RenderTexture is sampled once, the casters' RenderTextures (already drawn this frame) are sampled for shadows.\n */\nimport {\n Shader, UniformGroup, Matrix, Texture, GlProgram, compileHighShaderGpuProgram,\n type GpuProgram, type TextureSource,\n} from 'pixi.js';\nimport { MAX_CASTERS, MAX_LIGHTS, SHADOW_TAPS, type PackedLights, type PlaneFrame } from './lighting';\n\n// Pixi does not export the bits from the package root in every build; they are small, so they are restated (same text as Pixi 8.22).\nconst localUniformBit = {\n name: 'local-uniform-bit',\n vertex: {\n header: /* wgsl */`\n struct LocalUniforms { uTransformMatrix:mat3x3<f32>, uColor:vec4<f32>, uRound:f32, }\n @group(1) @binding(0) var<uniform> localUniforms : LocalUniforms;`,\n main: /* wgsl */`\n vColor *= localUniforms.uColor;\n modelMatrix *= localUniforms.uTransformMatrix;`,\n end: /* wgsl */`\n if(localUniforms.uRound == 1) { vPosition = vec4(roundPixels(vPosition.xy, globalUniforms.uResolution), vPosition.zw); }`,\n },\n};\nconst textureBit = {\n name: 'texture-bit',\n vertex: {\n header: `struct TextureUniforms { uTextureMatrix:mat3x3<f32>, }\n @group(2) @binding(2) var<uniform> textureUniforms : TextureUniforms;`,\n main: `uv = (textureUniforms.uTextureMatrix * vec3(uv, 1.0)).xy;`,\n },\n fragment: {\n header: `@group(2) @binding(0) var uTexture: texture_2d<f32>;\n @group(2) @binding(1) var uSampler: sampler;`,\n main: `outColor = textureSample(uTexture, uSampler, vUV);`,\n },\n};\nconst roundPixelsBit = {\n name: 'round-pixels-bit',\n vertex: { header: `fn roundPixels(position: vec2<f32>, targetSize: vec2<f32>) -> vec2<f32> { return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; }` },\n};\n\nconst ML = MAX_LIGHTS, MC = MAX_CASTERS, TAPS = SHADOW_TAPS;\nconst SHADOW_KEYS = Array.from({ length: MC }, (_, j) => `uShadow${j}`);\n// the caster textures: one binding each (the first of them is binding 4), and a chain that picks the one a caster index names\nconst WGSL_SHADOW_DECLS = SHADOW_KEYS.map((k, j) => ` @group(2) @binding(${4 + j}) var ${k}: texture_2d<f32>;`).join('\\n');\nconst WGSL_SHADOW_PICK = SHADOW_KEYS.map((k, j) => (j === 0 ? '' : 'else ') + `if (j == ${j}) { a = textureSampleLevel(${k}, uSampler, uv, 0.0).a; }`).join(' ');\nconst GLSL_SHADOW_DECLS = SHADOW_KEYS.map(k => `uniform sampler2D ${k};`).join(' ');\nconst GLSL_SHADOW_PICK = SHADOW_KEYS.map((k, j) => (j === MC - 1 ? '' : `j == ${j} ? textureLod(${k}, uv, 0.0).a : `) + (j === MC - 1 ? `textureLod(${k}, uv, 0.0).a` : '')).join('');\n\nconst STRUCT_WGSL = /* wgsl */`\n struct LightUniforms {\n uOrigin: vec4<f32>, uAxisU: vec4<f32>, uAxisV: vec4<f32>, uCam: vec4<f32>, uCamFwd: vec4<f32>,\n uAmbient: vec4<f32>, uFogColor: vec4<f32>, uFogRange: vec4<f32>,\n uLPos: array<vec4<f32>, ${ML}>, uLDir: array<vec4<f32>, ${ML}>, uLCol: array<vec4<f32>, ${ML}>, uLFall: array<vec4<f32>, ${ML}>, uLShadow: array<vec4<f32>, ${ML}>,\n uCO: array<vec4<f32>, ${MC}>, uCU: array<vec4<f32>, ${MC}>, uCV: array<vec4<f32>, ${MC}>,\n };\n @group(2) @binding(3) var<uniform> lightUniforms : LightUniforms;\n`;\n\nconst lightBit = {\n name: 'light-bit',\n vertex: {\n header: /* wgsl */`${STRUCT_WGSL}\n @out vPW: vec4<f32>;`,\n // world position over camera depth, and 1 / depth: interpolated per fragment and divided, they give the exact (perspective-correct) point\n end: /* wgsl */`\n {\n let Pv = lightUniforms.uOrigin.xyz + vUV.x * lightUniforms.uAxisU.xyz + vUV.y * lightUniforms.uAxisV.xyz;\n let zc = max(dot(Pv - lightUniforms.uCam.xyz, lightUniforms.uCamFwd.xyz), 1e-3);\n vPW = vec4<f32>(Pv / zc, 1.0 / zc);\n }`,\n },\n fragment: {\n header: /* wgsl */`\n${STRUCT_WGSL}\n @in vPW: vec4<f32>;\n${WGSL_SHADOW_DECLS}\n\n fn casterAlpha(j: i32, uv: vec2<f32>) -> f32 {\n let inside = step(0.0, uv.x) * step(uv.x, 1.0) * step(0.0, uv.y) * step(uv.y, 1.0);\n var a = 0.0;\n ${WGSL_SHADOW_PICK}\n return a * inside;\n }\n\n fn shadowAt(P: vec3<f32>, i: i32) -> f32 {\n let lp = lightUniforms.uLPos[i]; let ld = lightUniforms.uLDir[i];\n let parallel = lp.w > 2.5;\n var occl = 0.0;\n for (var j = 0; j < ${MC}; j++) {\n if (f32(j) >= lightUniforms.uAxisU.w) { break; }\n let Co = lightUniforms.uCO[j].xyz; let Cu = lightUniforms.uCU[j].xyz; let Cv = lightUniforms.uCV[j].xyz;\n let Nc = cross(Cu, Cv);\n var D = lp.xyz - P;\n if (parallel) { D = -ld.xyz * 100000.0; }\n let denom = dot(D, Nc);\n if (abs(denom) < 1e-9) { continue; }\n let t = dot(Co - P, Nc) / denom;\n if (t <= 1e-4 || t >= 1.0) { continue; }\n let H = P + t * D;\n let uv = vec2<f32>(dot(H - Co, Cu) / dot(Cu, Cu), dot(H - Co, Cv) / dot(Cv, Cv));\n let lenD = length(D);\n let far = select((1.0 - t) * lenD, 1000.0, parallel);\n let w = lightUniforms.uLShadow[i].y * (t * lenD) / max(far, 1.0);\n let r = vec2<f32>(w / length(Cu), w / length(Cv));\n var a = 0.0;\n if (w * w > 0.0) {\n for (var k = 0; k < ${TAPS}; k++) {\n let rr = sqrt((f32(k) + 0.5) / ${TAPS}.0);\n let an = f32(k) * 2.39996323;\n a += casterAlpha(j, uv + vec2<f32>(cos(an), sin(an)) * rr * r);\n }\n a = a / ${TAPS}.0;\n } else { a = casterAlpha(j, uv); }\n occl = max(occl, a);\n }\n return 1.0 - occl * lightUniforms.uLShadow[i].x;\n }\n `,\n end: /* wgsl */`\n {\n let P = vPW.xyz / vPW.w;\n if (lightUniforms.uCam.w > 0.5) {\n var N = normalize(cross(lightUniforms.uAxisU.xyz, lightUniforms.uAxisV.xyz));\n if (dot(N, lightUniforms.uCam.xyz - P) < 0.0) { N = -N; }\n var light = lightUniforms.uAmbient.rgb;\n for (var i = 0; i < ${ML}; i++) {\n if (f32(i) >= lightUniforms.uOrigin.w) { break; }\n let lp = lightUniforms.uLPos[i]; let ld = lightUniforms.uLDir[i]; let lc = lightUniforms.uLCol[i]; let lf = lightUniforms.uLFall[i];\n var L = -ld.xyz;\n var dist = 0.0;\n if (lp.w < 2.5) { let d = lp.xyz - P; dist = length(d); L = d / max(dist, 1e-4); }\n let ndl = max(dot(N, L), 0.0);\n var att = 1.0;\n if (lp.w < 2.5) {\n if (lf.x > 0.5 && lf.x < 1.5) { att = 1.0 - smoothstep(lf.y, lf.y + max(lf.z, 1e-3), dist); }\n else if (lf.x > 1.5) { att = min(1.0, (lf.y * lf.y) / max(dist * dist, 1e-6)); }\n }\n var cone = 1.0;\n if (lp.w > 1.5 && lp.w < 2.5) { cone = smoothstep(ld.w, lc.w, dot(-L, ld.xyz)); }\n var sh = 1.0;\n if (lf.w > 0.5 && ndl * att * cone > 0.0) { sh = shadowAt(P, i); }\n light += lc.rgb * (ndl * att * cone * sh);\n }\n finalColor = vec4<f32>(min(finalColor.rgb * light, vec3<f32>(finalColor.a)), finalColor.a);\n }\n if (lightUniforms.uFogRange.w > 0.5) {\n let depth = dot(P - lightUniforms.uCam.xyz, lightUniforms.uCamFwd.xyz);\n let f = clamp((depth - lightUniforms.uFogRange.x) / max(lightUniforms.uFogRange.y - lightUniforms.uFogRange.x, 1e-3), 0.0, 1.0) * lightUniforms.uFogColor.a;\n finalColor = vec4<f32>(mix(finalColor.rgb, lightUniforms.uFogColor.rgb * finalColor.a, f), finalColor.a);\n }\n }\n `,\n },\n};\n\nconst lightBitGl = {\n name: 'light-bit',\n fragment: {\n header: /* glsl */`\n uniform vec4 uOrigin; uniform vec4 uAxisU; uniform vec4 uAxisV; uniform vec4 uCam; uniform vec4 uCamFwd;\n uniform vec4 uAmbient; uniform vec4 uFogColor; uniform vec4 uFogRange;\n uniform vec4 uLPos[${ML}]; uniform vec4 uLDir[${ML}]; uniform vec4 uLCol[${ML}]; uniform vec4 uLFall[${ML}]; uniform vec4 uLShadow[${ML}];\n uniform vec4 uCO[${MC}]; uniform vec4 uCU[${MC}]; uniform vec4 uCV[${MC}];\n ${GLSL_SHADOW_DECLS}\n\n float casterAlpha(int j, vec2 uv) {\n float inside = step(0.0, uv.x) * step(uv.x, 1.0) * step(0.0, uv.y) * step(uv.y, 1.0);\n float a = ${GLSL_SHADOW_PICK};\n return a * inside;\n }\n\n float shadowAt(vec3 P, int i) {\n vec4 lp = uLPos[i]; vec4 ld = uLDir[i];\n bool parallel = lp.w > 2.5;\n float occl = 0.0;\n for (int j = 0; j < ${MC}; j++) {\n if (float(j) >= uAxisU.w) break;\n vec3 Co = uCO[j].xyz; vec3 Cu = uCU[j].xyz; vec3 Cv = uCV[j].xyz;\n vec3 Nc = cross(Cu, Cv);\n vec3 D = parallel ? -ld.xyz * 100000.0 : lp.xyz - P;\n float denom = dot(D, Nc);\n if (abs(denom) < 1e-9) continue;\n float t = dot(Co - P, Nc) / denom;\n if (t <= 1e-4 || t >= 1.0) continue;\n vec3 H = P + t * D;\n vec2 uv = vec2(dot(H - Co, Cu) / dot(Cu, Cu), dot(H - Co, Cv) / dot(Cv, Cv));\n float lenD = length(D);\n float far = parallel ? 1000.0 : (1.0 - t) * lenD;\n float w = uLShadow[i].y * (t * lenD) / max(far, 1.0);\n vec2 r = vec2(w / length(Cu), w / length(Cv));\n float a = 0.0;\n if (w * w > 0.0) {\n for (int k = 0; k < ${TAPS}; k++) {\n float rr = sqrt((float(k) + 0.5) / ${TAPS}.0);\n float an = float(k) * 2.39996323;\n a += casterAlpha(j, uv + vec2(cos(an), sin(an)) * rr * r);\n }\n a /= ${TAPS}.0;\n } else { a = casterAlpha(j, uv); }\n occl = max(occl, a);\n }\n return 1.0 - occl * uLShadow[i].x;\n }\n `,\n end: /* glsl */`\n {\n vec3 P = vPW.xyz / vPW.w;\n if (uCam.w > 0.5) {\n vec3 N = normalize(cross(uAxisU.xyz, uAxisV.xyz));\n if (dot(N, uCam.xyz - P) < 0.0) N = -N;\n vec3 light = uAmbient.rgb;\n for (int i = 0; i < ${ML}; i++) {\n if (float(i) >= uOrigin.w) break;\n vec4 lp = uLPos[i]; vec4 ld = uLDir[i]; vec4 lc = uLCol[i]; vec4 lf = uLFall[i];\n vec3 L = -ld.xyz;\n float dist = 0.0;\n if (lp.w < 2.5) { vec3 d = lp.xyz - P; dist = length(d); L = d / max(dist, 1e-4); }\n float ndl = max(dot(N, L), 0.0);\n float att = 1.0;\n if (lp.w < 2.5) {\n if (lf.x > 0.5 && lf.x < 1.5) att = 1.0 - smoothstep(lf.y, lf.y + max(lf.z, 1e-3), dist);\n else if (lf.x > 1.5) att = min(1.0, (lf.y * lf.y) / max(dist * dist, 1e-6));\n }\n float cone = 1.0;\n if (lp.w > 1.5 && lp.w < 2.5) cone = smoothstep(ld.w, lc.w, dot(-L, ld.xyz));\n float sh = 1.0;\n if (lf.w > 0.5 && ndl * att * cone > 0.0) sh = shadowAt(P, i);\n light += lc.rgb * (ndl * att * cone * sh);\n }\n finalColor.rgb = min(finalColor.rgb * light, vec3(finalColor.a));\n }\n if (uFogRange.w > 0.5) {\n float depth = dot(P - uCam.xyz, uCamFwd.xyz);\n float f = clamp((depth - uFogRange.x) / max(uFogRange.y - uFogRange.x, 1e-3), 0.0, 1.0) * uFogColor.a;\n finalColor.rgb = mix(finalColor.rgb, uFogColor.rgb * finalColor.a, f);\n }\n }\n `,\n },\n};\n\nconst GL_VERTEX = `#version 300 es\nin vec2 aPosition;\nin vec2 aUV;\nout vec4 vColor;\nout vec2 vUV;\nout vec4 vPW;\nuniform vec4 uOrigin; uniform vec4 uAxisU; uniform vec4 uAxisV; uniform vec4 uCam; uniform vec4 uCamFwd;\nuniform mat3 uProjectionMatrix; uniform mat3 uWorldTransformMatrix; uniform vec4 uWorldColorAlpha; uniform vec2 uResolution;\nuniform mat3 uTransformMatrix; uniform vec4 uColor; uniform float uRound;\nuniform mat3 uTextureMatrix;\nvec2 roundPixels(vec2 position, vec2 targetSize) { return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; }\nvoid main(void) {\n mat3 modelMatrix = uTransformMatrix;\n vColor = uColor;\n vUV = (uTextureMatrix * vec3(aUV, 1.0)).xy;\n mat3 mvp = uProjectionMatrix * uWorldTransformMatrix * modelMatrix;\n gl_Position = vec4((mvp * vec3(aPosition, 1.0)).xy, 0.0, 1.0);\n vColor *= uWorldColorAlpha;\n if (uRound == 1.) gl_Position.xy = roundPixels(gl_Position.xy, uResolution);\n vec3 Pv = uOrigin.xyz + vUV.x * uAxisU.xyz + vUV.y * uAxisV.xyz;\n float zc = max(dot(Pv - uCam.xyz, uCamFwd.xyz), 1e-3);\n vPW = vec4(Pv / zc, 1.0 / zc);\n}`;\n\nconst GL_FRAGMENT = `#version 300 es\nprecision highp float;\nin vec4 vColor;\nin vec2 vUV;\nin vec4 vPW;\nout vec4 finalColor;\nuniform sampler2D uTexture;\n${lightBitGl.fragment.header}\nvoid main(void) {\n vec4 outColor = texture(uTexture, vUV);\n finalColor = outColor * vColor;\n ${lightBitGl.fragment.end}\n}`;\n\nlet programs: { gl: GlProgram; gpu: GpuProgram } | null = null;\nfunction getPrograms() {\n programs ??= {\n // pixi compiles high-shader GLSL as WebGL1-compatible (no textureLod, no dynamic uniform-array index): the GL program is written as ES 3.00\n gl: GlProgram.from({ name: 'lit-mesh', vertex: GL_VERTEX, fragment: GL_FRAGMENT }),\n gpu: compileHighShaderGpuProgram({ name: 'lit-mesh', bits: [localUniformBit, textureBit, roundPixelsBit, lightBit] as never }),\n };\n return programs;\n}\n\nexport interface FogState { r: number; g: number; b: number; near: number; far: number; amount: number }\nexport interface CasterInput { frame: PlaneFrame; source: TextureSource }\n\n/** One per lit layer: its own uniforms and its own shadow textures. */\nexport class LitMaterial {\n readonly shader: Shader;\n private readonly u: UniformGroup;\n\n constructor() {\n const { gl, gpu } = getPrograms();\n const v4 = () => ({ value: new Float32Array(4), type: 'vec4<f32>' as const });\n const arr = (n: number) => ({ value: new Float32Array(4 * n), type: 'vec4<f32>' as const, size: n });\n this.u = new UniformGroup({\n uOrigin: v4(), uAxisU: v4(), uAxisV: v4(), uCam: v4(), uCamFwd: v4(), uAmbient: v4(), uFogColor: v4(), uFogRange: v4(),\n uLPos: arr(ML), uLDir: arr(ML), uLCol: arr(ML), uLFall: arr(ML), uLShadow: arr(ML),\n uCO: arr(MC), uCU: arr(MC), uCV: arr(MC),\n });\n this.shader = new Shader({\n glProgram: gl, gpuProgram: gpu,\n resources: {\n uTexture: Texture.EMPTY.source,\n uSampler: Texture.EMPTY.source.style,\n textureUniforms: { uTextureMatrix: { type: 'mat3x3<f32>', value: new Matrix() } },\n lightUniforms: this.u,\n ...Object.fromEntries(SHADOW_KEYS.map(k => [k, Texture.EMPTY.source])),\n },\n });\n }\n\n setTexture(src: TextureSource): void {\n if (this.shader.resources.uTexture !== src) {\n this.shader.resources.uTexture = src;\n this.shader.resources.uSampler = src.style;\n }\n }\n\n update(frame: PlaneFrame, cam: { x: number; y: number; z: number; fx: number; fy: number; fz: number }, lights: PackedLights | null, fog: FogState | null, casters: readonly CasterInput[]): void {\n const U = this.u.uniforms as Record<string, Float32Array>;\n const nc = Math.min(casters.length, MC);\n U.uOrigin!.set([frame.o.x, frame.o.y, frame.o.z, lights ? lights.count : 0]);\n U.uAxisU!.set([frame.u.x, frame.u.y, frame.u.z, nc]);\n U.uAxisV!.set([frame.v.x, frame.v.y, frame.v.z, 0]);\n U.uCam!.set([cam.x, cam.y, cam.z, lights ? 1 : 0]);\n U.uCamFwd!.set([cam.fx, cam.fy, cam.fz, 0]);\n if (lights) {\n U.uAmbient!.set([lights.ambient[0], lights.ambient[1], lights.ambient[2], 0]);\n U.uLPos!.set(lights.pos); U.uLDir!.set(lights.dir); U.uLCol!.set(lights.col); U.uLFall!.set(lights.fall); U.uLShadow!.set(lights.shadow);\n }\n if (fog) { U.uFogColor!.set([fog.r, fog.g, fog.b, fog.amount]); U.uFogRange!.set([fog.near, fog.far, 0, 1]); }\n else U.uFogRange!.set([0, 0, 0, 0]);\n const keys = SHADOW_KEYS;\n for (let j = 0; j < MC; j++) {\n const c = casters[j];\n if (c && j < nc) {\n U.uCO!.set([c.frame.o.x, c.frame.o.y, c.frame.o.z, 0], 4 * j);\n U.uCU!.set([c.frame.u.x, c.frame.u.y, c.frame.u.z, 0], 4 * j);\n U.uCV!.set([c.frame.v.x, c.frame.v.y, c.frame.v.z, 0], 4 * j);\n if (this.shader.resources[keys[j]] !== c.source) this.shader.resources[keys[j]] = c.source;\n } else if (this.shader.resources[keys[j]] !== Texture.EMPTY.source) this.shader.resources[keys[j]] = Texture.EMPTY.source;\n }\n this.u.update();\n }\n\n destroy(): void { this.shader.destroy(); }\n}\n","import { Container, Matrix, PerspectiveMesh, RenderTexture, Texture } from 'pixi.js';\nimport type { Sequence } from '../sequences/Base';\nimport { DiscBlurFilter } from '../filters/DiscBlur';\nimport { MAX_BLUR, MIN_BLUR } from './focus';\nimport { blendFilterFor, isAdvancedBlend, type BlendFilterLike } from '../core/blend';\nimport { describeLayer } from '../core/lint';\nimport { DEG, NEAR, layerToWorld, projectLayer, type CameraBasis, type LayerTransform, type Rect } from './math';\nimport { LitMaterial } from './LitMaterial';\nimport type { PlaneFrame } from './lighting';\n\n/** Render textures are capped at this many pixels on the long side; larger layers are downscaled. */\nexport const MAX_TEXTURE_SIZE = 4096;\n/**\n * Render textures are drawn at this multiple of the layer size (until the caps),\n * so a layer enlarged by perspective (z > 0) stays sharp instead of showing\n * jagged edges and soft text.\n */\nexport const SUPERSAMPLE = 2;\n/** Total texture pixels per layer are capped here (≈ one 2048² target); resolution drops to fit. */\nexport const MAX_TEXTURE_PIXELS = 2048 * 2048;\n/** MSAA multiplies target memory ~4x, so only small textures get it (supersampling covers the rest). */\nexport const ANTIALIAS_MAX_PIXELS = 1024 * 1024;\n/** Mesh grid per side. 20 keeps steeply tilted planes free of visible affine warping. */\nexport const MESH_GRID = 20;\n\n/** The slice of a Pixi renderer Layer3D needs (also what tests fake). */\nexport interface SpaceHost {\n render(options: {\n container: Container;\n target: RenderTexture;\n transform: Matrix;\n clear: boolean;\n clearColor: number[];\n }): void;\n}\n\ntype Carrier = Container & { z?: number; rotationX?: number; rotationY?: number };\n\ninterface TextureSize { w: number; h: number; resolution: number; antialias: boolean }\n\n/** Sum of the target's filter paddings: the texture must be this much larger on every side or filter output is clipped. */\nfunction filterPadding(target: Container): number {\n const filters = (target as unknown as { filters?: ReadonlyArray<{ padding?: number }> | null }).filters;\n if (!Array.isArray(filters)) return 0;\n let pad = 0;\n for (const f of filters) pad += f?.padding ?? 0;\n return Number.isFinite(pad) && pad > 0 ? Math.ceil(pad) : 0;\n}\n\nexport function readLayerTransform(target: Container): LayerTransform {\n const c = target as Carrier;\n return {\n x: c.x, y: c.y, z: c.z ?? 0,\n rotationX: (c.rotationX ?? 0) * DEG,\n rotationY: (c.rotationY ?? 0) * DEG,\n rotationZ: c.rotation,\n scaleX: c.scale.x, scaleY: c.scale.y,\n pivotX: c.pivot.x, pivotY: c.pivot.y,\n };\n}\n\n/**\n * Draws one `threeD` sequence: its display object is rendered into a\n * RenderTexture (with its own 2D transform replaced, so layer-local content\n * lands at the texture origin) and shown on a PerspectiveMesh whose four\n * corners come from projecting the layer through the active camera.\n *\n * The sequence's `target` is never in the scene graph; the composition adds\n * `display` instead. `z`, `rotationX`, `rotationY` live on `target` as plain\n * numeric props so the timeline tweens them like any other prop.\n */\nexport class Layer3D {\n readonly display: PerspectiveMesh;\n /** Camera-space depth from the last update (larger = farther). */\n depth = 0;\n private rt: RenderTexture | null = null;\n /**\n * Textures replaced by a bigger / smaller one. Destroying one right away warns \"destroyed while still\n * bound\": the mesh's bind group still points at it until the next render. They go at the next update,\n * by which time a frame has been drawn with the new texture.\n */\n private retired: RenderTexture[] = [];\n private size: TextureSize | null = null;\n private warnedBehind = false;\n /** Depth-of-field blur radius (px) from the last `setBlur`; 0 = no filter. */\n blur = 0;\n private blurFilter: DiscBlurFilter | null = null;\n private blendWas = 'normal';\n private blendFilter: BlendFilterLike | null = null;\n /** The projected corners of the card (TL, TR, BR, BL as x0, y0 … x3, y3, in the space of the composition that holds it), or null while it is not drawn: what a hit test reads. */\n corners: number[] | null = null;\n /** The plane in world space from the last update (a texture uv of 0..1 maps to `o + u·U + v·V`): what shading and shadows need. */\n world: PlaneFrame | null = null;\n /** The lit shader: made only when the composition has a light or fog (a composition with neither makes nothing). */\n material: LitMaterial | null = null;\n /** This layer's own texture (what a shadow reads), or null before the first draw. */\n get source() { return this.rt?.source ?? null; }\n private warnedLit = false;\n /** The spec of the layer this draws (for `lit`, `castsShadows`). */\n get spec() { return this.seq.spec; }\n\n constructor(\n private readonly seq: Sequence,\n private readonly frameOf: () => Rect,\n ) {\n const target = seq.target as Carrier;\n target.z ??= 0;\n target.rotationX ??= 0;\n target.rotationY ??= 0;\n this.display = new PerspectiveMesh({ texture: Texture.WHITE, verticesX: MESH_GRID, verticesY: MESH_GRID });\n if (seq.spec.name) this.display.label = seq.spec.name;\n this.display.visible = false;\n }\n\n update(host: SpaceHost, basis: CameraBasis): void {\n this.flushRetired();\n const target = this.seq.target as Carrier | null;\n // Pixi skips rendering (and clearing) a container that is not `visible`\n // (e.g. PixiPlugin autoAlpha at alpha 0), which would leave a stale texture.\n if (!target || !target.renderable || !target.visible) return this.hide();\n\n const bounds = this.frameOf();\n const pad = filterPadding(target);\n const needW = Math.ceil(bounds.width + 2 * pad);\n const needH = Math.ceil(bounds.height + 2 * pad);\n if (!(needW >= 1 && needH >= 1) || !Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return this.hide();\n\n const size = this.sizeFor(needW, needH);\n // The quad covers exactly the texture's pixel rect in layer space.\n const frame: Rect = { x: bounds.x - pad, y: bounds.y - pad, width: size.w, height: size.h };\n const projected = projectLayer(readLayerTransform(target), frame, basis);\n this.depth = projected.depth;\n {\n const lt = readLayerTransform(target);\n const o = layerToWorld(lt, frame.x, frame.y);\n const pu = layerToWorld(lt, frame.x + frame.width, frame.y);\n const pv = layerToWorld(lt, frame.x, frame.y + frame.height);\n this.world = { o, u: { x: pu.x - o.x, y: pu.y - o.y, z: pu.z - o.z }, v: { x: pv.x - o.x, y: pv.y - o.y, z: pv.z - o.z } };\n }\n if (!projected.visible) {\n if (!this.warnedBehind) {\n this.warnedBehind = true;\n if ((this.seq.spec as { hideBehindCamera?: boolean }).hideBehindCamera) return this.hide(); // on purpose: say nothing\n if (projected.depth > NEAR) {\n // the layer's own origin is in front of the camera: a tilt or a large size swings a CORNER past the camera plane\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)}: part of it (a corner) reaches the camera plane (z = ${(target.z ?? 0).toFixed(0)}, rotationX ${(target.rotationX ?? 0).toFixed(0)}°, rotationY ${(target.rotationY ?? 0).toFixed(0)}°), ` +\n `and a layer is hidden whole when any corner is at or behind it. Tilt it less (rotationX / rotationY), make it smaller, or keep the camera further away from it ` +\n `(the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n } else {\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)} is at or behind the camera plane (z = ${(target.z ?? 0).toFixed(0)}) and is hidden. ` +\n `If that is unintended, lower its z or move the camera back (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n }\n }\n return this.hide();\n }\n\n this.ensureTexture(size);\n // `transform` replaces the container's own local transform for this render\n // (Pixi RenderGroupSystem), while `container.alpha` still applies — so the\n // texture carries the layer's alpha and the mesh alpha stays at 1.\n host.render({\n container: target,\n target: this.rt!,\n transform: new Matrix().translate(-frame.x, -frame.y),\n clear: true,\n clearColor: [0, 0, 0, 0],\n });\n this.display.geometry.setCorners(...projected.corners);\n this.corners = projected.corners;\n this.material?.setTexture(this.rt!.source);\n this.display.visible = true;\n }\n\n /**\n * Depth-of-field blur on the projected mesh (screen space), so a tilted or scaled layer blurs by the size it is drawn at.\n * A radius under MIN_BLUR removes the filter: a sharp layer costs nothing. A blend mode moves to the filter while it is on\n * (a filtered object blends as a whole), and comes back when it goes.\n */\n setBlur(radius: number): void {\n const d = this.display as unknown as { filters: unknown; blendMode: string };\n // No hysteresis on purpose: whether a layer has the filter must depend only on this frame's radius, never on the frame before it\n // (a frame is a pure function of the camera and the layers, whichever order frames are visited in). A layer hovering at the\n // threshold creates and destroys a cheap filter object each frame; that is the price of determinism.\n const r = radius > MIN_BLUR ? Math.min(radius, MAX_BLUR) : 0;\n this.blur = r;\n if (r === 0) {\n if (this.blurFilter) {\n d.filters = null;\n d.blendMode = this.blendWas;\n this.blurFilter.destroy();\n this.blurFilter = null;\n this.blendFilter?.destroy();\n this.blendFilter = null;\n }\n return;\n }\n if (!this.blurFilter) {\n this.blurFilter = new DiscBlurFilter(r);\n this.blendWas = d.blendMode ?? 'normal';\n const chain: unknown[] = [this.blurFilter];\n if (isAdvancedBlend(this.blendWas)) {\n // an advanced mode is a filter of its own: blur first, then blend what is blurred onto the backdrop\n this.blendFilter = blendFilterFor(this.blendWas);\n if (this.blendFilter) { chain.push(this.blendFilter); d.blendMode = 'normal'; }\n } else if (this.blendWas !== 'normal' && this.blendWas !== 'inherit') {\n // only an explicit basic mode moves ('inherit' is Pixi's default for a container and 'normal' is the filter's own: nothing to move)\n this.blurFilter.blendMode = this.blendWas as never;\n d.blendMode = 'normal';\n }\n d.filters = chain;\n }\n this.blurFilter.radius = r;\n }\n\n /**\n * Turn the lit shader on (made once) or off. Returns it, or null when it is off or cannot be made on this renderer (said once: the layer\n * then draws unlit, as it did before there were lights).\n */\n setLit(on: boolean): LitMaterial | null {\n if (on && !this.material) {\n try {\n this.material = new LitMaterial();\n } catch (err) {\n if (!this.warnedLit) {\n this.warnedLit = true;\n console.warn(`pixi-effects: ${describeLayer(this.seq.spec)}: the lighting shader could not be made on this renderer (${(err as Error)?.message ?? err}); the layer is drawn unlit`);\n }\n return null;\n }\n if (this.rt) this.material.setTexture(this.rt.source);\n (this.display as unknown as { shader: unknown }).shader = this.material.shader;\n } else if (!on && this.material) {\n (this.display as unknown as { shader: unknown }).shader = null;\n this.material.destroy();\n this.material = null;\n }\n return this.material;\n }\n\n destroy(): void {\n this.setLit(false);\n this.setBlur(0);\n this.display.destroy();\n this.rt?.destroy(true);\n this.rt = null;\n this.flushRetired();\n }\n\n private flushRetired(): void {\n for (const t of this.retired) t.destroy(true);\n this.retired = [];\n }\n\n private hide(): void {\n this.display.visible = false;\n }\n\n /**\n * Texture size for content of w×h. An existing texture is kept while it is at\n * least that big and at most 2x too big, so content whose bounds change every\n * frame (typewriter text, growing shapes) does not reallocate each frame.\n */\n private sizeFor(w: number, h: number): TextureSize {\n const cur = this.size;\n if (cur && cur.w >= w && cur.h >= h && cur.w <= 2 * w && cur.h <= 2 * h) return cur;\n const resolution = Math.min(\n SUPERSAMPLE,\n MAX_TEXTURE_SIZE / Math.max(w, h),\n Math.sqrt(MAX_TEXTURE_PIXELS / (w * h)),\n );\n const antialias = w * h * resolution * resolution <= ANTIALIAS_MAX_PIXELS;\n return { w, h, resolution, antialias };\n }\n\n private ensureTexture(size: TextureSize): void {\n if (this.rt && this.size === size) return;\n // Same sampling: resize the texture where it is. Replacing it makes Pixi warn that the old one was\n // destroyed while still bound, because the mesh keeps pointing at it until the next render.\n if (this.rt && this.size && this.size.antialias === size.antialias) {\n this.rt.resize(size.w, size.h, size.resolution);\n this.size = size;\n return;\n }\n const next = RenderTexture.create({\n width: size.w, height: size.h, resolution: size.resolution, antialias: size.antialias,\n });\n this.display.texture = next;\n if (this.rt) this.retired.push(this.rt);\n this.rt = next;\n this.size = size;\n }\n}\n","import { collectPropKeys } from './specKeys';\nimport { describeLayer } from '../core/lint';\nimport { focusProblems } from './focus';\nimport { fogProblems, lightLayerProblems } from './lightChecks';\nimport type { SequenceSpec } from '../types';\n\ntype Warn = (message: string) => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\nconst FOV_HINT = 'perspective is the camera\\'s \"fov\" — add a { type: \"camera\" } layer and set fov in its initial / keyframes';\n\nconst DOF_HINT = 'depth of field is the camera\\'s \"focus\" (the plane that is sharp: a layer name or a z) and \"aperture\" (how shallow: 0 = off, 30 = default) — put them in the camera\\'s initial / keyframes';\n\n/** Keys that are never valid for any layer, with a hint at what the author probably meant. */\nconst LAYER_ALIASES: Record<string, string> = {\n rotateX: 'did you mean \"rotationX\"?',\n rotateY: 'did you mean \"rotationY\"?',\n rotateZ: 'did you mean \"rotation\"?',\n rotationZ: 'did you mean \"rotation\" (it is the Z rotation)?',\n translateZ: 'did you mean \"z\"?',\n depth: 'did you mean \"z\"?',\n posZ: 'did you mean \"z\"?',\n perspective: FOV_HINT,\n zoom: FOV_HINT,\n};\n\n/** Camera-only mistakes. */\nconst CAMERA_ALIASES: Record<string, string> = {\n pointOfInterest: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n lookAt: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n depthOfField: DOF_HINT, dof: DOF_HINT, focalDistance: DOF_HINT, focusDistance: DOF_HINT, fStop: DOF_HINT, blurAmount: DOF_HINT,\n};\n\nconst CAMERA_PROPS = ['x', 'y', 'z', 'fov', 'focus', 'aperture', 'lookAtX', 'lookAtY', 'lookAtZ', 'offsetX', 'offsetY', 'offsetZ', 'lookOffsetX', 'lookOffsetY', 'lookOffsetZ', 'fogNear', 'fogFar', 'fogColor', 'fogAmount'];\nconst NEEDS_THREE_D = ['z', 'rotationX', 'rotationY'];\n/** Camera-only names that the animatable-property check lets through on any layer. */\nconst CAMERA_ONLY = ['focus', 'aperture', 'fogNear', 'fogFar', 'fogColor', 'fogAmount'];\nconst SKEW_KEYS = ['skew', 'skewX', 'skewY'];\n\n/**\n * Warn (never throw) about the inputs an AI author is most likely to get wrong,\n * with a message that says what to change. One call per layer, at build time.\n */\nexport function lintSequence(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const keys = collectPropKeys(spec);\n const explained = new Set<string>();\n\n for (const k of keys) {\n const hint = LAYER_ALIASES[k] ?? (spec.type === 'camera' ? CAMERA_ALIASES[k] : undefined);\n if (hint) {\n explained.add(k);\n warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint}`);\n }\n }\n\n if (spec.type === 'light') {\n for (const m of lightLayerProblems(spec)) warn(`pixi-effects: ${who}: ${m}`);\n return;\n }\n\n if (spec.type === 'camera') {\n for (const m of fogProblems(spec)) warn(`pixi-effects: ${who}: ${m}`);\n const raw = spec as unknown as Record<string, unknown>;\n for (const p of CAMERA_PROPS) {\n if (p in raw) warn(`pixi-effects: ${who}: \"${p}\" must go inside initial / keyframes, not on the camera itself`);\n }\n for (const k of Object.keys(raw)) {\n const hint = CAMERA_ALIASES[k] ?? LAYER_ALIASES[k];\n if (hint) warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint} (inside initial)`);\n }\n for (const k of keys) {\n if (!explained.has(k) && !CAMERA_PROPS.includes(k)) {\n warn(`pixi-effects: ${who}: \"${k}\" has no effect on a camera (use ${CAMERA_PROPS.join(', ')})`);\n }\n }\n return;\n }\n\n for (const k of CAMERA_ONLY) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" is a camera property and does nothing on this layer: write it in the initial / keyframes of a { type: 'camera' } layer`);\n }\n\n if (spec.type === 'audio') {\n if (spec.threeD) warn(`pixi-effects: ${who}: threeD has no effect on audio`);\n return;\n }\n\n if (!spec.threeD) {\n for (const k of NEEDS_THREE_D) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" needs threeD: true (it is ignored otherwise)`);\n }\n } else {\n for (const k of SKEW_KEYS) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" is ignored on threeD layers`);\n }\n }\n}\n\n/** The layer names a camera's `focus` points at: missing, not threeD, or with a z that moves later. One call per camera, at build time. */\nexport function lintFocus(camera: SequenceSpec, siblings: readonly SequenceSpec[], warn: Warn = defaultWarn): void {\n if (camera.type !== 'camera') return;\n const who = describeLayer(camera);\n for (const p of focusProblems(camera, siblings)) {\n if (p.kind === 'missing') {\n warn(`pixi-effects: ${who}: focus: no layer named \"${p.name}\"${p.hint ? `; did you mean \"${p.hint}\"?` : ''} (the z = 0 plane is used). Write a threeD layer's name or a z number`);\n } else if (p.kind === 'not-threeD') {\n warn(`pixi-effects: ${who}: focus \"${p.name}\" is not a threeD layer, so it has no depth (the z = 0 plane is used). Write a threeD layer's name or a z number`);\n } else if (p.kind === 'duplicate') {\n warn(`pixi-effects: ${who}: focus \"${p.name}\": ${p.count} layers are named \"${p.name}\"; the first threeD one is used. Give the layers different names`);\n } else {\n warn(`pixi-effects: ${who}: focus \"${p.name}\" reads only the first z of that layer; its z moves later and the focus does not follow. Animate focus itself with numbers to follow it`);\n }\n }\n}\n","import { suggestName } from './options';\nimport type { SequenceSpec } from '../types';\n\nexport const MATTE_CHANNELS = ['alpha', 'luma'] as const;\n\n/** One matte a layer is cut by: another layer of the same composition, read by its alpha or its brightness, optionally inverted (1 − matte). */\nexport interface MatteRef { layer: string; channel: 'alpha' | 'luma'; invert: boolean }\n\nexport type MaskSource =\n | { kind: 'none' }\n | { kind: 'inline'; spec: Record<string, unknown>; channel: 'alpha' | 'luma'; invert: boolean; problems: string[] }\n | { kind: 'refs'; refs: MatteRef[]; problems: string[] };\n\nconst isObject = (v: unknown): v is Record<string, unknown> => !!v && typeof v === 'object' && !Array.isArray(v);\nconst isLayerSpec = (v: unknown): v is Record<string, unknown> => isObject(v) && typeof v.type === 'string';\n\n/** The `channel` and `invert` of a `{ layer, channel, invert }` mask, with a sentence for each wrong value (the default is used). */\nfunction matteOptions(r: Record<string, unknown>, label: string): { channel: 'alpha' | 'luma'; invert: boolean; problems: string[] } {\n const problems: string[] = [];\n let channel: 'alpha' | 'luma' = 'alpha';\n if (r.channel !== undefined) {\n if (r.channel === 'alpha' || r.channel === 'luma') channel = r.channel;\n else {\n const guess = typeof r.channel === 'string' ? suggestName(r.channel, MATTE_CHANNELS) : null;\n const alias = typeof r.channel === 'string' && ['luminance', 'brightness', 'grayscale', 'greyscale', 'gray', 'grey', 'value'].includes(r.channel.toLowerCase()) ? 'luma' : null;\n const meant = guess ?? alias;\n problems.push(`${label}: channel ${JSON.stringify(r.channel)} is not a matte channel${meant ? `; did you mean \"${meant}\"?` : ''} (use alpha or luma); alpha is used`);\n }\n }\n let invert = false;\n if (r.invert !== undefined) {\n if (typeof r.invert === 'boolean') invert = r.invert;\n else problems.push(`${label}: invert must be true or false (got ${JSON.stringify(r.invert)}); false is used`);\n }\n return { channel, invert, problems };\n}\n\n/**\n * What a layer's `mask` value is: nothing; a layer written in place (a layer spec, or `{ layer: <a layer spec>, channel?, invert? }`); or references\n * to other layers by name.\n */\nexport function maskSourceOf(mask: unknown): MaskSource {\n if (isLayerSpec(mask)) return { kind: 'inline', spec: mask, channel: 'alpha', invert: false, problems: [] };\n if (isObject(mask) && isLayerSpec(mask.layer)) return { kind: 'inline', spec: mask.layer, ...matteOptions(mask, 'mask (written in place)') };\n if (isObject(mask) && isObject(mask.layer)) return { kind: 'refs', refs: [], problems: ['mask: `layer` is an object with no `type`, so it is neither a layer written in place (it needs a `type`, such as \\'shape\\') nor the name of another layer (a string); the layer is drawn without a mask'] };\n const problems: string[] = [];\n const refs: MatteRef[] = [];\n const one = (r: unknown, inList: boolean): void => {\n if (typeof r === 'string') { refs.push({ layer: r, channel: 'alpha', invert: false }); return; }\n if (isLayerSpec(r) || (isObject(r) && isLayerSpec(r.layer))) {\n if (inList) problems.push('a layer written inside a list of masks is ignored: give that layer a name and write the name');\n return;\n }\n if (isObject(r) && typeof r.layer === 'string') {\n const o = matteOptions(r, `mask \"${r.layer}\"`);\n problems.push(...o.problems);\n refs.push({ layer: r.layer, channel: o.channel, invert: o.invert });\n }\n };\n if (Array.isArray(mask)) for (const r of mask) one(r, true);\n else one(mask, false);\n return refs.length || problems.length ? { kind: 'refs', refs, problems } : { kind: 'none' };\n}\n\n/** The names of the layers a `mask` value points at, each once, in order. */\nexport function refNames(mask: unknown): string[] {\n const s = maskSourceOf(mask);\n return s.kind === 'refs' ? [...new Set(s.refs.map(r => r.layer))] : [];\n}\n\n/**\n * Does the layer's inline `mask` go through the matte filter? An inverted mask (`invert: true`), a luma one, and a text, image or video mask, are read by their alpha\n * (a stencil would be the bounding box); they used to be Pixi alpha masks, inside which a blend mode applied to nothing. A plain shape mask\n * stays the cheap stencil.\n */\nexport function usesMatteRoute(spec: { mask?: unknown }): boolean {\n const s = maskSourceOf(spec.mask);\n if (s.kind !== 'inline') return false;\n const t = s.spec.type;\n return s.invert || s.channel === 'luma' || t === 'text' || t === 'image' || t === 'video' || t === 'shader' || t === 'canvas'; // a sprite-backed mask: a stencil would paint it over the layer\n}\n\n/** More mattes than this in one composition warns (each is a full-composition texture). */\nexport const MANY_MATTES = 8;\n\ntype Timed = { at?: number; duration?: number };\nconst startOf = (s: Timed): number => Math.max(0, s.at ?? 0);\nconst endOf = (s: Timed, span: number): number => (s.duration === undefined ? span : (s.at ?? 0) + s.duration);\nconst num = (n: number): string => String(Number(n.toFixed(3)));\n\n/** A layer can be a matte only if it draws something: not a camera, an audio layer, a null layer or a threeD layer. */\nexport function canBeMatte(spec: { type: string; threeD?: boolean }): boolean {\n return spec.type !== 'camera' && spec.type !== 'audio' && spec.type !== 'null' && !spec.threeD;\n}\n\n/**\n * What is wrong with a layer's `mask` references, as sentences (the caller puts `pixi-effects: layer \"x\": ` in front). `siblings` are the layers\n * of the same composition (the layer itself among them); `span` is the composition's length in seconds.\n */\nexport function matteProblems(layer: SequenceSpec, siblings: readonly SequenceSpec[], span: number): string[] {\n const src = maskSourceOf((layer as { mask?: unknown }).mask);\n if (src.kind === 'inline') return [...src.problems];\n if (src.kind !== 'refs') return [];\n const out: string[] = [...src.problems];\n const names = siblings.filter(s => s.name && s.type !== 'camera').map(s => s.name!);\n if (layer.parent && src.refs.length) {\n out.push(`it has a parent, so it is drawn in the null layer's space and the matte is in the composition's: mask the null layer (\"${layer.parent}\") instead`);\n }\n for (const ref of src.refs) {\n if (ref.layer === layer.name) { out.push(`mask \"${ref.layer}\": the layer masks itself; use another layer`); continue; }\n const same = siblings.filter(s => s.name === ref.layer && s.type !== 'camera');\n if (same.length === 0) {\n const guess = suggestName(ref.layer, names.filter(n => n !== layer.name));\n out.push(`mask \"${ref.layer}\": no layer with that name${guess ? `; did you mean \"${guess}\"?` : ''} (a matte is another layer of the same composition; the layer is drawn without it)`);\n continue;\n }\n if (same.length > 1) out.push(`mask \"${ref.layer}\": ${same.length} layers are named \"${ref.layer}\"; the first is used`);\n const matte = same[0]!;\n if (!canBeMatte(matte)) {\n const what = matte.threeD ? 'a threeD layer' : matte.type === 'audio' ? 'an audio layer (it draws nothing)' : 'a null layer (it draws nothing)';\n out.push(`mask \"${ref.layer}\": \"${ref.layer}\" is ${what} and cannot be a matte (the layer is drawn without it)`);\n continue;\n }\n if (maskSourceOf((matte as { mask?: unknown }).mask).kind !== 'none') out.push(`mask \"${ref.layer}\": \"${ref.layer}\" has a mask of its own, which is ignored when it is used as a matte`);\n // the matte is on screen from its own at / duration; where it is not, the layer is cut by nothing and so invisible\n const ms = startOf(matte), me = endOf(matte, span), ls = startOf(layer), le = endOf(layer, span);\n if (ms > ls + 1e-6 || me < le - 1e-6) {\n out.push(`mask \"${ref.layer}\": \"${ref.layer}\" is on screen from ${num(ms)}s to ${num(me)}s but the layer from ${num(ls)}s to ${num(le)}s: where the matte is missing the layer is invisible (give the matte the layer's at and duration, or a longer one)`);\n }\n }\n return out;\n}\n","/**\n * A track matte as a filter. The matte layer is drawn once per frame into a texture the size of its composition (`MatteSet`); a hidden Sprite\n * showing that texture sits in the composition's inner container, so its worldTransform says where the matte is on screen. The filter maps each\n * pixel of its input (the matted layer, already drawn offscreen by Pixi's filter system) to that sprite's texture with `calculateSpriteMatrix`\n * (the way DisplacementFilter does, which works anywhere in a chain, not only as the last filter), reads the matte's alpha, or its brightness\n * (Rec. 709 weights on the premultiplied colour: a transparent matte is black), and multiplies the layer by it (`invert`: by 1 − that).\n * Several mattes are several filters in a row (intersect). A blend mode, when the layer has one, is a filter after these: the blend is the last pass.\n */\nimport { Filter, GlProgram, GpuProgram, Matrix, UniformGroup, type Sprite } from 'pixi.js';\n\nconst VERT = `in vec2 aPosition;\nout vec2 vTextureCoord;\nout vec2 vMatteUv;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nuniform mat3 uMatteMatrix;\nvoid main(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition * (uOutputFrame.zw * uInputSize.zw);\n vMatteUv = (uMatteMatrix * vec3(vTextureCoord, 1.0)).xy;\n}`;\n\nconst FRAG = `in vec2 vTextureCoord;\nin vec2 vMatteUv;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform sampler2D uMatteTexture;\nuniform float uLuma;\nuniform float uInvert;\nvoid main(void) {\n vec4 src = texture(uTexture, vTextureCoord);\n vec4 m = texture(uMatteTexture, vMatteUv);\n // outside the matte texture there is no matte: the clamp-to-edge sampler would repeat the border\n float inside = step(0.0, vMatteUv.x) * step(0.0, vMatteUv.y) * step(vMatteUv.x, 1.0) * step(vMatteUv.y, 1.0);\n m *= inside;\n // luma of the premultiplied colour = luma(colour) * alpha: a transparent matte counts as black (Rec. 709 weights)\n float v = uLuma > 0.5 ? dot(m.rgb, vec3(0.2126, 0.7152, 0.0722)) : m.a;\n if (uInvert > 0.5) v = 1.0 - v;\n finalColor = src * v;\n}`;\n\nconst WGSL = `\nstruct GlobalFilterUniforms {\n uInputSize:vec4<f32>,\n uInputPixel:vec4<f32>,\n uInputClamp:vec4<f32>,\n uOutputFrame:vec4<f32>,\n uGlobalFrame:vec4<f32>,\n uOutputTexture:vec4<f32>,\n};\nstruct MatteUniforms {\n uMatteMatrix:mat3x3<f32>,\n uLuma:f32,\n uInvert:f32,\n};\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;\n@group(0) @binding(1) var uTexture: texture_2d<f32>;\n@group(0) @binding(2) var uSampler : sampler;\n@group(1) @binding(0) var<uniform> matteUniforms : MatteUniforms;\n@group(1) @binding(1) var uMatteTexture: texture_2d<f32>;\n@group(1) @binding(2) var uMatteSampler : sampler;\n\nstruct VSOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv : vec2<f32>,\n @location(1) matteUv : vec2<f32>,\n };\n\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput {\n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;\n let uv = aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);\n let matteUv = (matteUniforms.uMatteMatrix * vec3<f32>(uv, 1.0)).xy;\n return VSOutput(vec4<f32>(position, 0.0, 1.0), uv, matteUv);\n}\n\n@fragment\nfn mainFragment(\n @location(0) uv: vec2<f32>,\n @location(1) matteUv: vec2<f32>,\n) -> @location(0) vec4<f32> {\n let src = textureSample(uTexture, uSampler, uv);\n var m = textureSample(uMatteTexture, uMatteSampler, matteUv);\n let inside = step(0.0, matteUv.x) * step(0.0, matteUv.y) * step(matteUv.x, 1.0) * step(matteUv.y, 1.0);\n m = m * inside;\n var v = select(m.a, dot(m.rgb, vec3<f32>(0.2126, 0.7152, 0.0722)), matteUniforms.uLuma > 0.5);\n if (matteUniforms.uInvert > 0.5) { v = 1.0 - v; }\n return src * v;\n}`;\n\n/** The part of Pixi's FilterSystem this filter uses. */\ninterface MatteFilterManager {\n calculateSpriteMatrix(out: Matrix, sprite: Sprite): Matrix;\n applyFilter(filter: Filter, input: never, output: never, clearMode: never): void;\n}\n\nexport interface MatteFilterOptions { sprite: Sprite; channel?: 'alpha' | 'luma'; invert?: boolean }\n\nexport class MatteFilter extends Filter {\n private readonly _sprite: Sprite;\n constructor({ sprite, channel = 'alpha', invert = false }: MatteFilterOptions) {\n const source = sprite.texture.source;\n super({\n glProgram: GlProgram.from({ vertex: VERT, fragment: FRAG, name: 'pe-matte-filter' }),\n gpuProgram: GpuProgram.from({ vertex: { source: WGSL, entryPoint: 'mainVertex' }, fragment: { source: WGSL, entryPoint: 'mainFragment' } }),\n resources: {\n matteUniforms: new UniformGroup({\n uMatteMatrix: { value: new Matrix(), type: 'mat3x3<f32>' },\n uLuma: { value: channel === 'luma' ? 1 : 0, type: 'f32' },\n uInvert: { value: invert ? 1 : 0, type: 'f32' },\n }),\n uMatteTexture: source,\n uMatteSampler: source.style,\n },\n });\n this._sprite = sprite;\n }\n\n override apply(filterManager: MatteFilterManager, input: never, output: never, clearMode: never): void {\n const u = this.resources.matteUniforms.uniforms;\n filterManager.calculateSpriteMatrix(u.uMatteMatrix, this._sprite);\n this.resources.uMatteTexture = this._sprite.texture.source;\n filterManager.applyFilter(this, input, output, clearMode);\n }\n}\n","import { Container, Matrix, RenderTexture, Sprite } from 'pixi.js';\nimport { MatteFilter } from '../filters/Matte';\nimport type { Sequence } from '../sequences/Base';\nimport type { SpaceHost } from '../space/Layer3D';\n\nconst EMPTY = new Container();\n\ninterface Matte { seq: Sequence; chain: Sequence[]; rt: RenderTexture; sprite: Sprite }\n\n/**\n * The mattes of one composition: each is a layer drawn, once per frame, into a texture the size of the composition. A hidden sprite showing\n * the texture sits in the composition's inner container (so its world transform says where the texture is on screen) and the matted layers'\n * `MatteFilter`s read it. Nothing here remembers a frame: the texture is redrawn from the state the timeline just set.\n */\nexport class MatteSet {\n private readonly mattes = new Map<string, Matte>();\n private readonly sources = new Set<Sequence>();\n\n constructor(private readonly inner: Container, private readonly width: number, private readonly height: number) {}\n\n get size(): number { return this.mattes.size; }\n has(key: string): boolean { return this.mattes.has(key); }\n /** Is this layer a matte's source (so it is not drawn on screen)? */\n isSource(seq: Sequence): boolean { return this.sources.has(seq); }\n\n /** `chain`: the null layers the source sits in, nearest first (the source is in no container, so their transforms are composed by hand). */\n add(key: string, seq: Sequence, chain: Sequence[] = []): void {\n if (this.mattes.has(key)) return;\n const rt = RenderTexture.create({ width: this.width, height: this.height, resolution: 1, antialias: true });\n const sprite = new Sprite(rt);\n sprite.renderable = false; // only its worldTransform is used: where the texture sits on screen\n this.inner.addChild(sprite);\n this.mattes.set(key, { seq, chain, rt, sprite });\n this.sources.add(seq);\n }\n\n filterFor(key: string, opts: { channel: 'alpha' | 'luma'; invert: boolean }): MatteFilter | null {\n const m = this.mattes.get(key);\n return m ? new MatteFilter({ sprite: m.sprite, channel: opts.channel, invert: opts.invert }) : null;\n }\n\n /** Draw every matte into its texture from the state the timeline has just set; a hidden matte is an empty texture (it cuts everything away). */\n render(host: SpaceHost): void {\n for (const { seq, chain, rt } of this.mattes.values()) {\n const target = seq.target;\n if (target && target.renderable && target.visible) {\n target.updateLocalTransform();\n const m = target.localTransform.clone();\n for (const p of chain) { p.target?.updateLocalTransform(); if (p.target) m.prepend(p.target.localTransform); }\n host.render({ container: target, target: rt, transform: m, clear: true, clearColor: [0, 0, 0, 0] });\n } else {\n host.render({ container: EMPTY, target: rt, transform: new Matrix(), clear: true, clearColor: [0, 0, 0, 0] });\n }\n }\n }\n\n destroy(): void {\n for (const m of this.mattes.values()) { m.sprite.destroy(); m.rt.destroy(true); }\n this.mattes.clear();\n this.sources.clear();\n }\n}\n","import { Container, Rectangle } from 'pixi.js';\nimport { createTimeline, type Timeline } from '../core/timelineEngine';\nimport { Sequence } from './Base';\nimport { NullSequence } from './Null';\nimport { suggestName } from '../core/options';\nimport { buildSequenceTree } from '../core/Composition';\nimport { CameraSequence } from '../space/CameraSequence';\nimport { LightSequence } from '../space/LightSequence';\nimport { lightSetProblems } from '../space/lightChecks';\nimport { MAX_CASTERS, lightLevel, packLights, type LightState } from '../space/lighting';\nimport type { CasterInput } from '../space/LitMaterial';\nimport { findOverlap, pickActiveCamera } from '../space/camera';\nimport { assignDepthOrder } from '../space/depth';\nimport { Layer3D, type SpaceHost } from '../space/Layer3D';\nimport { lintSequence, lintFocus } from '../space/lint';\nimport { layerInitialZ, blurRadius, MANY_BLURRED } from '../space/focus';\nimport { matteProblems, maskSourceOf, refNames, usesMatteRoute, canBeMatte, MANY_MATTES } from '../core/matte';\nimport { MatteSet } from '../core/MatteSet';\nimport { describeLayer, lintText, lintTiming, summarizeWarnings, lintKeys } from '../core/lint';\nimport { applyBlendMode, maxConcurrentAdvanced, MANY_ADVANCED, type BlendReport } from '../core/blend';\nimport { cameraBasis, homeCamera, projectPoint, NEAR, type CameraBasis, type CameraState } from '../space/math';\nimport { timeRemapOf, remapOf, contentLength, bindClock, clockTable, type TimeRemap, type ClockTable } from '../core/remap';\nimport type { CompositionSequenceSpec, AudioDescriptor, CompositionShape, SequenceSpec, SpaceNow } from '../types';\n\n\n\nexport class CompositionSequence extends Sequence {\n declare spec: CompositionSequenceSpec;\n private _innerContainer: Container | null = null;\n private _compositionShape: CompositionShape | null = null;\n _children: Sequence[] = [];\n private _cameras: CameraSequence[] = [];\n private _lights: LightSequence[] = [];\n /** The lights alive and the camera position of the last lit frame (what `inspect` reads: a layer's light level is computed from them on demand). */\n private _lighting: { states: LightState[]; cam: { x: number; y: number; z: number } } | null = null;\n private _layers3d: Layer3D[] = [];\n private _dofSaid = { behind: false, many: false };\n /** What this composition made for blend modes (filters added to layers' chains, groups and their carrier filters): destroyed with it. */\n private _blendOwned: Array<{ destroy(): void }> = [];\n /** The mattes (layers drawn into textures that cut other layers), when any layer of this composition names or has one. */\n private _mattes: MatteSet | null = null;\n private _inlineMattes = 0;\n /** Drawn children in stack order (cameras and target-less sequences excluded). */\n private _visual: Array<{ seq: Sequence; layer: Layer3D | null }> = [];\n /** Layers drawn inside a null layer (`parent`): they are not in the composition's own stack. */\n private _nested: Sequence[] = [];\n /** The null layer each parented layer is drawn inside. */\n private _parentOf = new Map<Sequence, NullSequence>();\n /** Set when this composition's own time is remapped: the children live on `_inner` in LOCAL time, driven by `_clock`. */\n private _inner: Timeline | null = null;\n private _clock: { time: number } | null = null;\n private _remap: TimeRemap | null = null;\n private _childBase = 0;\n private _contentSpan = 0;\n\n /** Where the children's time starts: the composition's absolute start, or 0 when their time is local (remapped). */\n get childBase(): number { return this._childBase; }\n /** How long the children's time runs: the composition's duration, or its content length when its time is remapped. */\n get contentSpan(): number { return this._contentSpan; }\n /** The time the children live in at movie time `t`: the movie's own, or this composition's local clock when it is remapped. */\n childTime(t: number): number { return this._clock ? this._clock.time : t; }\n /** The clock reader for filters that want the time (grain), or null when the children run on the movie's time. */\n localClock(): (() => number) | null { return this._clock ? () => this._clock!.time : null; }\n /** How the time is remapped, for the timeline chart: `×0.5`, `×-1`, `time keyframes`, or null. */\n remapLabel(): string | null {\n const r = this._remap;\n if (!r) return null;\n return r.timeKfs.length ? 'time keyframes' : `×${r.speed ?? 1}`;\n }\n\n async build(): Promise<void> {\n const width = this.spec.width ?? this.parent?.width ?? this.root.width;\n const height = this.spec.height ?? this.parent?.height ?? this.root.height;\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? this.parent?.duration ?? this.root.duration;\n }\n const wrapper = new Container();\n wrapper.cullable = true;\n wrapper.cullableChildren = true;\n wrapper.cullArea = new Rectangle(0, 0, width, height);\n\n const inner = new Container();\n inner.cullable = true;\n inner.cullableChildren = true;\n wrapper.addChild(inner);\n\n this.target = wrapper;\n this.intrinsicWidth = width;\n this.intrinsicHeight = height;\n this._innerContainer = inner;\n // A remapped composition's children live in LOCAL time, which can run past the composition's own duration (speed 2 reads twice as far).\n const base = timeRemapOf(this.spec as never);\n const span = base ? contentLength(base, this.duration) : this.duration;\n this._remap = base ? remapOf(this.spec as never, 'time', span) : null;\n this._contentSpan = span;\n this._compositionShape = { width, height, duration: span, spaceAt: (t) => this._spaceAt(t) };\n\n const lateKeyframes: string[] = [];\n for (const s of this.spec.sequences ?? []) {\n lintSequence(s);\n lintFocus(s, this.spec.sequences ?? []);\n for (const message of matteProblems(s, this.spec.sequences ?? [], span)) console.warn(`pixi-effects: ${describeLayer(s)}: ${message}`);\n lintTiming(s, span, (message, kind) => (kind === 'late-keyframe' ? lateKeyframes.push(message) : console.warn(message)));\n lintText(s);\n lintKeys(s);\n }\n for (const message of summarizeWarnings(lateKeyframes)) console.warn(message);\n const crowd = maxConcurrentAdvanced((this.spec.sequences ?? []) as Array<{ at?: number; duration?: number; blendMode?: unknown; type?: string; sequences?: unknown }>, span);\n if (crowd >= MANY_ADVANCED) {\n console.warn(`pixi-effects: ${describeLayer(this.spec)}: ${crowd} layers with an advanced blendMode are on screen at once (a composition with one counts each layer inside it, since its children blend one by one); each is a full-frame pass (about 2 ms on WebGL). Put fewer layers in the blend (or draw the glow as one layer), or use add / screen / multiply`);\n }\n\n this._children = await buildSequenceTree(\n this.spec.sequences ?? [],\n this._compositionShape,\n this.root,\n );\n this._resolveParents();\n // Named mattes: a layer that another layer names in `mask` is drawn into a texture (once per frame), not on screen\n const matteNames = new Set<string>();\n for (const c of this._children) for (const n of refNames((c.spec as { mask?: unknown }).mask)) matteNames.add(n);\n if (matteNames.size > 0) {\n this._mattes = new MatteSet(inner, width, height);\n for (const name of matteNames) {\n // the first layer of that name, as matteProblems says: if it cannot be a matte (threeD, audio, null) the layer is drawn without one\n const source = this._children.find(c => c.spec.name === name && !(c instanceof CameraSequence));\n if (!source || !source.target || !canBeMatte(source.spec)) continue; // matteProblems has said why\n const chain: Sequence[] = [];\n for (let p = this._parentOf.get(source); p; p = this._parentOf.get(p)) chain.push(p);\n this._mattes.add(name, source, chain);\n }\n }\n // Lights taken together (no ambient light, shadows half set, too many lights or casters): said once per composition, only when it has a light\n if (this._children.some(c => c instanceof LightSequence)) {\n for (const message of lightSetProblems((this.spec.sequences ?? []) as SequenceSpec[])) console.warn(`pixi-effects: ${describeLayer(this.spec)}: ${message}`);\n }\n // A camera's `focus: \"title\"` becomes that layer's first z, here, where the siblings exist (a camera sees only its parent's shape)\n const layerNames = new Set(this._children.map(c => c.spec.name).filter((n): n is string => !!n));\n for (const cam of this._children) {\n if (!(cam instanceof CameraSequence)) continue;\n cam.resolveFocusNames(name => {\n const hit = this._children.find(c => c.spec.name === name && c.spec.threeD);\n return hit ? layerInitialZ(hit.spec, hit.scope() as unknown as Record<string, number>) : undefined;\n }, layerNames);\n }\n // What is said about blend modes is collected per build: the same mistake in 300 particle layers is one warning (\"and 299 more\")\n const blendSaid = new Map<string, { spec: { name?: string; type: string }; n: number }>();\n const report: BlendReport = (message, spec) => {\n const seen = blendSaid.get(message);\n if (seen) seen.n++; else blendSaid.set(message, { spec, n: 1 });\n };\n for (const child of this._children) {\n // Cameras are display-less: they only feed the projection pass.\n if (child instanceof CameraSequence) {\n this._cameras.push(child);\n continue;\n }\n if (child instanceof LightSequence) { this._lights.push(child); continue; } // a light has no picture: it feeds the lit layers' shading\n if (!child.target) continue;\n if (this._mattes?.isSource(child)) continue; // a matte is drawn into its texture, not on screen\n const holder = this._parentOf.get(child);\n const into = holder?.target ?? inner; // a layer with `parent` is drawn inside its null layer\n\n const maskSrc = maskSourceOf((child.spec as { mask?: unknown }).mask);\n\n // threeD layers never enter the scene graph themselves: their display\n // object is rendered into a texture and a perspective mesh stands in.\n if (child.spec.threeD) {\n const layer = new Layer3D(child, frameOf(child));\n inner.addChild(layer.display);\n this._layers3d.push(layer);\n this._visual.push({ seq: child, layer });\n const added3d = applyBlendMode(child.spec, layer.display, report);\n if (added3d) this._blendOwned.push(added3d);\n if (maskSrc.kind !== 'none') {\n console.warn(`pixi-effects: ${describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);\n }\n continue;\n }\n\n into.addChild(child.target);\n if (holder) this._nested.push(child);\n else this._visual.push({ seq: child, layer: null });\n\n // The matte filters of this layer: one for each reference, or one for an inline mask that is read by its alpha (an inverted mask, a text,\n // image or video mask: a stencil would be the bounding box). They end the layer's filter chain, after its own filters and before the blend.\n const matteFilters: Array<{ destroy(): void }> = [];\n if (maskSrc.kind === 'refs' && this._mattes) {\n for (const ref of maskSrc.refs) {\n const f = this._mattes.filterFor(ref.layer, { channel: ref.channel, invert: ref.invert });\n if (f) matteFilters.push(f);\n }\n }\n if (maskSrc.kind === 'inline') {\n const maskSpec = maskSrc.spec as unknown as SequenceSpec;\n // The mask lives and animates with the layer it masks: with no `at` of its own its `at` and `duration` are the layer's, so its keyframes\n // are measured from the layer's start too. An explicit `at` is composition time, exactly like a layer's.\n const lifetime = maskSpec.at === undefined ? { at: child.at, duration: maskSpec.duration ?? child.duration } : {};\n const built = await buildSequenceTree([{ ...maskSpec, ...lifetime } as SequenceSpec], this._compositionShape, this.root);\n const maskSeq = built[0];\n if (maskSeq?.target) {\n child.maskSequence = maskSeq; // bound to the timeline, synced and destroyed with the layer\n if (usesMatteRoute(child.spec)) {\n if (!this._mattes) this._mattes = new MatteSet(inner, width, height);\n const key = `\\u0000inline-${this._inlineMattes++}`;\n const chain: Sequence[] = []; // the mask is in the layer's space: the null layers it sits in move it too\n for (let p = this._parentOf.get(child); p; p = this._parentOf.get(p)) chain.push(p);\n this._mattes.add(key, maskSeq, chain); // drawn into a texture of its own each frame, not on screen\n const f = this._mattes.filterFor(key, { channel: maskSrc.channel, invert: maskSrc.invert });\n if (f) matteFilters.push(f);\n } else {\n // a plain shape mask is a stencil: the mask's geometry (cheap, and the canvas anti-aliasing makes its edge)\n into.addChild(maskSeq.target);\n const t = child.target as Container & { setMask?: (opts: { mask: Container | null; inverse?: boolean }) => void; mask: Container | null };\n if (typeof t.setMask === 'function') t.setMask({ mask: maskSeq.target, inverse: false });\n else t.mask = maskSeq.target;\n }\n }\n }\n if (matteFilters.length > 0) {\n const t = child.target as unknown as { filters: unknown };\n t.filters = [...(Array.isArray(t.filters) ? t.filters : []), ...matteFilters];\n this._blendOwned.push(...matteFilters);\n }\n const added = applyBlendMode(child.spec, child.target, report);\n if (added) this._blendOwned.push(added);\n }\n\n if (this._mattes && this._mattes.size > MANY_MATTES) {\n console.warn(`pixi-effects: ${describeLayer(this.spec)}: ${this._mattes.size} mattes: each is a ${width}×${height} texture (about ${Math.round(width * height * 4 / 1048576)} MiB, more with anti-aliasing). Share one matte between layers, or use fewer`);\n }\n\n for (const [message, seen] of blendSaid) {\n console.warn(`pixi-effects: ${describeLayer(seen.spec)}: ${message}${seen.n > 1 ? ` (and ${seen.n - 1} more layers have the same mistake)` : ''}`);\n }\n\n if (this._layers3d.length > 0) {\n // Stack order becomes explicit zIndex so threeD layers can be re-sorted\n // by depth each frame without reparenting.\n inner.sortableChildren = true;\n this._visual.forEach((v, i) => {\n (v.layer?.display ?? v.seq.target!).zIndex = i;\n });\n } else if (this._cameras.length > 0 && !this._children.some(c => (c.spec as { followCamera?: boolean }).followCamera)) {\n console.warn('pixi-effects: camera has no effect: this composition has no threeD layers (a three layer with followCamera: true follows it)');\n }\n if (this._layers3d.length === 0 && this._lights.length > 0 && !this._children.some(c => (c.spec as { followLights?: boolean }).followLights)) {\n console.warn(`pixi-effects: ${describeLayer(this.spec)}: a light has no effect: this composition has no threeD layers (a light lights only the threeD layers of its own composition, not those of the compositions nested in it: put the light inside the composition that holds them)`);\n }\n\n this.buildFilters();\n }\n\n protected override displayProps(): { initial: CompositionSequenceSpec['initial']; keyframes: CompositionSequenceSpec['keyframes'] } {\n const r = this._remap;\n return r ? { initial: r.restInitial as CompositionSequenceSpec['initial'], keyframes: r.restKfs } : super.displayProps();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n const remap = this._remap;\n // Children's `at` is relative to this composition's start, so push them forward by our absolute start time on the global\n // timeline. A remapped composition builds them in LOCAL time (offset 0) on a timeline of its own, which the clock drives.\n const childOffset = remap ? 0 : offset + this.at;\n this._childBase = childOffset;\n const target = remap ? createTimeline({ paused: true, defaults: { ease: 'none' } }) : timeline;\n for (const child of this._children) {\n // Each layer builds its tweens in a small timeline of its own, which is added to the parent once, finished: the parent holds\n // one child per layer, and a layer nobody else writes is not visited again while its local time stands still. Positions stay\n // absolute, so the picture at any time is the same.\n const own = createTimeline({ defaults: { ease: 'none' } });\n child.bindTimeline(own, childOffset);\n // The mask shares the maskee's offset — its `at` is interpreted\n // relative to the composition's start, just like the child itself,\n // so a reveal-from-zero animation lines up naturally.\n child.maskSequence?.bindTimeline(own, childOffset);\n target.add(own, 0);\n }\n if (remap) this._bindClock(timeline, target, remap, offset);\n const overlap = findOverlap(this._cameras.map(c => c.window()));\n if (overlap) {\n console.warn(`pixi-effects: cameras #${overlap[0] + 1} and #${overlap[1] + 1} overlap in time; the top-most one wins`);\n }\n }\n\n /** Drive the local timeline `inner` from the clock, and put the clock's tweens on the outer `timeline`. */\n private _bindClock(timeline: Timeline, inner: Timeline, remap: TimeRemap, offset: number): void {\n let last = NaN;\n let cur = 0;\n const clock = {\n get time(): number { return cur; },\n set time(v: number) {\n cur = v;\n if (v === last) return; // a freeze renders nothing\n last = v;\n inner.time(v);\n },\n };\n this._inner = inner;\n this._clock = clock;\n const scope = this.scope() as unknown as Record<string, number>;\n if (remap.start !== undefined && remap.timeKfs.length === 0) clock.time = remap.start;\n bindClock(timeline, clock, 'time', remap, this.duration!, offset + this.at, scope);\n this._warnUnreachable(clockTable(remap, 'time', this.duration!, offset + this.at, scope, offset + this.at + this.duration!), offset + this.at, offset + this.at + this.duration!);\n }\n\n /**\n * A child the clock never dwells in is never visible: say so. Its `at` is in THIS composition's local time, so the usual mistake is\n * writing it in the outer time (or forgetting that speed 0.5 reaches only half as far). Decided by dwell, not by the clock's end\n * points: a clock that arrives at the child's `at` and HOLDS there shows it for the whole hold; one that only touches it in a single\n * instant (speed 0.5, a child at exactly the farthest local time) does not.\n */\n private _warnUnreachable(table: ClockTable, from: number, to: number): void {\n const remap = this._remap!;\n const how = remap.timeKfs.length ? 'time keyframes' : `speed ${remap.speed ?? 1}`;\n const span = this._contentSpan;\n const EPS = 1e-9;\n for (const child of this._children) {\n const at = child.at;\n if (at >= span) continue; // already said by lintTiming (\"starts after its composition ends\")\n const end = Math.min(at + (child.duration ?? span), span);\n let dwell = 0; // 1 ms samples of the clock inside [at, end)\n for (let t = from; t <= to && dwell < 2; t += 0.001) { const v = table.at(t); if (v >= at - EPS && v < end + EPS) dwell++; }\n if (dwell >= 2) continue;\n console.warn(\n `pixi-effects: ${describeLayer(child.spec)} starts at ${at}s of ${describeLayer(this.spec)}'s own time, but its clock only reaches ` +\n `${Number(table.min.toFixed(3))}–${Number(table.max.toFixed(3))}s (${how}), so it is never visible. ` +\n `Layers inside a remapped composition are placed in that composition's local time.`,\n );\n }\n }\n\n /**\n * Drawn children in stack order, with the display object that stands in for each (the mesh for a threeD layer).\n * Null layers draw nothing and are left out; the layers inside them follow, with the null layers that carry them.\n */\n layers(): Array<{ seq: Sequence; display: Container; threeD: boolean; carriers: NullSequence[]; depthBlur: number; light?: number; quad: number[] | null }> {\n const carriersOf = (seq: Sequence): NullSequence[] => {\n const out: NullSequence[] = [];\n for (let p = this._parentOf.get(seq); p; p = this._parentOf.get(p)) out.push(p);\n return out;\n };\n return [...this._visual.map(v => v.seq), ...this._nested]\n .filter(seq => !(seq instanceof NullSequence))\n .map(seq => {\n const layer = this._visual.find(v => v.seq === seq)?.layer ?? null;\n return {\n seq,\n display: (layer?.display ?? seq.target!) as unknown as Container,\n threeD: layer !== null,\n carriers: carriersOf(seq),\n depthBlur: layer?.blur ?? 0,\n quad: layer && layer.display.visible ? layer.corners : null,\n // how lit it is (threeD layers that receive the lights of the last frame only); computed here, not per frame\n light: layer && this._lighting && layer.world && layer.spec.lit !== false ? lightLevel(layer.world, this._lighting.cam, this._lighting.states) : undefined,\n };\n });\n }\n\n /** Match every `parent: 'name'` to a null layer; anything that cannot work is said out loud and drawn unparented. */\n private _resolveParents(): void {\n const nulls = this._children.filter((c): c is NullSequence => c instanceof NullSequence);\n const nullNames = nulls.map(n => n.spec.name).filter((n): n is string => !!n);\n const warned = new Set<string>();\n for (const child of this._children) {\n const want = child.spec.parent;\n if (want === undefined) continue;\n const who = describeLayer(child.spec);\n if (child instanceof CameraSequence) { console.warn(`pixi-effects: ${who}: a camera cannot have a parent; ignored`); continue; }\n if (child instanceof LightSequence) { console.warn(`pixi-effects: ${who}: a light cannot have a parent (parent \"${want}\" ignored: move the light with its own x / y / z keyframes)`); continue; }\n if (child.spec.threeD) { console.warn(`pixi-effects: ${who}: a threeD layer cannot have a parent (parent \"${want}\" ignored)`); continue; }\n const same = this._children.filter(c => c.spec.name === want);\n if (same.length === 0) {\n const hint = suggestName(want, nullNames);\n console.warn(`pixi-effects: ${who}: parent \"${want}\": no layer with that name${hint ? `; did you mean \"${hint}\"?` : ''} (the layer is drawn without a parent)`);\n continue;\n }\n const holder = same.find((c): c is NullSequence => c instanceof NullSequence);\n if (!holder) {\n console.warn(`pixi-effects: ${who}: parent \"${want}\" is a ${same[0]!.spec.type} layer; only { type: 'null' } layers can be parents (the layer is drawn without a parent)`);\n continue;\n }\n if (same.length > 1 && !warned.has(want)) {\n warned.add(want);\n console.warn(`pixi-effects: ${same.length} layers are named \"${want}\"; parent \"${want}\" uses the first null layer with that name`);\n }\n if (holder === child) { console.warn(`pixi-effects: ${who} is its own parent; ignored`); continue; }\n this._parentOf.set(child, holder);\n }\n // a chain that leads back to itself: break it where we find it\n for (const start of this._children) {\n const seen = new Set<Sequence>([start]);\n for (let p = this._parentOf.get(start); p; p = this._parentOf.get(p)) {\n if (p === start) {\n const names = [...seen].map(s => s.spec.name ?? s.spec.type).join(' → ');\n console.warn(`pixi-effects: parent cycle: ${names} → ${start.spec.name ?? start.spec.type}; the parent of \"${start.spec.name ?? start.spec.type}\" is ignored`);\n this._parentOf.delete(start);\n break;\n }\n if (seen.has(p)) break;\n seen.add(p);\n }\n }\n }\n\n override syncFrame(): void {\n super.syncFrame();\n for (const child of this._children) child.syncFrame();\n }\n\n override updateSpace(t: number, host: SpaceHost): void {\n // Inner compositions first: a threeD composition is rendered into its own\n // texture by this level, so its content must already be projected.\n const childT = this.childTime(t);\n for (const child of this._children) child.updateSpace(childT, host);\n this._mattes?.render(host); // every matte, from the state the timeline just set\n if (this._layers3d.length === 0 || !this._compositionShape) return;\n\n const { width, height } = this._compositionShape;\n const compEnd = this._childBase + (this.duration ?? 0);\n const active = pickActiveCamera(\n this._cameras.map(cam => ({ cam, ...cam.window() })),\n childT,\n compEnd,\n );\n const cam = active ? active.cam.state() : homeCamera(width, height);\n const basis = cameraBasis(cam, width, height);\n\n for (const layer of this._layers3d) layer.update(host, basis);\n this._applyLighting(childT, compEnd, basis, active?.cam ?? null);\n this._applyDepthOfField(cam, basis);\n\n const order = assignDepthOrder(\n this._visual.map((v, i) => ({ stackIndex: i, threeD: v.layer !== null, depth: v.layer?.depth ?? 0 })),\n );\n this._visual.forEach((v, i) => {\n if (v.layer) v.layer.display.zIndex = order[i]!;\n });\n }\n\n /** The light layers alive at `t` (their own `at` and `duration`; one that runs to the end of the composition is alive at the last instant too). */\n private _liveLights(t: number, compEnd: number): LightSequence[] {\n return this._lights.filter(l => { const w = l.window(); return t >= w.start && (t < w.end || (w.end >= compEnd && t <= w.end)); });\n }\n\n /** What a `three` layer that follows the composition asks for: the camera and the lights alive at `t` on this composition's clock (the same pick `updateSpace` makes). */\n private _spaceAt(t: number): SpaceNow {\n const { width, height } = this._compositionShape!;\n const compEnd = this._childBase + (this.duration ?? 0);\n const active = pickActiveCamera(this._cameras.map(cam => ({ cam, ...cam.window() })), t, compEnd);\n return { camera: active ? active.cam.state() : homeCamera(width, height), lights: this._liveLights(t, compEnd).map(l => l.state()), fog: active?.cam.fogState() ?? null };\n }\n\n /**\n * Lights and fog: when the composition has a light layer or the camera writes fog, every threeD layer draws with the lit shader, fed with\n * the lights alive NOW (a pure function of the lights, the camera and the layers; nothing is remembered between frames). With neither,\n * nothing is made and nothing is drawn differently. With no light alive at this moment (all outside their `at` / `duration`) a layer is\n * drawn unlit, as it is in a composition with no light.\n */\n private _applyLighting(t: number, compEnd: number, basis: CameraBasis, cam: CameraSequence | null): void {\n const fog = cam?.fogState() ?? null;\n // decided on what the composition HAS, not on this frame's camera: once a layer has the lit shader, every later frame must write its uniforms\n // (a fog camera that is over, or a cut to a camera without fog, would leave the last frame's fog on the layers)\n if (this._lights.length === 0 && !this._cameras.some(c => c.fog)) return;\n const states = this._liveLights(t, compEnd).map(l => l.state());\n const packed = states.length > 0 ? packLights(states) : null;\n this._lighting = states.length > 0 ? { states, cam: { x: basis.cx, y: basis.cy, z: basis.cz } } : null;\n // A shadow needs a light that makes shadows AND layers that cast them: the casters are the visible layers with `castsShadows`, drawn this frame\n // (a layer that is hidden, outside its life or behind the camera has no up-to-date picture and casts nothing)\n const shadowing = states.some(s => s.castsShadows);\n const casters = shadowing ? this._layers3d.filter(l => l.spec.castsShadows && l.display.visible && l.world && l.source) : [];\n const camInfo = { x: basis.cx, y: basis.cy, z: basis.cz, fx: basis.fx, fy: basis.fy, fz: basis.fz };\n for (const l of this._layers3d) {\n const mat = l.setLit(true);\n if (!mat || !l.world) continue;\n const lit = l.spec.lit !== false;\n // a layer never shadows itself; each receiver reads at most MAX_CASTERS casters (the first ones, in layer order: said at build)\n const mine: CasterInput[] = lit ? casters.filter(c => c !== l).slice(0, MAX_CASTERS).map(c => ({ frame: c.world!, source: c.source! })) : [];\n mat.update(l.world, camInfo, lit ? packed : null, fog, mine);\n }\n }\n\n /** Depth of field: each threeD layer is blurred by how far its depth is from the focal plane (a pure function of the camera and the layers). */\n private _applyDepthOfField(cam: CameraState, basis: CameraBasis): void {\n const aperture = cam.aperture ?? 0;\n if (!(aperture > 0)) { for (const l of this._layers3d) l.setBlur(0); return; }\n const focusDepth = projectPoint(basis, { x: cam.lookAtX, y: cam.lookAtY, z: cam.focus ?? 0 }).depth;\n if (!(focusDepth > NEAR)) {\n if (!this._dofSaid.behind) {\n this._dofSaid.behind = true;\n console.warn(`pixi-effects: ${describeLayer(this.spec)}: the camera's focus (z = ${(cam.focus ?? 0).toFixed(0)}) is at or behind the camera, so nothing is blurred. Put focus in front of the camera (a z below the camera's z)`);\n }\n for (const l of this._layers3d) l.setBlur(0);\n return;\n }\n let blurred = 0;\n for (const l of this._layers3d) {\n // a hidden layer (lifespan over, alpha 0, behind the camera) keeps the depth of the last frame it was drawn: it is not blurred or counted\n l.setBlur(l.display.visible ? blurRadius(aperture, basis.focal, l.depth, focusDepth) : 0);\n if (l.blur > 0) blurred++;\n }\n if (blurred >= MANY_BLURRED && !this._dofSaid.many) {\n this._dofSaid.many = true;\n console.warn(`pixi-effects: ${describeLayer(this.spec)}: ${blurred} layers are blurred by depth of field at once (it warns from ${MANY_BLURRED}); each costs a filter pass per frame (WebGPU more). Merge the far layers or lower aperture`);\n }\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n super.collectAudio(out, baseTime);\n const remap = this._remap;\n if (!remap) {\n const childBase = baseTime + this.at;\n for (const child of this._children) child.collectAudio(out, childBase);\n return;\n }\n // The children's sounds are described in local time; each one is given a warp from the movie's time to it.\n const inner: AudioDescriptor[] = [];\n for (const child of this._children) child.collectAudio(inner, 0);\n const lo = baseTime + this.at, hi = lo + this.duration!;\n const table = clockTable(remap, 'time', this.duration!, lo, this.scope() as unknown as Record<string, number>, hi);\n for (const d of inner) {\n const prev = d.warp;\n out.push({ ...d, warp: (t: number) => (t < lo || t > hi ? NaN : prev ? prev(table.at(t)) : table.at(t)) });\n }\n }\n\n override destroy(): void {\n this._inner?.kill();\n this._inner = null;\n this._clock = null;\n // every shader goes first: a caster's texture is bound in the shaders of the layers that read its shadow, and destroying it while they still hold it warns\n for (const l of this._layers3d) l.setLit(false);\n for (const l of this._layers3d) l.destroy();\n this._layers3d = [];\n this._mattes?.destroy();\n this._mattes = null;\n for (const c of this._children) c.destroy();\n for (const o of this._blendOwned) o.destroy();\n this._blendOwned = [];\n super.destroy();\n }\n}\n\n/** Layer-space rectangle a threeD child projects: a composition's frame, otherwise its content bounds. */\nfunction frameOf(child: Sequence): () => { x: number; y: number; width: number; height: number } {\n if (child instanceof CompositionSequence) {\n return () => ({ x: 0, y: 0, width: child.intrinsicWidth, height: child.intrinsicHeight });\n }\n return () => child.target!.getLocalBounds();\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/audioRemap.ts","../src/core/spectrum.ts","../src/audio/loudness.ts","../src/core/inspectAudio.ts"],"names":[],"mappings":";;;AAKA,SAAS,MAAA,CAAO,GAAgB,CAAA,EAAmB;AACjD,EAAA,IAAI,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,KAAA,GAAQ,EAAE,aAAA,IAAiB,CAAA;AAChD,EAAA,IAAI,CAAA,IAAK,OAAO,OAAO,KAAA;AACvB,EAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,eAAA,IAAmB,EAAC,EAAG;AACxC,IAAA,IAAI,KAAK,EAAA,CAAG,IAAA,EAAM,OAAO,EAAA,CAAG,SAAS,KAAA,GAAQ,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAA,CAAS,GAAG,KAAA,GAAQ,KAAA,KAAA,CAAW,CAAA,GAAI,KAAA,KAAU,GAAG,IAAA,GAAO,KAAA,CAAA,CAAA;AAC/G,IAAA,KAAA,GAAQ,EAAA,CAAG,IAAA;AAAM,IAAA,KAAA,GAAQ,EAAA,CAAG,KAAA;AAAA,EAC9B;AACA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,OAAO,CAAA,GAAI,GAAA;AAQV,SAAS,gBACd,CAAA,EAAgB,IAAA,EAAoB,KAAA,EAAqB,OAAA,EAAiB,SAAiB,KAAA,EAClC;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,IAAI,YAAA,CAAa,KAAK,CAAA;AAChC,EAAA,IAAI,KAAA,GAAQ,IAAI,IAAA,GAAO,EAAA;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,GAAO,CAAA,CAAE,KAAK,CAAA,GAAI,IAAI,IAAI,CAAA,GAAI,IAAA;AAC1C,IAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACP,IAAA,IAAI,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,KAAK,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,CAAA,CAAE,GAAA,EAAK;AAAE,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA;AAAG,MAAA,IAAA,GAAO,CAAA;AAAA,IAAG;AAAA,EAC7F;AACA,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,QAAQ,CAAA,IAAK,IAAI,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAA,CAAQ,IAAA,GAAO,KAAK,IAAI,CAAA;AAClF,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,OAAO,CAAC,CAAA;AACpD,EAAA,MAAM,CAAA,GAAI,IAAI,YAAA,CAAa,CAAC,GAAG,CAAA,GAAI,IAAI,aAAa,CAAC,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,OAAA;AAC1B,EAAA,IAAI,OAAA,GAAU,GAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,OAAA;AACnB,IAAA,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AACpE,IAAA,MAAM,KAAK,CAAA,CAAE,CAAC,GAAI,EAAA,GAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,EAAE,OAAO,QAAA,CAAS,EAAE,KAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,CAAA,EAAI;AAAE,MAAA,OAAA,GAAU,GAAA;AAAK,MAAA;AAAA,IAAU;AAC9E,IAAA,MAAM,CAAA,GAAI,EAAA,IAAM,CAAA,GAAI,CAAA,CAAA,GAAK,EAAA,GAAK,CAAA;AAC9B,IAAA,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,GAAA,EAAK;AAAE,MAAA,OAAA,GAAU,GAAA;AAAK,MAAA;AAAA,IAAU;AAC1D,IAAA,MAAM,GAAA,GAAM,EAAE,SAAA,GAAY,CAAA,CAAE,UAAU,CAAC,CAAA,GAAI,IAAI,CAAA,CAAE,KAAA;AACjD,IAAA,IAAI,GAAA,GAAM,GAAA;AACV,IAAA,IAAI,CAAA,CAAE,IAAA,EAAM,GAAA,GAAA,CAAQ,GAAA,GAAM,MAAO,GAAA,IAAO,GAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,OAAO,CAAA,GAAI,OAAA;AACnE,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,GAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAI,CAAA;AAChD,IAAA,MAAM,KAAK,GAAA,GAAM,OAAA,EAAS,IAAI,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/F,IAAA,CAAA,CAAE,CAAC,CAAA,GAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAM,IAAI,EAAA,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,GAAK,EAAA,IAAM,CAAA;AAChD,IAAA,CAAA,CAAE,CAAC,CAAA,GAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAM,IAAI,EAAA,CAAA,GAAM,KAAA,CAAM,EAAE,CAAA,GAAK,EAAA,IAAM,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAG;AACxB;AAMO,SAAS,QAAA,CAAS,GAAoD,KAAA,EAA+C;AAC1H,EAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,OAAO,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AACjD,EAAA,IAAI,KAAA,GAAQ,IAAI,IAAA,GAAO,EAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,IAAI,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,KAAK,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,CAAA,CAAE,GAAA,EAAK;AAAE,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA;AAAG,MAAA,IAAA,GAAO,CAAA;AAAA,IAAG;AAAA,EAC7F;AACA,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,EAAE,KAAA,EAAO,OAAO,GAAA,EAAK,KAAA,EAAM,GAAI,EAAE,OAAO,KAAA,GAAQ,IAAA,EAAM,GAAA,EAAA,CAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AAClG;AAMO,SAAS,UAAA,CAAW,GAAkC,KAAA,EAAuB;AAClF,EAAA,IAAI,KAAA,GAAQ,CAAA,QAAA;AACZ,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,GAAO,CAAA,CAAE,KAAK,CAAA,GAAI,IAAI,IAAI,CAAA,GAAI,IAAA;AAC1C,IAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,OAAO,KAAA,GAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,KAAA;AACT;;;ACvFO,SAAS,GAAA,CAAI,IAAkB,EAAA,EAAwB;AAC5D,EAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,MAAM,CAAA,IAAK,CAAA;AACf,IAAA,OAAO,CAAA,GAAI,GAAA,EAAK,GAAA,KAAQ,CAAA,EAAG,CAAA,IAAK,GAAA;AAChC,IAAA,CAAA,IAAK,GAAA;AACL,IAAA,IAAI,IAAI,CAAA,EAAG;AAAE,MAAA,CAAC,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,GAAI,CAAC,EAAA,CAAG,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AAAG,MAAA,CAAC,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,GAAI,CAAC,EAAA,CAAG,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AAAA,IAAG;AAAA,EACrF;AACA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,IAAO,CAAA,EAAG,QAAQ,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAO,EAAA,GAAK,IAAA,CAAK,EAAA,GAAM,GAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,GAAA,EAAK;AAC/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAC,CAAA;AACnD,QAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA;AAC/B,QAAA,MAAM,KAAK,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA,GAAK,GAAG,CAAC,CAAA,GAAK,EAAA,EAAI,EAAA,GAAK,GAAG,CAAC,CAAA,GAAK,EAAA,GAAK,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA;AAClE,QAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA;AAAI,QAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA;AACtC,QAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA;AAAI,QAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,KAAA,GAAQ,IAAA;AAOP,SAAS,iBAAiB,OAAA,EAAuB,UAAA,EAAoB,OAAO,CAAA,EAAG,EAAA,GAAK,QAAQ,MAAA,EAAgB;AACjH,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,MAAM,EAAA,GAAK,IAAI,YAAA,CAAa,KAAK,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,IAAI,YAAA,CAAa,KAAK,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAQ,MAAM,CAAA;AACvC,EAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,KAAA,GAAQ,GAAA,EAAK,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG;AACnE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,IAAI,KAAA,GAAQ,CAAA;AAClB,MAAA,MAAM,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAK,IAAI,IAAA,CAAK,EAAA,GAAK,CAAA,IAAM,KAAA,GAAQ,CAAA,CAAE,CAAA;AAC9D,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,CAAC,IAAK,CAAA,GAAI,CAAA;AACpC,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAAA,IACV;AACA,IAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA;AAC7C,MAAA,GAAA,IAAO,KAAA,IAAU,IAAI,UAAA,GAAc,KAAA,CAAA;AACnC,MAAA,GAAA,IAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,GAAA,GAAM,EAAE,IAAI,EAAA,GAAK,CAAA;AACxD;;;AC/CO,IAAM,iBAAiB,EAAE,UAAA,EAAY,KAAK,SAAA,EAAW,EAAA,EAAI,YAAY,EAAA,EAAG;AAK/E,SAAS,WAAW,EAAA,EAA8B;AAChD,EAAA,MAAM,EAAA,GAAK,iBAAA,EAAmB,CAAA,GAAI,iBAAA,EAAmB,CAAA,GAAI,kBAAA;AACzD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,KAAO,CAAA,GAAI,EAAA,CAAA,EAAK,KAAK,EAAA,IAAM,kBAAA;AACvE,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAgB;AAAA,IACpB,CAAA,EAAG,EAAE,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,EAAA,EAAI,CAAA,IAAK,IAAI,CAAA,GAAI,EAAA,CAAA,GAAM,KAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,EAAE,CAAA;AAAA,IACzF,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAK,EAAA,EAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAK,EAAE;AAAA,GACvD;AACA,EAAA,MAAM,KAAK,iBAAA,EAAmB,EAAA,GAAK,kBAAA,EAAoB,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACjH,EAAA,MAAM,IAAA,GAAe,EAAE,CAAA,EAAG,CAAC,GAAG,EAAA,EAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,EAAA,CAAK,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,EAAE,CAAA,EAAE;AACnG,EAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AACrB;AAEA,SAAS,MAAA,CAAO,GAAiB,MAAA,EAAgC;AAC/D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,EAAE,CAAA,EAAG,CAAA,EAAE,IAAK,MAAA,EAAQ;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACvC,IAAA,IAAI,KAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,IAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAC/E,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,EAAA,GAAK,CAAA;AAAG,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IAC9C;AACA,IAAA,GAAA,GAAM,GAAA;AAAA,EACR;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAsB,IAAA,CAAK,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA,GAAI,EAAA;AAEtF,IAAM,OAAA,GAAU,EAAA;AAAhB,IAAoB,QAAA,GAAW,EAAA;AAC/B,IAAM,aAAa,CAAC,IAAA,EAAM,GAAA,EAAK,IAAI,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,YAAA,CAAa,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,GAAI,SAAQ,EAAG,CAAC,GAAG,CAAA,KAAM;AACjG,EAAA,MAAM,IAAI,CAAA,GAAI,OAAA,GAAU,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,KAAK,EAAA,GAAK,CAAA,CAAA;AAC3F,EAAA,OAAO,CAAA,IAAK,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,GAAK,CAAA,IAAK,OAAA,GAAU,CAAA,CAAE,CAAA,CAAA;AAC9D,CAAC,CAAC,CAAA;AAEF,IAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,GAAA,CAAI,OAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAGvF,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,QAAQ,GAAG,QAAA,GAAW,IAAI,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AAC9E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAAE,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAA,EAAG,CAAA,GAAA,CAAK,CAAA,GAAI,QAAA,GAAW,CAAA,IAAK,CAAA;AAAG,MAAA,IAAI,IAAI,QAAA,CAAS,CAAC,CAAA,EAAI,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,IAAG;AACpJ,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,CAAA,GAAI,IAAI,OAAO,CAAA;AAC/C,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,OAAO,CAAA;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,QAAA,GAAW,CAAA,IAAK,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAE,CAAA;AACvE,MAAA,IAAI,KAAA,GAAQ,WAAW,IAAA,EAAM;AAC7B,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,EAAA,EAAM;AAC7B,QAAA,MAAM,CAAA,GAAI,WAAW,EAAE,CAAA;AACvB,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAK,EAAE,CAAC,CAAA;AACnE,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACpB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAA,CAAgB,QAAA,EAA0B,UAAA,EAAoB,IAAA,GAA+B,EAAC,EAAmB;AAC/H,EAAA,IAAI,UAAA,GAAa,GAAG,OAAA,GAAU,CAAA;AAC9B,EAAA,KAAA,MAAW,CAAA,IAAK,UAAU,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAAE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAA;AAAG,IAAA,IAAI,CAAA,GAAI,YAAY,UAAA,GAAa,CAAA;AAAG,IAAA,IAAI,KAAK,CAAA,EAAG,OAAA,EAAA;AAAA,EAAW;AACrJ,EAAA,MAAM,MAAA,GAAS,WAAW,UAAU,CAAA;AACpC,EAAA,MAAM,WAAW,QAAA,CAAS,GAAA,CAAI,OAAK,MAAA,CAAO,CAAA,EAAG,MAAM,CAAC,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,UAAU,GAAG,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,UAAU,CAAA;AAC7E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,KAAU,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA,CAAA,EAAI,CAAA,IAAK,GAAA,EAAK;AACjE,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AAAE,MAAA,IAAI,CAAA,GAAI,CAAA;AAAG,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAAI,MAAA,GAAA,IAAO,CAAA,GAAI,KAAA;AAAA,IAAO;AACjH,IAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,MAAM,OAAO,CAAC,CAAA,KAAsB,SAAS,EAAA,GAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,GAAI,GAAG,CAAA;AAC5D,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA,GAAI,EAAA;AAC/E,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAO,OAAK,IAAA,CAAK,CAAC,IAAI,QAAQ,CAAA;AACrD,IAAA,IAAI,MAAM,MAAA,EAAQ,UAAA,GAAa,KAAK,KAAA,CAAM,EAAA,GAAK,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAA,EAAG,CAAC,IAAI,KAAA,CAAM,MAAM,CAAC,CAAA,GAAI,EAAA;AAAA,EAC1G;AACA,EAAA,OAAO,EAAE,cAAA,EAAgB,UAAA,EAAY,YAAY,IAAA,CAAK,QAAA,KAAa,QAAQ,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,EAAG,YAAA,EAAc,KAAK,UAAU,CAAA,EAAG,gBAAgB,OAAA,EAAQ;AACtK;AAGO,SAAS,YAAA,CAAa,QAAA,EAA0B,UAAA,EAAoB,IAAA,GAAqD,EAAC,EAAwC;AACvK,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,SAAA,IAAa,CAAA,IAAK,UAAU,CAAA,EAAG,KAAA,GAAQ,EAAA,KAAA,CAAQ,IAAA,CAAK,WAAA,IAAe,GAAA,IAAO,EAAA,CAAA;AACvG,EAAA,MAAM,IAAI,QAAA,CAAS,CAAC,GAAG,MAAA,IAAU,CAAA,EAAG,MAA2C,EAAC;AAChF,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAuB,QAAA,CAAS,KAAA,CAAM,CAAA,CAAA,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAA,GAAI,KAAK,CAAA;AACjF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA;AAC5B,IAAA,IAAI,CAAC,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG;AAAE,MAAA,IAAI,CAAA,GAAI,SAAS,GAAA,EAAK,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,UAAA,GAAa,GAAI,CAAA,GAAI,GAAA,EAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,UAAA,GAAa,GAAI,CAAA,GAAI,GAAA,EAAM,CAAA;AAAG,MAAA,KAAA,GAAQ,EAAA;AAAA,IAAI;AAAA,EAC5K;AACA,EAAA,OAAO,GAAA;AACT;;;AC9BA,IAAM,SAAA,GAAY,EAAA;AAElB,IAAM,YAAA,GAAe,GAAA;AAErB,IAAM,EAAA,GAAK,CAAC,CAAA,KAAsB,IAAA,CAAK,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,GAAI,EAAA;AACxF,IAAM,IAAA,GAAO,CAAC,KAAA,KAAwC;AACpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,EAAA,MAAM,MAAM,IAAI,YAAA,CAAa,KAAA,CAAM,CAAC,EAAG,MAAM,CAAA;AAC7C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,IAAK,CAAA,CAAE,CAAC,IAAK,KAAA,CAAM,MAAA;AAC7F,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,SAAS,OAAA,CAAQ,OAAuB,UAAA,EAAkC;AACxE,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAI,KAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,IAAI,IAAA,EAAM;AAAE,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA;AAAA,EAAG;AACxH,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAK,KAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,GAAS,UAAA,GAAc,GAAI,CAAA,GAAI,GAAA;AAAA,IAC7D,MAAA,EAAQ,GAAG,IAAI,CAAA;AAAA,IACf,WAAW,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,UAAA,GAAc,GAAI,CAAA,GAAI,GAAA;AAAA,IAClD,YAAA,EAAc,gBAAA,CAAiB,IAAA,CAAK,KAAK,GAAG,UAAU;AAAA,GACxD;AACF;AAOO,SAAS,aACd,GAAA,EAAqB,OAAA,EAA4B,OAAwB,aAAA,EAAuB,IAAA,GAA4B,EAAC,EAChH;AAEb,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0D;AAC7E,EAAA,OAAA,GAAU,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK;AACzB,IAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAG,GAAG,QAAA,CAAS,CAAA,EAAG,aAAa,CAAA,EAAE;AACpD,IAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,QAAA,EAAU,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,aAAa,CAAA,EAAG,CAAA;AAC1E,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MAAE,QAAA,EAAU,aAAA;AAAA,MAAe,UAAA,EAAY,CAAA;AAAA,MAAG,MAAA,EAAQ,IAAA;AAAA,MAAM,MAAA,EAAQ,CAAA;AAAA,MAAG,SAAS,EAAC;AAAA,MAAG,SAAS,EAAC;AAAA,MAC/F,QAAA,EAAU,EAAE,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,MAAM,cAAA,EAAgB,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,MAAG,QAAQ,EAAC;AAAA,MAAG,MAAM,EAAC;AAAA,MAAG,OAAO,EAAC;AAAA,MAAG,MAAA,EAAQ,CAAC,6GAA6G;AAAA,KAAE;AAAA,EACpP;AACA,EAAA,MAAM,KAAK,GAAA,CAAI,UAAA;AACf,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,GAAA,CAAI,gBAAA,EAAiB,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC1F,EAAA,MAAM,OAAA,GAAU,KAAK,KAAK,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAY,EAAA,KAAuB;AACjD,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAE,CAAC,CAAA;AAClD,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAE,CAAC,GAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAC,CAAA;AAClH,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA;AAC3E,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAA,GAAgB,IAAA,EAAM,KAAK,GAAA,EAAK;AAClD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,GAAA,IAAO,EAAE,CAAC,CAAA;AAC1D,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,QAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAClB,QAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,CAAE,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,EAAA,IAAM,MAAM,MAAM,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,EAAM,KAAA,EAAO,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA,EAAG,YAAA,EAAc,gBAAA,CAAiB,OAAA,EAAS,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA;AAAA,EACvJ;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,EAAA,CAAG,KAAA,CAAM,IAAI,CAAC,CAAA,SAAA,EAAY,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,qEAAA,CAAkE,CAAA;AAAA,EACrJ;AACA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqC;AACpD,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,EAAE,KAAA,CAAM,GAAA,EAAM,CAAA,GAAI,OAAA,CAAQ,EAAE,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,EAAG,EAAE,CAAE,CAAA;AACvE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,OAAO,QAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAE,gBAAA,EAAiB,EAAG,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,cAAA,CAAe,CAAC,CAAC,CAAA,EAAG,EAAE,UAAU,CAAA;AAAA,EACxG,CAAA;AACA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,SAAqI,EAAC;AAC5I,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK;AACnE,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,gBAAA;AACzB,IAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,OAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,CAAO,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,aAAa,CAAC,CAAC,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAGvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,eAAA,IAAmB,EAAC,EAAG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/F,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AACzE,IAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,YAAA,EAAe,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,EAA4B,aAAa,CAAA,EAAA,CAAI,CAAA;AAAA,IAC/G,CAAA,MAAA,IAAW,KAAA,GAAQ,YAAA,IAAgB,MAAA,GAAS,YAAA,EAAc;AACxD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,oBAAA,EAAuB,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,QAAQ,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,gBAAA,EAAmB,KAAK,CAAA,gBAAA,EAAmB,SAAS,CAAA,iBAAA,EAAoB,MAAM,CAAA,8BAAA,CAA2B,CAAA;AAAA,IAC3M;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,GAAQ,aAAA,EAAe;AACtC,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,GAAW,IAAA,EAAM;AACvC,UAAA,MAAA,CAAO,KAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,sDAAsD,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,gBAAA,EAAmB,KAAA,CAAM,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,0HAAA,CAAuH,CAAA;AAAA,QAChR;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,GAAM,aAAA,GAAgB,IAAA,EAAM;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,wCAAA,EAA2C,aAAa,CAAA,cAAA,EAAiB,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,MAC9H;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,SAAS,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,GAAQ,aAAA,IAAiB,CAAC,KAAA,EAAO;AAC3D,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,GAAA,EAAK,aAAa,IAAI,CAAA,CAAE,KAAA;AACjD,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,OAAA,GAAU,KAAA;AAC/B,MAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,OAAA,GAAU,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,gBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA,GAAI,EAAE,CAAA,gBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAG,CAAA,yGAAA,CAA2G,CAAA;AAAA,IACvS;AAGA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,CAAC,SAAS,CAAC,CAAA,CAAE,aAAa,CAAA,CAAE,KAAA,GAAQ,aAAA,IAAiB,KAAA,GAAQ,YAAA,EAAc;AAC7E,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,KAAA,CAAM,SAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,IAAI,CAAA,EAAG,KAAK,GAAA,CAAI,aAAA,EAAe,EAAA,GAAK,IAAI,CAAC,CAAC,CAAA;AACpF,MAAA,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,MAAA,GAAS,KAAA,IAAS,EAAE,CAAA,GAAI,EAAE,CAAA;AAC/D,MAAA,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,UAAA,IAAc,SAAA,EAAW;AACxF,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,EAAA,EAAI,KAAK,KAAA,CAAM,EAAA,GAAK,GAAG,CAAA,GAAI,KAAK,CAAA;AAAA,MACrG;AAAA,IACF;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAW,GAAI,EAAC,EAAI,GAAI,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AAAA,EACjK,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,GAAa,CAAA,GAAI,CAAE,CAAA;AAE3E,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAA,KAAA,CAAM,CAAA,CAAE,UAAU,gBAAA,GAAmB,CAAA,CAAA,EAAI,OAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,IAAA;AACzH,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,QAAA,KAAa,CAAA,GAAI,sBAAsB,CAAA,EAAG,QAAQ,oBAAoB,CAAA,SAAA,EAAY,SAAS,4EAA4E,MAAA,CAAO,MAAA,GAAS,WAAW,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,aAAA,CAAA,GAAkB,EAAE,mBAAmB,KAAA,CAAM,KAAK,KAAK,KAAA,CAAM,MAAM,mBAAmB,KAAA,CAAM,KAAK,mBAAmB,IAAA,CAAK,KAAA,CAAM,MAAM,SAAA,GAAY,GAAG,IAAI,GAAG,CAAA,SAAA,EAAY,MAAM,MAAM,CAAA,SAAA,EAAY,MAAM,EAAE,CAAA,IAAA,EAAO,KAAA,CAAM,UAAU,CAAA,oKAAA,CAAsK,CAAA;AAAA,EAC7mB;AAEA,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,EAAO,EAAE,CAAA;AACvC,EAAA,MAAM,WAAW,YAAA,CAAa,KAAA,EAAO,IAAI,EAAE,SAAA,EAAW,GAAG,CAAA;AACzD,EAAA,IAAI,KAAA,CAAM,iBAAiB,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAG,KAAA,CAAM,cAAc,CAAA,yGAAA,CAAsG,CAAA;AACvK,EAAA,IAAI,KAAA,CAAM,aAAc,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,uBAAA,EAA0B,KAAA,CAAM,UAAU,CAAA,wEAAA,CAAqE,CAAA;AACtJ,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAG,UAAU,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,mBAAmB,IAAA,EAAM;AACjC,IAAA,IAAI,KAAA,CAAM,iBAAiB,cAAA,CAAe,UAAA,QAAkB,IAAA,CAAK,CAAA,gCAAA,EAAmC,KAAA,CAAM,cAAc,CAAA,gFAAA,CAAwE,CAAA;AAAA,SAAA,IACvL,KAAA,CAAM,iBAAiB,cAAA,CAAe,SAAA,QAAiB,IAAA,CAAK,CAAA,iBAAA,EAAoB,KAAA,CAAM,cAAc,CAAA,8CAAA,CAAsC,CAAA;AAAA,EACrJ;AACA,EAAA,IAAI,KAAA,CAAM,UAAA,GAAc,cAAA,CAAe,UAAA,IAAc,MAAM,UAAA,IAAe,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,oBAAoB,KAAA,CAAM,UAAU,CAAA,wDAAA,EAA2D,cAAA,CAAe,UAAU,CAAA,MAAA,CAAQ,CAAA;AACxN,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,EAAE,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,CAAE,EAAA,GAAK,EAAE,IAAA,IAAQ,EAAE,CAAA,GAAI,EAAE,CAAA,GAAA,CAAK,CAAA;AAC/I,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,2DAAA,CAA6D,CAAA;AAC3H,EAAA,MAAM,aAAa,IAAA,CAAK,MAAA,IAAU,KAAK,MAAA,CAAO,MAAA,GAAS,KAAK,MAAA,GAAS,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA,EAAG,GAAA,EAAK,eAAe,CAAA,EAAG,IAAI,CAAA,EAAA,KAAM;AAChI,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,QAAQ,EAAE,CAAC,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,KAAA,CAAM,EAAA,CAAG,GAAA,GAAM,EAAE,CAAC,CAAA;AAClG,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AACzD,IAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,EAAM,IAAI,EAAE,QAAA,EAAU,OAAO,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,EAAM,EAAA,CAAG,MAAM,IAAA,EAAM,EAAA,CAAG,OAAO,EAAA,EAAI,EAAA,CAAG,KAAK,IAAA,EAAM,CAAA,CAAE,gBAAgB,MAAA,EAAQ,CAAA,CAAE,cAAc,MAAA,EAAQ,CAAA,CAAE,eAAe,GAAA,EAAI;AAAA,EACnI,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA;AAAA,IACV,UAAA,EAAY,EAAA;AAAA,IACZ,QAAQ,EAAA,CAAG,KAAA,EAAO,QAAQ,MAAA,CAAO,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,IAClD,MAAA,EAAQ,OAAO,MAAA,IAAU,CAAA;AAAA,IACzB,OAAA,EAAS,IAAA;AAAA,IACT,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,EAAU,EAAE,cAAA,EAAgB,KAAA,CAAM,cAAA,EAAgB,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,IAAA,EAAM,cAAA,EAAgB,KAAA,CAAM,cAAA,EAAgB,QAAA,EAAS;AAAA,IACvI,MAAA,EAAQ,SAAA;AAAA,IACR,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,KAAI,CAAE,CAAA;AAAA,IACtE;AAAA,GACF;AACF;AAsBO,SAAS,YAAA,CAAa,GAAA,EAAc,IAAA,GAA4B,EAAC,EAAgB;AACtF,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,UAAA;AAClC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,IAAI,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA;AAE1F,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,IAAU,GAAA;AAC7B,EAAA,IAAI,UAAU,CAAA,CAAE,OAAA;AAChB,EAAA,IAAI,QAAQ,MAAA,GAAS,CAAA,IAAK,QAAA,GAAW,OAAA,CAAQ,QAAQ,MAAA,GAAS,CAAC,CAAA,CAAG,CAAA,GAAI,QAAQ,CAAA,EAAG,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAA;AAC9G,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAI,CAAA,GAAI,GAAA;AAAA,IAAM,YAAY,GAAA,CAAI,UAAA;AAAA,IAAY,UAAU,GAAA,CAAI,gBAAA;AAAA,IAAkB,QAAQ,CAAA,CAAE,MAAA;AAAA,IACpH,UAAU,CAAA,CAAE,QAAA;AAAA,IAAU,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AAAA,IAAG,OAAO,CAAC,GAAG,EAAE,KAAA,EAAO,GAAG,EAAE,MAAM;AAAA,GAChH;AACF","file":"chunk-LQDDDIC4.cjs","sourcesContent":["import type { AudioDescriptor } from '../types';\n\ntype RemapFields = Pick<AudioDescriptor, 'start' | 'end' | 'loop' | 'initialVolume' | 'volumeKeyframes' | 'warp' | 'sourceMap'>;\n\n/** The gain of a sound at its own time `u`: `initialVolume` from `start`, then straight lines to each point (what the Web Audio ramps did). */\nfunction gainAt(a: RemapFields, u: number): number {\n let prevT = a.start, prevV = a.initialVolume ?? 1;\n if (u <= prevT) return prevV;\n for (const kf of a.volumeKeyframes ?? []) {\n if (u <= kf.time) return kf.time === prevT ? kf.value : prevV + (kf.value - prevV) * ((u - prevT) / (kf.time - prevT));\n prevT = kf.time; prevV = kf.value;\n }\n return prevV;\n}\n\nconst CELL = 1 / 1000;\n\n/**\n * Render a sound through its time maps. For every output sample T: u = warp(T) (sampled every millisecond, interpolated), the position\n * in the sound is sourceMap(u) (or u - start), and the sample is read with linear interpolation. Where the position hardly moves (a\n * freeze) it fades to silence rather than hold one sample as a DC offset. Returns null when it is never audible. `at` is where in the\n * mix the returned samples begin. Pitch follows speed (a resample, like a tape).\n */\nexport function resampleThrough(\n a: RemapFields, left: Float32Array, right: Float32Array, srcRate: number, outRate: number, total: number,\n): { L: Float32Array; R: Float32Array; at: number } | null {\n const nCell = Math.ceil(total / CELL) + 2;\n const U = new Float64Array(nCell);\n let first = -1, last = -1;\n for (let k = 0; k < nCell; k++) {\n const u = a.warp ? a.warp(k * CELL) : k * CELL;\n U[k] = u;\n if (Number.isFinite(u) && u >= a.start && u < a.end) { if (first < 0) first = k; last = k; }\n }\n if (first < 0) return null;\n const lo = Math.max(0, (first - 1) * CELL), hi = Math.min(total, (last + 2) * CELL);\n const n = Math.max(1, Math.ceil((hi - lo) * outRate));\n const L = new Float32Array(n), R = new Float32Array(n);\n const dur = left.length / srcRate;\n let prevPos = NaN;\n for (let i = 0; i < n; i++) {\n const T = lo + i / outRate;\n const x = T / CELL, k = Math.min(Math.floor(x), nCell - 2), f = x - k;\n const u0 = U[k]!, u1 = U[k + 1]!;\n if (!(Number.isFinite(u0) && Number.isFinite(u1))) { prevPos = NaN; continue; }\n const u = u0 * (1 - f) + u1 * f;\n if (u < a.start || u >= a.end) { prevPos = NaN; continue; }\n const raw = a.sourceMap ? a.sourceMap(u) : u - a.start;\n let pos = raw;\n if (a.loop) pos = ((pos % dur) + dur) % dur;\n const rate = Number.isNaN(prevPos) ? 1 : Math.abs(raw - prevPos) * outRate;\n prevPos = raw;\n if (pos < 0 || pos >= dur) continue;\n const g = gainAt(a, u) * Math.min(1, rate / 0.02);\n const sp = pos * srcRate, j = Math.floor(sp), fr = sp - j, j1 = Math.min(j + 1, left.length - 1);\n L[i] = (left[j]! * (1 - fr) + left[j1]! * fr) * g;\n R[i] = (right[j]! * (1 - fr) + right[j1]! * fr) * g;\n }\n return { L, R, at: lo };\n}\n\n/**\n * When a sound plays, in the MOVIE's time. Without a `warp` that is `start`..`end`; with one (the sound sits in a remapped composition)\n * `start` / `end` are the composition's local times, so the span is where the warp lands inside them. `total` is the movie's length.\n */\nexport function playSpan(a: Pick<AudioDescriptor, 'start' | 'end' | 'warp'>, total: number): { start: number; end: number } {\n if (!a.warp) return { start: a.start, end: a.end };\n let first = -1, last = -1;\n const n = Math.ceil(total / CELL) + 1;\n for (let k = 0; k <= n; k++) {\n const u = a.warp(k * CELL);\n if (Number.isFinite(u) && u >= a.start && u < a.end) { if (first < 0) first = k; last = k; }\n }\n return first < 0 ? { start: total, end: total } : { start: first * CELL, end: (last + 1) * CELL };\n}\n\n/**\n * The farthest local time the warp (the clock of the composition the sound sits in) reaches during the movie. A sound whose local `end` is\n * beyond it is cut short by that clock (it stops or stands still) — a different cause than the end of the movie.\n */\nexport function clockReach(a: Pick<AudioDescriptor, 'warp'>, total: number): number {\n let reach = -Infinity;\n const n = Math.ceil(total / CELL) + 1;\n for (let k = 0; k <= n; k++) {\n const u = a.warp ? a.warp(k * CELL) : k * CELL;\n if (Number.isFinite(u) && u > reach) reach = u;\n }\n return reach;\n}\n","/** In-place radix-2 FFT (re/im arrays of the same power-of-two length). */\nexport function fft(re: Float64Array, im: Float64Array): void {\n const n = re.length;\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1;\n for (; j & bit; bit >>= 1) j ^= bit;\n j ^= bit;\n if (i < j) { [re[i], re[j]] = [re[j]!, re[i]!]; [im[i], im[j]] = [im[j]!, im[i]!]; }\n }\n for (let len = 2; len <= n; len <<= 1) {\n const ang = (-2 * Math.PI) / len;\n for (let i = 0; i < n; i += len) {\n for (let k = 0; k < len / 2; k++) {\n const wr = Math.cos(ang * k), wi = Math.sin(ang * k);\n const a = i + k, b = a + len / 2;\n const xr = re[b]! * wr - im[b]! * wi, xi = re[b]! * wi + im[b]! * wr;\n re[b] = re[a]! - xr; im[b] = im[a]! - xi;\n re[a] = re[a]! + xr; im[a] = im[a]! + xi;\n }\n }\n }\n}\n\nconst FRAME = 2048;\n\n/**\n * Spectral centroid (\"brightness\") in Hz of `samples[from, to)`: the power-weighted mean frequency\n * over Hann-windowed 2048-sample frames (louder frames count more). 0 for silence.\n * Rough guide: < 500 Hz dark / boomy, 1–3 kHz mid, > 4 kHz bright / airy.\n */\nexport function spectralCentroid(samples: Float32Array, sampleRate: number, from = 0, to = samples.length): number {\n let num = 0;\n let den = 0;\n const re = new Float64Array(FRAME);\n const im = new Float64Array(FRAME);\n const end = Math.min(to, samples.length);\n for (let start = Math.max(0, from); start < end; start += FRAME / 2) {\n for (let i = 0; i < FRAME; i++) {\n const k = start + i;\n const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (FRAME - 1));\n re[i] = k < end ? samples[k]! * w : 0;\n im[i] = 0;\n }\n fft(re, im);\n for (let b = 1; b < FRAME / 2; b++) {\n const power = re[b]! * re[b]! + im[b]! * im[b]!;\n num += power * ((b * sampleRate) / FRAME);\n den += power;\n }\n }\n return den > 1e-9 ? Math.round(num / den / 10) * 10 : 0;\n}\n","/** Loudness of a mix, ITU-R BS.1770-4 / EBU R128, without a dependency. Pure: takes channels, returns numbers. */\nexport interface LoudnessReport { integratedLufs: number | null; truePeakDb: number | null; samplePeakDb: number; clippedSamples: number }\n\n/** Where the advice in `inspectAudio().notes` starts: one place, so the docs can point at it. */\nexport const LOUDNESS_NOTES = { quietBelow: -24, loudAbove: -9, headroomDb: -1 } as const;\n\ninterface Biquad { b: [number, number, number]; a: [number, number, number] }\n\n/** The K-weighting of BS.1770-4: a high shelf, then a 38 Hz high-pass, as biquads for any sample rate (bilinear transform). */\nfunction kWeighting(fs: number): [Biquad, Biquad] {\n const f0 = 1681.974450955533, G = 3.999843853973347, Q = 0.7071752369554196;\n const K = Math.tan(Math.PI * f0 / fs), Vh = 10 ** (G / 20), Vb = Vh ** 0.4996667741545416;\n const a0 = 1 + K / Q + K * K;\n const shelf: Biquad = {\n b: [(Vh + Vb * K / Q + K * K) / a0, 2 * (K * K - Vh) / a0, (Vh - Vb * K / Q + K * K) / a0],\n a: [1, 2 * (K * K - 1) / a0, (1 - K / Q + K * K) / a0],\n };\n const f1 = 38.13547087602444, Q1 = 0.5003270373238773, K1 = Math.tan(Math.PI * f1 / fs), a1 = 1 + K1 / Q1 + K1 * K1;\n const high: Biquad = { b: [1, -2, 1], a: [1, 2 * (K1 * K1 - 1) / a1, (1 - K1 / Q1 + K1 * K1) / a1] };\n return [shelf, high];\n}\n\nfunction filter(x: Float32Array, stages: Biquad[]): Float32Array {\n let cur = x;\n for (const { b, a } of stages) {\n const out = new Float32Array(cur.length); // Float32 between stages: half the memory, far below the measurement's resolution\n let x1 = 0, x2 = 0, y1 = 0, y2 = 0;\n for (let i = 0; i < cur.length; i++) {\n const xi = cur[i]!, y = b[0] * xi + b[1] * x1 + b[2] * x2 - a[1] * y1 - a[2] * y2;\n x2 = x1; x1 = xi; y2 = y1; y1 = y; out[i] = y;\n }\n cur = out;\n }\n return cur;\n}\n\nconst toDb = (x: number): number => Math.round(200 * Math.log10(Math.max(x, 1e-6))) / 10; // 0.1 dB, floor -120\n\nconst TP_HALF = 12, TP_BLOCK = 32;\nconst TP_KERNELS = [0.25, 0.5, 0.75].map(p => Float64Array.from({ length: 2 * TP_HALF }, (_, j) => {\n const k = j - TP_HALF + 1, x = k - p, s = x === 0 ? 1 : Math.sin(Math.PI * x) / (Math.PI * x);\n return s * (0.5 + 0.5 * Math.cos(Math.PI * x / (TP_HALF + 1)));\n}));\n/** No interpolated value can exceed (the loudest sample around it) x this: where that cannot beat the peak so far, skip the sums. */\nconst TP_GAIN = Math.max(...TP_KERNELS.map(k => k.reduce((a, v) => a + Math.abs(v), 0)));\n\n/** 4x oversampled peak (windowed-sinc interpolation, 12 samples either side): catches peaks between samples. Equal to checking every phase of every sample, only faster. */\nfunction truePeak(chans: Float32Array[]): number {\n let peak = 0;\n for (const c of chans) {\n const n = c.length;\n const blocks = Math.ceil(n / TP_BLOCK), blockMax = new Float32Array(blocks + 2); // [b + 1] is block b; the ends stay 0\n for (let i = 0; i < n; i++) { const a = Math.abs(c[i]!), b = (i / TP_BLOCK | 0) + 1; if (a > blockMax[b]!) blockMax[b] = a; if (a > peak) peak = a; }\n const padded = new Float32Array(n + 2 * TP_HALF); // zeros around, so the sums need no bounds check\n padded.set(c, TP_HALF);\n for (let i = 0; i < n; i++) {\n const b = (i / TP_BLOCK | 0) + 1;\n const local = Math.max(blockMax[b - 1]!, blockMax[b]!, blockMax[b + 1]!); // the 24 samples around i lie in these three blocks\n if (local * TP_GAIN <= peak) continue;\n for (let pi = 0; pi < 3; pi++) {\n const k = TP_KERNELS[pi]!;\n let v = 0;\n for (let j = 0; j < 2 * TP_HALF; j++) v += padded[i + 1 + j]! * k[j]!;\n const a = Math.abs(v);\n if (a > peak) peak = a;\n }\n }\n }\n return peak;\n}\n\nexport function measureLoudness(channels: Float32Array[], sampleRate: number, opts: { truePeak?: boolean } = {}): LoudnessReport {\n let samplePeak = 0, clipped = 0;\n for (const c of channels) for (let i = 0; i < c.length; i++) { const a = Math.abs(c[i]!); if (a > samplePeak) samplePeak = a; if (a >= 1) clipped++; }\n const stages = kWeighting(sampleRate);\n const weighted = channels.map(c => filter(c, stages));\n const block = Math.round(0.4 * sampleRate), hop = Math.round(0.1 * sampleRate);\n const energies: number[] = [];\n for (let s = 0; s + block <= (weighted[0]?.length ?? 0); s += hop) {\n let sum = 0;\n for (const w of weighted) { let z = 0; for (let i = s; i < s + block; i++) z += w[i]! * w[i]!; sum += z / block; } // the weight is 1 for L, R and mono\n energies.push(sum);\n }\n const lufs = (e: number): number => -0.691 + 10 * Math.log10(e);\n const absolute = energies.filter(e => e > 0 && lufs(e) > -70);\n let integrated: number | null = null;\n if (absolute.length) {\n const relative = lufs(absolute.reduce((a, b) => a + b, 0) / absolute.length) - 10;\n const gated = absolute.filter(e => lufs(e) > relative);\n if (gated.length) integrated = Math.round(10 * lufs(gated.reduce((a, b) => a + b, 0) / gated.length)) / 10;\n }\n return { integratedLufs: integrated, truePeakDb: opts.truePeak === false ? null : toDb(truePeak(channels)), samplePeakDb: toDb(samplePeak), clippedSamples: clipped };\n}\n\n/** Runs of at least `minLength` seconds where every channel stays below `thresholdDb` (default -60 dBFS). */\nexport function findSilences(channels: Float32Array[], sampleRate: number, opts: { minLength?: number; thresholdDb?: number } = {}): Array<{ from: number; to: number }> {\n const min = Math.round((opts.minLength ?? 1) * sampleRate), limit = 10 ** ((opts.thresholdDb ?? -60) / 20);\n const n = channels[0]?.length ?? 0, out: Array<{ from: number; to: number }> = [];\n let start = -1;\n const quiet = (i: number): boolean => channels.every(c => Math.abs(c[i]!) < limit);\n for (let i = 0; i <= n; i++) {\n const q = i < n && quiet(i);\n if (q && start < 0) start = i;\n if (!q && start >= 0) { if (i - start >= min) out.push({ from: Math.round(start / sampleRate * 1000) / 1000, to: Math.round(i / sampleRate * 1000) / 1000 }); start = -1; }\n }\n return out;\n}\n","import type { AudioDescriptor } from '../types';\nimport type { MusicSummary } from '../audio/music/events';\nimport { playSpan, clockReach } from './audioRemap';\nimport type { MixStats } from './AudioMixer';\nimport { spectralCentroid } from './spectrum';\nimport { findSilences, LOUDNESS_NOTES, measureLoudness } from '../audio/loudness';\n\nexport interface AudioInspectOptions {\n /** Width of each loudness window in seconds. Default 0.1. */\n window?: number;\n /** The scenes to measure one by one (`movie.inspectAudio()` fills this from the movie's named top-level compositions). Default: the whole movie as one. */\n scenes?: Array<{ name: string; start: number; end: number }>;\n}\n\n/** One sound measured ON ITS OWN (not mixed), so overlapping layers do not blur it. */\nexport interface SoundMeasure {\n /** Seconds of audio the source has (an sfx: its length; a file: the file's length). */\n length: number;\n /** Its own loudest sample, dBFS (before the layer's volume). */\n peakDb: number;\n /** Seconds from its start to its loudest sample — the moment to line up with the picture. */\n loudestAt: number;\n /** Spectral centroid in Hz: < 500 dark / boomy, 1–4 k mid, > 8 k airy / hissy. */\n brightnessHz: number;\n}\n\nexport interface AudioSourceReport {\n /** `layer \"pop-1\"` (or `unnamed audio layer`). */\n layer: string;\n /** `sfx \"pop\"`, `asset \"bgm\"`, `video \"green\"`. */\n source: string;\n /** Movie time, seconds. */\n start: number;\n end: number;\n /** Loudest sample of the MIX while this source plays, dBFS (−120 = silence). */\n peakDb: number;\n sound: SoundMeasure;\n /**\n * How far below the loudest sample of the MIX around its own loudest moment this source is, dB (0 = it is the loudest thing there; 20 = the mix is 20 dB louder, so\n * the source is hardly heard). Absent for a sound inside a remapped composition (its time is not the movie's).\n */\n belowMixDb?: number;\n /** For a `music` layer: its score read back (bars per track, what starts in each bar, the drum spans). */\n music?: MusicSummary;\n}\n\nexport interface AudioReport {\n duration: number;\n sampleRate: number;\n /** Loudest sample of the mix before limiting, dBFS. Above 0 the mix was limited. */\n peakDb: number;\n peakAt: number;\n /** Every audio layer / video soundtrack in the mix, in start order. */\n sources: AudioSourceReport[];\n /** The mix over time: one row per window, `t` = window start. */\n windows: Array<{ t: number; rmsDb: number; peakDb: number; brightnessHz: number }>;\n /** Problems worth fixing: limiting, clipping, a true peak above 0 dBTP, inaudible layers, sounds cut off by the end of the movie. Read this first. */\n issues: string[];\n /** The mix as a whole (ITU-R BS.1770 loudness; `integratedLufs` is null for a mix shorter than 0.4 s or with nothing above −70 LUFS). */\n loudness: { integratedLufs: number | null; truePeakDb: number; clippedSamples: number; silences: Array<{ from: number; to: number }> };\n /** The same measure for each scene (`silent`: nothing above −60 dBFS). */\n scenes: Array<{ name: string; from: number; to: number; lufs: number | null; peakDb: number; silent: boolean }>;\n /** When each sound starts: what a waveform marks. */\n cues: Array<{ t: number; name: string }>;\n /** Advice, not faults: a mix that is quiet or loud for web video, little headroom, silent stretches. */\n notes: string[];\n}\n\ninterface PcmLike {\n numberOfChannels: number;\n sampleRate: number;\n length: number;\n getChannelData(ch: number): Float32Array;\n}\n\n/** A short sound effect this many dB under the loudest sample of the mix around its loudest moment is hardly heard. */\nconst BURIED_DB = 12;\n/** Below this a source counts as inaudible. */\nconst INAUDIBLE_DB = -50;\n\nconst db = (x: number): number => Math.round(10 * Math.max(-120, 20 * Math.log10(x))) / 10;\nconst mono = (chans: Float32Array[]): Float32Array => {\n if (chans.length === 1) return chans[0]!;\n const out = new Float32Array(chans[0]!.length);\n for (const d of chans) for (let i = 0; i < out.length; i++) out[i] = out[i]! + d[i]! / chans.length;\n return out;\n};\n\nfunction measure(chans: Float32Array[], sampleRate: number): SoundMeasure {\n let peak = 0;\n let at = 0;\n for (const d of chans) for (let i = 0; i < d.length; i++) if (Math.abs(d[i]!) > peak) { peak = Math.abs(d[i]!); at = i; }\n return {\n length: Math.round((chans[0]!.length / sampleRate) * 1000) / 1000,\n peakDb: db(peak),\n loudestAt: Math.round((at / sampleRate) * 1000) / 1000,\n brightnessHz: spectralCentroid(mono(chans), sampleRate),\n };\n}\n\n/**\n * Measure the soundtrack so an author who cannot listen can still check it: every sound on its own\n * (length, level, loudest moment, brightness), when it plays and how loud the mix is there, the mix over\n * time, and issues. Pure: takes the mix and the list of sources that went into it.\n */\nexport function analyzeAudio(\n mix: PcmLike | null, sources: AudioDescriptor[], stats: MixStats | null, movieDuration: number, opts: AudioInspectOptions = {},\n): AudioReport {\n // A sound inside a remapped composition has `start` / `end` in that composition's local time: report when it plays in the MOVIE's time.\n const warped = new Map<AudioDescriptor, { localEnd: number; reach: number }>();\n sources = sources.map(s => {\n if (!s.warp) return s;\n const moved = { ...s, ...playSpan(s, movieDuration) };\n warped.set(moved, { localEnd: s.end, reach: clockReach(s, movieDuration) });\n return moved;\n });\n if (!mix) {\n return { duration: movieDuration, sampleRate: 0, peakDb: -120, peakAt: 0, sources: [], windows: [],\n loudness: { integratedLufs: null, truePeakDb: -120, clippedSamples: 0, silences: [] }, scenes: [], cues: [], notes: [], issues: ['no audio: the movie has no audio layers (sound effects need no files: { type: \"audio\", sfx: \"pop\", at: 1 })'] };\n }\n const sr = mix.sampleRate;\n const chans = Array.from({ length: mix.numberOfChannels }, (_, c) => mix.getChannelData(c));\n const mixMono = mono(chans);\n const peakIn = (t0: number, t1: number): number => {\n let p = 0;\n const i1 = Math.min(mix.length, Math.ceil(t1 * sr));\n for (const d of chans) for (let i = Math.max(0, Math.floor(t0 * sr)); i < i1; i++) p = Math.max(p, Math.abs(d[i]!));\n return p;\n };\n\n // at least 10 ms: a smaller window would ask for a spectrum per sample\n const win = opts.window && opts.window > 0 ? Math.max(0.01, opts.window) : 0.1;\n const windows: AudioReport['windows'] = [];\n for (let t = 0; t < movieDuration - 1e-9; t += win) {\n const i0 = Math.floor(t * sr);\n const i1 = Math.min(mix.length, Math.floor((t + win) * sr));\n let sum = 0;\n let peak = 0;\n for (const d of chans) {\n for (let i = i0; i < i1; i++) {\n sum += d[i]! * d[i]!;\n peak = Math.max(peak, Math.abs(d[i]!));\n }\n }\n const n = Math.max(1, (i1 - i0) * chans.length);\n windows.push({ t: Math.round(t * 1000) / 1000, rmsDb: db(Math.sqrt(sum / n)), peakDb: db(peak), brightnessHz: spectralCentroid(mixMono, sr, i0, i1) });\n }\n\n const issues: string[] = [];\n if (stats && stats.peak > 1) {\n issues.push(`the mix peaks at ${db(stats.peak)} dBFS at ${stats.peakAt.toFixed(2)}s and was limited — lower the volume of the layers playing there`);\n }\n const rendered = new Map<string, SoundMeasure>();\n const soundOf = (s: AudioDescriptor): SoundMeasure => {\n if (s.synth) {\n let m = rendered.get(s.synth.key);\n if (!m) rendered.set(s.synth.key, (m = measure(s.synth.render(sr), sr)));\n return m;\n }\n const b = s.buffer!;\n return measure(Array.from({ length: b.numberOfChannels }, (_, c) => b.getChannelData(c)), b.sampleRate);\n };\n const scoreNotes: string[] = [];\n const buried: Array<{ layer: string; source: string; ownDb: number; topVolume: number; around: number; belowMixDb: number; at: number }> = [];\n const list = [...sources].sort((a, b) => a.start - b.start).map(s => {\n const layer = s.layer ?? 'an audio layer';\n const source = s.source ?? 'audio';\n const peakDb = db(peakIn(s.start, Math.min(s.end, movieDuration)));\n const sound = soundOf(s);\n // The layer's OWN level: the sound's peak at the loudest volume it ever has. Judging the mix instead would\n // hide a nearly silent layer under a loud one.\n const topVolume = Math.max(s.initialVolume ?? 1, ...(s.volumeKeyframes ?? []).map(k => k.value));\n const ownDb = db(Math.pow(10, sound.peakDb / 20) * Math.max(0, topVolume));\n if (s.start >= movieDuration) {\n issues.push(`${layer} (${source}) starts at ${s.start.toFixed(2)}s, after the movie ends (${movieDuration}s)`);\n } else if (ownDb < INAUDIBLE_DB || peakDb < INAUDIBLE_DB) {\n issues.push(`${layer} (${source}) is inaudible from ${s.start.toFixed(2)}s to ${s.end.toFixed(2)}s (its own peak ${ownDb} dBFS at volume ${topVolume}; mix peak there ${peakDb} dBFS) — check its volume`);\n }\n const clock = warped.get(s);\n if (s.synth && s.start < movieDuration) {\n if (clock) {\n // inside a remapped composition: it is cut short when the composition's clock never gets to the end of the sound\n if (clock.reach < clock.localEnd - 1e-3) {\n issues.push(`${layer} (${source}) is cut off: its composition's clock only reaches ${clock.reach.toFixed(2)}s (the sound is ${clock.localEnd.toFixed(2)}s long), because the clock stops or the movie ends first — give the layer a shorter duration, or let the clock run on`);\n }\n } else if (s.end > movieDuration + 1e-6) {\n issues.push(`${layer} (${source}) is cut off by the end of the movie at ${movieDuration}s (it runs to ${s.end.toFixed(2)}s)`);\n }\n }\n // A written score (`music`) much longer than what plays: said as a NOTE (a trial: 19.2 s of music under a 10 s film; the read-back showed it but nothing said it).\n // Not a fault: music that outlasts the movie ends with it (see Audio.ts). A tail under 2 s or 15 % over is only the reverb tail; a looping layer is meant to be cut.\n if (s.music && !s.loop && s.start < movieDuration && !clock) {\n const plays = Math.min(s.end, movieDuration) - s.start;\n const over = s.music.seconds - plays;\n if (over > 2 && over / s.music.seconds > 0.15) scoreNotes.push(`${layer} (${source}): the score is ${Math.round(s.music.seconds * 10) / 10}s long but only ${Math.round(plays * 100) / 100}s of it play, so it is cut off mid-phrase. Write fewer bars (or a faster tempo) so it ends with the movie`);\n }\n // Buried: the sound's own peak against the mix around its loudest moment. A short sound effect 12 dB or more under what plays with it is a hit nobody hears.\n // (A layer with its own speed or `time` plays the sound at another pace: its loudest moment is not at start + loudestAt, so it is left out.)\n let belowMixDb: number | undefined;\n if (!clock && !s.sourceMap && s.start < movieDuration && ownDb > INAUDIBLE_DB) {\n const at = s.start + sound.loudestAt;\n const around = db(peakIn(Math.max(0, at - 0.05), Math.min(movieDuration, at + 0.05)));\n belowMixDb = Math.max(0, Math.round((around - ownDb) * 10) / 10);\n if (!s.music && source.startsWith('sfx') && sound.length <= 4 && belowMixDb >= BURIED_DB) {\n buried.push({ layer, source, ownDb, topVolume, around, belowMixDb, at: Math.round(at * 100) / 100 });\n }\n }\n return { layer, source, start: s.start, end: s.end, peakDb, sound, ...(belowMixDb !== undefined ? { belowMixDb } : {}), ...(s.music ? { music: s.music } : {}) };\n });\n\n // ONE note for the movie (an accent that is meant to be subtle is common: the numbers are in every source's `belowMixDb`): how many, and the worst\n if (buried.length > 0) {\n const worst = buried.reduce((a, b) => (b.belowMixDb > a.belowMixDb ? b : a));\n // layers with no name all carry the same label, so they are counted one by one; a named layer that plays many times counts once\n const distinct = new Set(buried.map(x => (x.layer === 'an audio layer' ? `#${buried.indexOf(x)}` : x.layer) + x.source)).size;\n scoreNotes.push(`${distinct === 1 ? '1 sound effect is' : `${distinct} sound effects are`} buried (${BURIED_DB} dB or more under the loudest sample of the mix around its loudest moment${buried.length > distinct ? `, ${buried.length} times in all` : ''}): the worst is ${worst.layer} (${worst.source}), its own peak ${worst.ownDb} dBFS at volume ${Math.round(worst.topVolume * 100) / 100} against ${worst.around} dBFS at ${worst.at} s, ${worst.belowMixDb} dB louder. If it is meant to be heard, raise its volume (an accent over music needs 2 to 3) or lower what plays there; every source's belowMixDb has its own number`);\n }\n // the mix as a whole, scene by scene, and the advice\n const whole = measureLoudness(chans, sr);\n const silences = findSilences(chans, sr, { minLength: 1 });\n if (whole.clippedSamples > 0) issues.push(`${whole.clippedSamples} sample(s) of the mix are at full scale (clipped) — lower the volume of the layers that play loudest`);\n if (whole.truePeakDb! > 0) issues.push(`the mix's true peak is ${whole.truePeakDb} dBTP: it will distort when the video is encoded — lower the volume`);\n const notes: string[] = [...scoreNotes];\n if (whole.integratedLufs !== null) {\n if (whole.integratedLufs < LOUDNESS_NOTES.quietBelow) notes.push(`the mix is quiet for web video: ${whole.integratedLufs} LUFS (typical −14 to −16); raise the volume if that is not on purpose`);\n else if (whole.integratedLufs > LOUDNESS_NOTES.loudAbove) notes.push(`the mix is loud: ${whole.integratedLufs} LUFS (typical web video −14 to −16)`);\n }\n if (whole.truePeakDb! > LOUDNESS_NOTES.headroomDb && whole.truePeakDb! <= 0) notes.push(`the true peak is ${whole.truePeakDb} dBTP: little headroom left for encoding (keep it below ${LOUDNESS_NOTES.headroomDb} dBTP)`);\n for (const q of silences.slice(0, 3)) notes.push(`the mix is silent from ${q.from} s to ${q.to} s (${Math.round((q.to - q.from) * 10) / 10} s)`);\n if (silences.length > 3) notes.push(`and ${silences.length - 3} more silent stretch(es) (loudness.silences lists them all)`);\n const sceneList = (opts.scenes && opts.scenes.length ? opts.scenes : [{ name: 'movie', start: 0, end: movieDuration }]).map(sc => {\n const a = Math.max(0, Math.round(sc.start * sr)), b = Math.min(mix.length, Math.round(sc.end * sr));\n const part = chans.map(c => c.subarray(a, Math.max(a, b)));\n const m = measureLoudness(part, sr, { truePeak: false }); // the true peak is the slow part and is only wanted for the whole mix\n return { name: sc.name, from: sc.start, to: sc.end, lufs: m.integratedLufs, peakDb: m.samplePeakDb, silent: m.samplePeakDb < -60 };\n });\n\n return {\n duration: movieDuration,\n sampleRate: sr,\n peakDb: db(stats?.peak ?? peakIn(0, movieDuration)),\n peakAt: stats?.peakAt ?? 0,\n sources: list,\n windows,\n issues,\n loudness: { integratedLufs: whole.integratedLufs, truePeakDb: whole.truePeakDb ?? -120, clippedSamples: whole.clippedSamples, silences },\n scenes: sceneList,\n cues: list.map(s => ({ t: s.start, name: `${s.layer} (${s.source})` })),\n notes,\n };\n}\n\n/** What `inspectSound` says about a sound. */\nexport interface SoundReport {\n /** Seconds, the sample rate and the number of channels of what was measured. */\n duration: number;\n sampleRate: number;\n channels: number;\n /** The loudest sample, dBFS. */\n peakDb: number;\n /** ITU-R BS.1770 loudness, true peak, samples at full scale and silences, as `check` reports them for a movie's mix. */\n loudness: AudioReport['loudness'];\n /** The level over time: the RMS of each window (`window` seconds, 0.1 by default), dBFS. */\n windows: Array<{ t: number; rmsDb: number }>;\n /** Advice (quiet or loud for web video, little headroom, silent stretches) and what would distort when encoded. */\n notes: string[];\n}\n\n/**\n * Measure the sound of any file, not only a movie's mix: its loudness, peak, clipping, silences and level over time, with the same code `movie.inspectAudio()` uses, so\n * `check` and the `pixi-effects sound` command give the same numbers for the same samples. Takes decoded PCM (an AudioBuffer works).\n */\nexport function inspectSound(pcm: PcmLike, opts: { window?: number } = {}): SoundReport {\n const duration = pcm.length / pcm.sampleRate;\n const r = analyzeAudio(pcm, [], null, duration, opts.window ? { window: opts.window } : {});\n // a file that ends a few ms into a window would show that sliver as a row (a 36 ms tail of encoder padding reads as −90 dBFS): a last window under half the width is dropped\n const width = opts.window ?? 0.1;\n let windows = r.windows;\n if (windows.length > 1 && duration - windows[windows.length - 1]!.t < width / 2) windows = windows.slice(0, -1);\n return {\n duration: Math.round(duration * 1000) / 1000, sampleRate: pcm.sampleRate, channels: pcm.numberOfChannels, peakDb: r.peakDb,\n loudness: r.loudness, windows: windows.map(w => ({ t: w.t, rmsDb: w.rmsDb })), notes: [...r.notes, ...r.issues],\n };\n}\n\n"]}
|