@hyperframes/engine 0.7.107 → 0.7.108

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.
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Applies an audio FX chain to a WAV at render time.
3
+ *
4
+ * The processing runs in an OfflineAudioContext inside the headless browser the
5
+ * engine already drives, using the same graph builders the studio previews
6
+ * with. There is one implementation of each effect, so the render matching the
7
+ * preview is a property of the architecture rather than a tolerance to police.
8
+ *
9
+ * The alternative — reimplementing every effect as an FFmpeg filter — means two
10
+ * implementations that have to be kept in agreement, and four of them (the
11
+ * dynamics processors and the modulated delays) have no filter that behaves the
12
+ * same way, so preview would quietly stop predicting the render.
13
+ */
14
+ import { type HfAudioFxChain } from "@hyperframes/core/audio-fx";
15
+ import { type HfAutomation } from "@hyperframes/core/audio-automation";
16
+ import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
17
+ export declare class AudioFxRenderError extends Error {
18
+ constructor(message: string);
19
+ }
20
+ interface WavData {
21
+ samples: Float32Array;
22
+ sampleRate: number;
23
+ channels: number;
24
+ }
25
+ export declare function readWav(path: string): WavData;
26
+ /**
27
+ * Write 16-bit PCM, interleaved, preserving the channel count.
28
+ *
29
+ * 16-bit rather than the float32 this used to emit: the very next step in the
30
+ * mixer bakes the volume envelope into the samples, and that baker accepts only
31
+ * 16-bit PCM. Emitting float meant enabling any effect silently downgraded a
32
+ * track's volume automation to the ffmpeg expression path, which is capped at 32
33
+ * straight segments — so a curved envelope was quantised and a dense one could
34
+ * fall back to rendering at base volume.
35
+ */
36
+ export declare function writeWav(path: string, samples: Float32Array, sampleRate: number, channels?: number): void;
37
+ /**
38
+ * Run a chain over `inputWav`, writing `outputWav`. Resolves to the path to use
39
+ * downstream — `outputWav` when the chain did something, `inputWav` untouched
40
+ * when the chain was empty — plus whether the volume envelope was baked here.
41
+ *
42
+ * The envelope is applied to the float samples the chain produced, BEFORE
43
+ * `writeWav` quantises them. Leaving it to the mixer's second pass meant a
44
+ * chain that overshoots full scale was destructively clipped to ±1 and only
45
+ * then ducked, so a track the lane pulls 12 dB down still rendered the
46
+ * distortion — which preview, working in float throughout, never had.
47
+ * `writeWav`'s clamp stays: it is the correct last resort for a signal that is
48
+ * still hot after the duck.
49
+ *
50
+ * Failure is fatal to the caller rather than a soft per-track warning: quietly
51
+ * rendering the dry signal ships a mix that sounds plausible and is not what
52
+ * the author set up.
53
+ */
54
+ export declare function applyAudioFxChain(inputWav: string, chain: HfAudioFxChain, outputWav: string, options: {
55
+ trackId: string;
56
+ signal?: AbortSignal;
57
+ automation?: HfAutomation;
58
+ envelope?: {
59
+ keyframes: AudioVolumeKeyframe[];
60
+ trackStart: number;
61
+ baseVolume: number;
62
+ };
63
+ }): Promise<{
64
+ path: string;
65
+ envelopeBaked: boolean;
66
+ }>;
67
+ export type { HfAudioFxChain, HfAutomation };
68
+ //# sourceMappingURL=audioFxRender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxRender.d.ts","sourceRoot":"","sources":["../../src/services/audioFxRender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAI5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,UAAU,OAAO;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmCD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ7C;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAI,GACX,IAAI,CAmCN;AAmFD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,CAuKnD;AAED,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Applies an audio FX chain to a WAV at render time.
3
+ *
4
+ * The processing runs in an OfflineAudioContext inside the headless browser the
5
+ * engine already drives, using the same graph builders the studio previews
6
+ * with. There is one implementation of each effect, so the render matching the
7
+ * preview is a property of the architecture rather than a tolerance to police.
8
+ *
9
+ * The alternative — reimplementing every effect as an FFmpeg filter — means two
10
+ * implementations that have to be kept in agreement, and four of them (the
11
+ * dynamics processors and the modulated delays) have no filter that behaves the
12
+ * same way, so preview would quietly stop predicting the render.
13
+ */
14
+ import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { pathToFileURL } from "node:url";
18
+ import { getAudioFxRuntimeScript } from "@hyperframes/core/audio-fx-runtime";
19
+ import { enabledAudioFxNodes } from "@hyperframes/core/audio-fx";
20
+ import { serializeAutomation } from "@hyperframes/core/audio-automation";
21
+ import { acquireBrowser } from "./browserManager.js";
22
+ import { createEnvelopeWalker } from "./audioVolumeEnvelope.js";
23
+ import { riffChunks } from "./wavChunks.js";
24
+ export class AudioFxRenderError extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = "AudioFxRenderError";
28
+ }
29
+ }
30
+ /**
31
+ * Minimal reader for the WAVs the mixer produces upstream. Handles 16-bit PCM
32
+ * and 32-bit float, the two formats the trim/extract steps emit; anything else
33
+ * is refused rather than silently misread as noise.
34
+ */
35
+ /** Walk the chunks for the format and the payload, in whatever order they sit. */
36
+ function readWavChunks(buf) {
37
+ const head = { format: 1, channels: 1, sampleRate: 48000, bits: 16 };
38
+ let data;
39
+ for (const { id, body, size } of riffChunks(buf)) {
40
+ if (id === "fmt ") {
41
+ head.format = buf.readUInt16LE(body);
42
+ head.channels = buf.readUInt16LE(body + 2);
43
+ head.sampleRate = buf.readUInt32LE(body + 4);
44
+ head.bits = buf.readUInt16LE(body + 14);
45
+ }
46
+ else if (id === "data") {
47
+ data = buf.subarray(body, Math.min(buf.length, body + size));
48
+ // The payload is the rest of the file for anything the mixer writes, and
49
+ // reading past it buys nothing: `fmt ` precedes `data` in every WAV these
50
+ // steps produce, and the alternative is walking a several-hundred-megabyte
51
+ // tail chunk by chunk.
52
+ break;
53
+ }
54
+ }
55
+ return { ...head, data };
56
+ }
57
+ export function readWav(path) {
58
+ const buf = readFileSync(path);
59
+ if (buf.length < 44 || buf.toString("ascii", 0, 4) !== "RIFF") {
60
+ throw new AudioFxRenderError(`Not a WAV file: ${path}`);
61
+ }
62
+ const { format, channels, sampleRate, bits, data } = readWavChunks(buf);
63
+ if (!data)
64
+ throw new AudioFxRenderError(`WAV has no data chunk: ${path}`);
65
+ return { samples: decodeSamples(data, format, bits, path), sampleRate, channels };
66
+ }
67
+ /** Interleaved samples as floats, for the two formats the mixer emits upstream. */
68
+ function decodeSamples(data, format, bits, path) {
69
+ if (format === 3 && bits === 32) {
70
+ const n = Math.floor(data.length / 4);
71
+ // A Float32Array view demands a 4-aligned offset, and chunk layouts that put
72
+ // `data` on an odd boundary (an 18-byte fmt plus a fact chunk, which
73
+ // ffmpeg's pcm_f32le writes) would otherwise throw RangeError. Copy then.
74
+ if (data.byteOffset % 4 === 0)
75
+ return new Float32Array(data.buffer, data.byteOffset, n);
76
+ const copied = new Float32Array(n);
77
+ for (let i = 0; i < n; i++)
78
+ copied[i] = data.readFloatLE(i * 4);
79
+ return copied;
80
+ }
81
+ if (format === 1 && bits === 16) {
82
+ const n = Math.floor(data.length / 2);
83
+ const out = new Float32Array(n);
84
+ for (let i = 0; i < n; i++)
85
+ out[i] = data.readInt16LE(i * 2) / 32768;
86
+ return out;
87
+ }
88
+ throw new AudioFxRenderError(`Unsupported WAV format ${format}/${bits}-bit: ${path}`);
89
+ }
90
+ /**
91
+ * Write 16-bit PCM, interleaved, preserving the channel count.
92
+ *
93
+ * 16-bit rather than the float32 this used to emit: the very next step in the
94
+ * mixer bakes the volume envelope into the samples, and that baker accepts only
95
+ * 16-bit PCM. Emitting float meant enabling any effect silently downgraded a
96
+ * track's volume automation to the ffmpeg expression path, which is capped at 32
97
+ * straight segments — so a curved envelope was quantised and a dense one could
98
+ * fall back to rendering at base volume.
99
+ */
100
+ export function writeWav(path, samples, sampleRate, channels = 1) {
101
+ const n = samples.length;
102
+ const bytes = n * 2;
103
+ const buf = Buffer.alloc(44 + bytes);
104
+ buf.write("RIFF", 0, "ascii");
105
+ buf.writeUInt32LE(36 + bytes, 4);
106
+ buf.write("WAVE", 8, "ascii");
107
+ buf.write("fmt ", 12, "ascii");
108
+ buf.writeUInt32LE(16, 16);
109
+ buf.writeUInt16LE(1, 20); // WAVE_FORMAT_PCM
110
+ buf.writeUInt16LE(channels, 22);
111
+ buf.writeUInt32LE(sampleRate, 24);
112
+ buf.writeUInt32LE(sampleRate * channels * 2, 28);
113
+ buf.writeUInt16LE(channels * 2, 32);
114
+ buf.writeUInt16LE(16, 34);
115
+ buf.write("data", 36, "ascii");
116
+ buf.writeUInt32LE(bytes, 40);
117
+ for (let i = 0; i < n; i++) {
118
+ // Clamp before scaling: a limiter set to 0 dB or a resonant filter can push
119
+ // past full scale, and wrapping would turn that into a click.
120
+ const v = Math.max(-1, Math.min(1, samples[i] ?? 0));
121
+ buf.writeInt16LE(Math.round(v * 32767), 44 + i * 2);
122
+ }
123
+ // lgtm[js/insecure-temporary-file] — `path` is always inside a directory the
124
+ // caller made with `mkdtempSync`, never a name assembled directly under
125
+ // `tmpdir()`. Both routes here are covered: the browser host page writes into
126
+ // `mkdtempSync(join(tmpdir(), "hf-fx-host-"))` below, and the render output
127
+ // goes to the producer's work dir, itself created as
128
+ // `mkdtempSync(join(tempRoot, "producer-project-"))`. mkdtemp picks the random
129
+ // suffix and creates the directory 0700 in one syscall, so the predictable
130
+ // FILENAME inside it (`<elementId>-fx.wav`) cannot be pre-created or
131
+ // symlinked by another user — which is the attack this rule is about. CodeQL
132
+ // flags it because the dataflow reaches `tmpdir()` without seeing the mkdtemp
133
+ // in between.
134
+ writeFileSync(path, buf);
135
+ }
136
+ /**
137
+ * Split an interleaved buffer into one array per channel.
138
+ *
139
+ * The graph used to fold everything to mono, which collapsed a stereo bed's
140
+ * width for the render only — and cost ~3 dB through the very mono-to-stereo
141
+ * rematrix that `prepareAudioTrack`'s pan filter exists to avoid. Preview kept
142
+ * the track stereo, so the two diverged the moment any effect was enabled.
143
+ */
144
+ function deinterleave(samples, channels) {
145
+ if (channels <= 1)
146
+ return [samples];
147
+ const frames = Math.floor(samples.length / channels);
148
+ const out = Array.from({ length: channels }, () => new Float32Array(frames));
149
+ for (let i = 0; i < frames; i++) {
150
+ for (let c = 0; c < channels; c++) {
151
+ out[c][i] = samples[i * channels + c] ?? 0;
152
+ }
153
+ }
154
+ return out;
155
+ }
156
+ /** Re-interleave per-channel arrays for the WAV writer. */
157
+ function interleave(planes) {
158
+ if (planes.length === 1)
159
+ return planes[0];
160
+ const frames = planes[0]?.length ?? 0;
161
+ const out = new Float32Array(frames * planes.length);
162
+ for (let i = 0; i < frames; i++) {
163
+ for (let c = 0; c < planes.length; c++) {
164
+ out[i * planes.length + c] = planes[c][i] ?? 0;
165
+ }
166
+ }
167
+ return out;
168
+ }
169
+ /**
170
+ * Bytes of PCM per CDP message.
171
+ *
172
+ * The whole track used to cross in a single `page.evaluate` pair — ~184 MB of
173
+ * base64 for a 3-minute stereo 48 kHz clip, in one WebSocket frame each way.
174
+ * puppeteer-core caps its frames at 256 MB and the browser pool does not use
175
+ * the pipe transport, so stereo past ~8.7 minutes failed the render outright;
176
+ * V8's max string length is a second wall not far beyond it. Chunking bounds
177
+ * both, and bounds the peak Node-side allocation with them: the mixer renders
178
+ * tracks concurrently, so every track's payload was live at once.
179
+ *
180
+ * 8 MiB encodes to ~11 MB of base64. A multiple of 4, so a chunk boundary
181
+ * never falls inside a float.
182
+ */
183
+ const TRANSFER_BYTES = 8 * 1024 * 1024;
184
+ /**
185
+ * Multiply every channel by the envelope, in place, one gain per frame.
186
+ *
187
+ * Frame-outer rather than plane-outer on purpose: the walker's cursor only
188
+ * moves forward, so restarting each channel at t=0 would hand the second one
189
+ * the tail gain for its whole length.
190
+ */
191
+ function applyEnvelopeToPlanes(planes, sampleRate, gainAt) {
192
+ const frames = planes[0]?.length ?? 0;
193
+ for (let frame = 0; frame < frames; frame += 1) {
194
+ const gain = gainAt(frame / sampleRate);
195
+ for (const plane of planes)
196
+ plane[frame] = (plane[frame] ?? 0) * gain;
197
+ }
198
+ }
199
+ /**
200
+ * Run a chain over `inputWav`, writing `outputWav`. Resolves to the path to use
201
+ * downstream — `outputWav` when the chain did something, `inputWav` untouched
202
+ * when the chain was empty — plus whether the volume envelope was baked here.
203
+ *
204
+ * The envelope is applied to the float samples the chain produced, BEFORE
205
+ * `writeWav` quantises them. Leaving it to the mixer's second pass meant a
206
+ * chain that overshoots full scale was destructively clipped to ±1 and only
207
+ * then ducked, so a track the lane pulls 12 dB down still rendered the
208
+ * distortion — which preview, working in float throughout, never had.
209
+ * `writeWav`'s clamp stays: it is the correct last resort for a signal that is
210
+ * still hot after the duck.
211
+ *
212
+ * Failure is fatal to the caller rather than a soft per-track warning: quietly
213
+ * rendering the dry signal ships a mix that sounds plausible and is not what
214
+ * the author set up.
215
+ */
216
+ export async function applyAudioFxChain(inputWav, chain, outputWav, options) {
217
+ if (enabledAudioFxNodes(chain).length === 0)
218
+ return { path: inputWav, envelopeBaked: false };
219
+ if (!existsSync(inputWav)) {
220
+ throw new AudioFxRenderError(`Audio FX input is missing: ${inputWav}`);
221
+ }
222
+ const { samples, sampleRate, channels } = readWav(inputWav);
223
+ const planes = deinterleave(samples, channels);
224
+ // An empty track has nothing to process — and an OfflineAudioContext of zero
225
+ // length throws, which is fatal for the WHOLE render rather than this track:
226
+ // the error travels past the mixer's per-track failure collector. ffmpeg
227
+ // writes an empty but structurally valid WAV whenever a clip's trim starts
228
+ // past the end of its source, so one mis-set `data-media-start` used to take
229
+ // the render down. Guarded here as well as in the runtime so an empty track
230
+ // never costs a browser.
231
+ if ((planes[0]?.length ?? 0) === 0)
232
+ return { path: inputWav, envelopeBaked: false };
233
+ // Both resources are taken INSIDE the try that releases them. The lease used
234
+ // to be acquired above it, with the mkdtemp between — so a failure there
235
+ // (a full disk, a read-only tmpdir) leaked a pooled browser, and a pool with
236
+ // no leases left hangs every later render rather than failing one.
237
+ const hostDir = mkdtempSync(join(tmpdir(), "hf-fx-host-"));
238
+ let lease = null;
239
+ try {
240
+ // Audio processing needs no GPU or special capture mode; a plain sandboxed
241
+ // browser is enough, and the lease pool reuses one across tracks.
242
+ // Checked before the lease, not after: an already-cancelled track has no
243
+ // reason to take a browser out of the pool just to hand it straight back.
244
+ if (options.signal?.aborted) {
245
+ throw new AudioFxRenderError(`Audio FX cancelled for track ${options.trackId}`);
246
+ }
247
+ lease = await acquireBrowser(["--no-sandbox", "--autoplay-policy=no-user-gesture-required"]);
248
+ const page = await lease.browser.newPage();
249
+ try {
250
+ // AudioWorklet is only exposed in a secure context, and about:blank is
251
+ // not one — the module would fail with an opaque error. A file:// page
252
+ // qualifies and needs no listening socket.
253
+ const hostPage = join(hostDir, "audio-fx.html");
254
+ writeFileSync(hostPage, "<!doctype html><meta charset=utf-8><title>audio fx</title>");
255
+ await page.goto(pathToFileURL(hostPage).href, { waitUntil: "domcontentloaded" });
256
+ await page.addScriptTag({ content: getAudioFxRuntimeScript() });
257
+ // Hand the input over a chunk at a time. The chunks stay separate byte
258
+ // arrays page-side rather than being concatenated into one string, so
259
+ // neither the frame cap nor V8's string limit sees the whole track.
260
+ await page.evaluate((count) => {
261
+ window.__HF_FX_IO = {
262
+ in: Array.from({ length: count }, () => []),
263
+ out: [],
264
+ };
265
+ }, planes.length);
266
+ for (let p = 0; p < planes.length; p += 1) {
267
+ const plane = planes[p];
268
+ if (!plane)
269
+ continue;
270
+ const bytes = Buffer.from(plane.buffer, plane.byteOffset, plane.length * 4);
271
+ for (let at = 0; at < bytes.length; at += TRANSFER_BYTES) {
272
+ await page.evaluate(([index, b64]) => {
273
+ const bin = atob(b64);
274
+ const chunk = new Uint8Array(bin.length);
275
+ for (let i = 0; i < bin.length; i++)
276
+ chunk[i] = bin.charCodeAt(i);
277
+ window.__HF_FX_IO?.in[index]?.push(chunk);
278
+ }, [p, bytes.subarray(at, at + TRANSFER_BYTES).toString("base64")]);
279
+ }
280
+ }
281
+ const outLengths = (await page.evaluate(async ([rate, chainJson, automationJson]) => {
282
+ const w = window;
283
+ const io = w.__HF_FX_IO;
284
+ if (!w.__HF_AUDIO_FX || !io)
285
+ throw new Error("audio FX runtime failed to load");
286
+ const inPlanes = io.in.map((chunks) => {
287
+ const bytes = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
288
+ let at = 0;
289
+ for (const chunk of chunks) {
290
+ bytes.set(chunk, at);
291
+ at += chunk.length;
292
+ }
293
+ return new Float32Array(bytes.buffer);
294
+ });
295
+ // Dropped before the render allocates its own buffers, so the page
296
+ // does not hold two copies of the track at once.
297
+ io.in = [];
298
+ io.out = await w.__HF_AUDIO_FX.render(inPlanes, rate, chainJson, automationJson || undefined);
299
+ return io.out.map((plane) => plane.length);
300
+ }, [
301
+ sampleRate,
302
+ JSON.stringify(chain),
303
+ options.automation ? serializeAutomation(options.automation) : "",
304
+ ]));
305
+ const outPlanes = [];
306
+ for (let p = 0; p < outLengths.length; p += 1) {
307
+ const byteLength = (outLengths[p] ?? 0) * 4;
308
+ const parts = [];
309
+ for (let at = 0; at < byteLength; at += TRANSFER_BYTES) {
310
+ const b64 = (await page.evaluate(([index, offset, limit]) => {
311
+ const plane = window.__HF_FX_IO?.out[index];
312
+ if (!plane)
313
+ return "";
314
+ const u8 = new Uint8Array(plane.buffer, plane.byteOffset + offset, Math.min(limit, plane.length * 4 - offset));
315
+ let s = "";
316
+ const CHUNK = 0x8000;
317
+ for (let i = 0; i < u8.length; i += CHUNK) {
318
+ // `apply` takes array-likes, so the subarray goes in as it is;
319
+ // Array.from boxed every byte of a 32 KiB window for nothing.
320
+ s += String.fromCharCode.apply(null, u8.subarray(i, i + CHUNK));
321
+ }
322
+ return btoa(s);
323
+ }, [p, at, TRANSFER_BYTES]));
324
+ parts.push(Buffer.from(b64, "base64"));
325
+ }
326
+ // byteOffset and byteLength matter: Node pools small allocations, so a
327
+ // short payload decodes into an 8 KiB pool and a view over the whole
328
+ // ArrayBuffer would read kilobytes of unrelated memory at the wrong length.
329
+ const buf = Buffer.concat(parts);
330
+ outPlanes.push(new Float32Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)));
331
+ }
332
+ if (outPlanes.length === 0 || (outPlanes[0]?.length ?? 0) === 0) {
333
+ throw new AudioFxRenderError(`Audio FX produced no samples for track ${options.trackId}`);
334
+ }
335
+ // Null when the keyframes normalise away to nothing — then the mixer's
336
+ // own paths still own this track's gain, so say so rather than claiming
337
+ // a bake that never happened.
338
+ const gainAt = options.envelope
339
+ ? createEnvelopeWalker(options.envelope.keyframes, options.envelope.trackStart, options.envelope.baseVolume)
340
+ : null;
341
+ if (gainAt)
342
+ applyEnvelopeToPlanes(outPlanes, sampleRate, gainAt);
343
+ writeWav(outputWav, interleave(outPlanes), sampleRate, outPlanes.length);
344
+ return { path: outputWav, envelopeBaked: gainAt !== null };
345
+ }
346
+ finally {
347
+ await page.close().catch(() => undefined);
348
+ }
349
+ }
350
+ catch (err) {
351
+ if (err instanceof AudioFxRenderError)
352
+ throw err;
353
+ throw new AudioFxRenderError(`Audio FX failed for track ${options.trackId}: ${err.message}`);
354
+ }
355
+ finally {
356
+ rmSync(hostDir, { recursive: true, force: true });
357
+ await lease?.release().catch(() => undefined);
358
+ }
359
+ }
360
+ //# sourceMappingURL=audioFxRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxRender.js","sourceRoot":"","sources":["../../src/services/audioFxRender.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@
5
5
  */
6
6
  import { type EngineConfig } from "../config.js";
7
7
  import type { AudioElement, MixResult } from "./audioMixer.types.js";
8
+ import { type HfAutomationLane } from "@hyperframes/core/audio-automation";
9
+ import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
8
10
  export type { AudioElement, MixResult } from "./audioMixer.types.js";
9
11
  /**
10
12
  * Filename every caller must use for the mixed-audio artifact.
@@ -20,6 +22,19 @@ export type { AudioElement, MixResult } from "./audioMixer.types.js";
20
22
  * the PNG-sequence sidecar, and all three have to agree.
21
23
  */
22
24
  export declare const MIXED_AUDIO_FILENAME = "audio.m4a";
25
+ /**
26
+ * A volume lane as keyframes for the PCM baker.
27
+ *
28
+ * The baker interpolates linearly between keyframes, so a straight segment
29
+ * needs only its two ends — a simple fade stays two keyframes. A bent one is
30
+ * sampled, or the bake would quietly straighten it.
31
+ *
32
+ * Times come out in composition seconds, which is what the baker subtracts the
33
+ * track start from. Returns null when the track has no volume lane.
34
+ */
35
+ export declare function volumeLaneKeyframes(automation: {
36
+ lanes: HfAutomationLane[];
37
+ }, trackStart: number, duration: number): AudioVolumeKeyframe[] | null;
23
38
  export declare function parseAudioElements(html: string): AudioElement[];
24
39
  export declare function processCompositionAudio(elements: AudioElement[], baseDir: string, workDir: string, outputPath: string, totalDuration: number, signal?: AbortSignal, config?: Partial<Pick<EngineConfig, "ffmpegProcessTimeout" | "audioGain">>, compiledDir?: string): Promise<MixResult>;
25
40
  //# sourceMappingURL=audioMixer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioMixer.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAaH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjE,OAAO,KAAK,EACV,YAAY,EAIZ,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AA4RhD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CA8D/D;AAsTD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,WAAW,CAAC,CAAC,EAC1E,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CA4NpB"}
1
+ {"version":3,"file":"audioMixer.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAaH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjE,OAAO,KAAK,EACV,YAAY,EAIZ,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AA+RhD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,EACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,mBAAmB,EAAE,GAAG,IAAI,CA+B9B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAmE/D;AA0TD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,WAAW,CAAC,CAAC,EAC1E,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CA8TpB"}
@@ -16,6 +16,10 @@ import { unwrapTemplate } from "../utils/htmlTemplate.js";
16
16
  import { resolveProjectRelativeSrc } from "./videoFrameExtractor.js";
17
17
  import { resolveReferencedStart } from "./referenceResolver.js";
18
18
  import { applyVolumeEnvelopeToWav } from "./audioVolumeEnvelope.js";
19
+ import { HF_AUDIO_FX_ATTR, parseAudioFxChain } from "@hyperframes/core/audio-fx";
20
+ import { HF_AUDIO_AUTOMATION_ATTR, parseAutomation, resolveAutomation, sampleAutomationLane, VOLUME_TARGET, } from "@hyperframes/core/audio-automation";
21
+ import { chainTailSeconds } from "@hyperframes/core/audio-fx-tail";
22
+ import { applyAudioFxChain, AudioFxRenderError } from "./audioFxRender.js";
19
23
  /**
20
24
  * Filename every caller must use for the mixed-audio artifact.
21
25
  *
@@ -263,6 +267,50 @@ function ffmpegFailure(stage, result, elementId) {
263
267
  : formatFfmpegError(result.exitCode, stderr)),
264
268
  };
265
269
  }
270
+ /** Extra samples per second inside a segment the baker cannot draw straight. */
271
+ const CURVED_SEGMENT_SAMPLES_PER_SEC = 30;
272
+ /**
273
+ * A volume lane as keyframes for the PCM baker.
274
+ *
275
+ * The baker interpolates linearly between keyframes, so a straight segment
276
+ * needs only its two ends — a simple fade stays two keyframes. A bent one is
277
+ * sampled, or the bake would quietly straighten it.
278
+ *
279
+ * Times come out in composition seconds, which is what the baker subtracts the
280
+ * track start from. Returns null when the track has no volume lane.
281
+ */
282
+ export function volumeLaneKeyframes(automation, trackStart, duration) {
283
+ const lane = automation.lanes.find((l) => l.target === VOLUME_TARGET);
284
+ if (!lane || lane.points.length === 0)
285
+ return null;
286
+ const out = [];
287
+ const push = (t, v) => {
288
+ out.push({ time: trackStart + t, volume: v });
289
+ };
290
+ // The envelope holds its first value before the first point, rather than
291
+ // falling back to `data-volume`.
292
+ const first = lane.points[0];
293
+ if (first.t > 0)
294
+ push(0, first.v);
295
+ for (let i = 0; i < lane.points.length; i += 1) {
296
+ const a = lane.points[i];
297
+ push(a.t, a.v);
298
+ const b = lane.points[i + 1];
299
+ if (!b || !a.curve)
300
+ continue;
301
+ const steps = Math.max(2, Math.ceil((b.t - a.t) * CURVED_SEGMENT_SAMPLES_PER_SEC));
302
+ for (let k = 1; k < steps; k += 1) {
303
+ const t = a.t + ((b.t - a.t) * k) / steps;
304
+ push(t, sampleAutomationLane(lane, t));
305
+ }
306
+ }
307
+ // Hold the last value to the clip's end, so the baker does not ramp away
308
+ // from it toward whatever it would otherwise assume.
309
+ const last = lane.points[lane.points.length - 1];
310
+ if (duration > last.t)
311
+ push(duration, last.v);
312
+ return out;
313
+ }
266
314
  export function parseAudioElements(html) {
267
315
  const elements = [];
268
316
  const { document } = parseHTML(unwrapTemplate(html));
@@ -294,6 +342,8 @@ export function parseAudioElements(html) {
294
342
  const mediaStartAttr = el.getAttribute("data-media-start");
295
343
  const layerAttr = el.getAttribute("data-layer");
296
344
  const volumeAttr = el.getAttribute("data-volume");
345
+ const fxChain = el.getAttribute(HF_AUDIO_FX_ATTR);
346
+ const automation = el.getAttribute(HF_AUDIO_AUTOMATION_ATTR);
297
347
  return {
298
348
  id,
299
349
  src: el.getAttribute("src"),
@@ -302,6 +352,8 @@ export function parseAudioElements(html) {
302
352
  mediaStart: mediaStartAttr ? parseFloat(mediaStartAttr) : 0,
303
353
  layer: layerAttr ? parseInt(layerAttr) : 0,
304
354
  volume: volumeAttr ? parseFloat(volumeAttr) : 1.0,
355
+ ...(fxChain ? { fxChain } : {}),
356
+ ...(automation ? { automation } : {}),
305
357
  type,
306
358
  };
307
359
  };
@@ -471,9 +523,13 @@ async function mixAudioTracks(tracks, outputPath, totalDuration, signal, config)
471
523
  const filterParts = [];
472
524
  tracks.forEach((track, i) => {
473
525
  const delayMs = Math.round(track.start * 1000);
474
- const trimDuration = track.end - track.start;
526
+ // A clip's own audio ends at `end`, but an FX tail is still decaying past
527
+ // it. Trimming at the boundary is what cut every reverb short; the final
528
+ // atrim below still holds the mix to the composition's length, so a tail
529
+ // can run over what follows but never past the end of the video.
530
+ const trimDuration = track.end - track.start + (track.tailSeconds ?? 0);
475
531
  const volumeFilter = buildVolumeExpression(track, ignoreAutomation);
476
- filterParts.push(`[${i}:a]atrim=0:${trimDuration},${volumeFilter},adelay=${delayMs}|${delayMs},apad,atrim=0:${formatFilterNumber(totalDuration)}[a${i}]`);
532
+ filterParts.push(`[${i}:a]atrim=0:${formatFilterNumber(trimDuration)},${volumeFilter},adelay=${delayMs}|${delayMs},apad,atrim=0:${formatFilterNumber(totalDuration)}[a${i}]`);
477
533
  });
478
534
  const mixInputs = tracks.map((_, i) => `[a${i}]`).join("");
479
535
  const mixFilter = `${mixInputs}amix=inputs=${tracks.length}:duration=longest:dropout_transition=0[mixed]`;
@@ -594,8 +650,27 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
594
650
  const failures = [];
595
651
  if (!existsSync(workDir))
596
652
  mkdirSync(workDir, { recursive: true });
653
+ // Every element's work races under Promise.all, which rejects on the first
654
+ // failure without waiting for its siblings. A fatal FX error therefore has to
655
+ // be able to abort the in-flight ffmpeg runs before the finally-block removes
656
+ // workDir out from under them. Chained off the caller's signal so external
657
+ // cancellation still behaves as before.
658
+ //
659
+ // Every child that can outlive a sibling's failure has to be given THIS
660
+ // signal, not the caller's: the trim, the video extract and the download all
661
+ // took `signal`, so `internalController.abort()` cancelled nothing and the
662
+ // `rmSync(workDir)` on the next line ran while their ffmpeg children were
663
+ // still writing into it.
664
+ const internalController = new AbortController();
665
+ const effectiveSignal = internalController.signal;
666
+ if (signal) {
667
+ if (signal.aborted)
668
+ internalController.abort();
669
+ else
670
+ signal.addEventListener("abort", () => internalController.abort(), { once: true });
671
+ }
597
672
  await Promise.all(elements.map(async (element) => {
598
- if (signal?.aborted) {
673
+ if (effectiveSignal.aborted) {
599
674
  failures.push({
600
675
  stage: "cancelled",
601
676
  reason: "cancelled",
@@ -615,7 +690,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
615
690
  }
616
691
  if (isHttpUrl(srcPath)) {
617
692
  try {
618
- srcPath = await downloadToTemp(srcPath, workDir, undefined, signal, undefined, {
693
+ srcPath = await downloadToTemp(srcPath, workDir, undefined, effectiveSignal, undefined, {
619
694
  onTelemetry: writeUrlDownloadTelemetry,
620
695
  });
621
696
  }
@@ -672,7 +747,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
672
747
  const extractResult = await extractAudioFromVideo(srcPath, extractedPath, {
673
748
  startTime: element.mediaStart,
674
749
  duration: element.end - element.start,
675
- }, signal, config);
750
+ }, effectiveSignal, config);
676
751
  if (!extractResult.success) {
677
752
  failures.push(extractResult.failure
678
753
  ? { ...extractResult.failure, elementId: element.id }
@@ -690,7 +765,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
690
765
  }
691
766
  else {
692
767
  const trimmedPath = join(workDir, `${element.id}-trimmed.wav`);
693
- const prepResult = await prepareAudioTrack(srcPath, trimmedPath, element.mediaStart, element.end - element.start, signal, config);
768
+ const prepResult = await prepareAudioTrack(srcPath, trimmedPath, element.mediaStart, element.end - element.start, effectiveSignal, config);
694
769
  if (!prepResult.success) {
695
770
  failures.push(prepResult.failure
696
771
  ? { ...prepResult.failure, elementId: element.id }
@@ -706,13 +781,58 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
706
781
  }
707
782
  audioSrcPath = trimmedPath;
708
783
  }
709
- // Primary volume-automation path: bake the envelope into the PCM samples
710
- // (sample-accurate, no keyframe ceiling). If the WAV isn't the expected
711
- // 16-bit PCM, fall back to the ffmpeg expression path by leaving the
712
- // keyframes on the track for buildVolumeExpression to handle.
784
+ // Apply the track's FX chain to the dry, trimmed audio, before volume
785
+ // automation is baked in: effects should see the raw signal, and the
786
+ // envelope belongs on their output. A missing or broken chain is fatal
787
+ // for the whole mix rather than a per-track warning quietly rendering
788
+ // the dry signal ships a mix that sounds plausible and is wrong.
789
+ const automation = element.automation
790
+ ? resolveAutomation(parseAutomation(element.automation), element.fxChain ? parseAudioFxChain(element.fxChain) : undefined)
791
+ : null;
792
+ // Computed before the chain runs, not after: the FX pass bakes the
793
+ // envelope into its float output so the duck lands before the ±1 clamp
794
+ // in writeWav, instead of after it.
795
+ //
796
+ // A volume lane supersedes keyframes probed from the timeline: the two
797
+ // would fight, and the lane is the explicit one. `lint` warns when a
798
+ // track carries both.
799
+ const laneKeyframes = automation
800
+ ? volumeLaneKeyframes(automation, element.start, element.end - element.start)
801
+ : null;
802
+ const envelopeKeyframes = laneKeyframes ?? element.volumeKeyframes;
803
+ const envelope = envelopeKeyframes && envelopeKeyframes.length > 0
804
+ ? {
805
+ keyframes: envelopeKeyframes,
806
+ trackStart: element.start,
807
+ baseVolume: element.volume ?? 1.0,
808
+ }
809
+ : null;
713
810
  let bakedEnvelope = false;
714
- if (element.volumeKeyframes && element.volumeKeyframes.length > 0) {
715
- bakedEnvelope = applyVolumeEnvelopeToWav(audioSrcPath, element.volumeKeyframes, element.start, element.volume ?? 1.0);
811
+ let tailSeconds = 0;
812
+ if (element.fxChain) {
813
+ // The chain is serialised into the attribute, the same way colour
814
+ // grading carries its config, so there is no side-car file to find,
815
+ // resolve or lose.
816
+ const chain = parseAudioFxChain(element.fxChain);
817
+ // The rendered WAV is longer than the input by exactly this much, so
818
+ // the mix has to be told to let it through.
819
+ tailSeconds = chainTailSeconds(chain, automation ?? undefined);
820
+ const fxResult = await applyAudioFxChain(audioSrcPath, chain, join(workDir, `${element.id}-fx.wav`), {
821
+ trackId: element.id,
822
+ signal: effectiveSignal,
823
+ ...(automation ? { automation } : {}),
824
+ ...(envelope ? { envelope } : {}),
825
+ });
826
+ audioSrcPath = fxResult.path;
827
+ bakedEnvelope = fxResult.envelopeBaked;
828
+ }
829
+ // Primary volume-automation path for a track the FX pass did not bake:
830
+ // multiply the envelope into the PCM samples (sample-accurate, no
831
+ // keyframe ceiling). If the WAV isn't the expected 16-bit PCM, fall
832
+ // back to the ffmpeg expression path by leaving the keyframes on the
833
+ // track for buildVolumeExpression to handle.
834
+ if (envelope && !bakedEnvelope) {
835
+ bakedEnvelope = applyVolumeEnvelopeToWav(audioSrcPath, envelope.keyframes, envelope.trackStart, envelope.baseVolume);
716
836
  }
717
837
  tracks.push({
718
838
  id: element.id,
@@ -723,10 +843,17 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
723
843
  duration: element.end - element.start,
724
844
  // Gain is already in the samples when baked, so mix at unity.
725
845
  volume: bakedEnvelope ? 1.0 : (element.volume ?? 1.0),
726
- volumeKeyframes: bakedEnvelope ? undefined : element.volumeKeyframes,
846
+ volumeKeyframes: bakedEnvelope ? undefined : (envelopeKeyframes ?? undefined),
847
+ ...(tailSeconds > 0 ? { tailSeconds } : {}),
727
848
  });
728
849
  }
729
850
  catch (err) {
851
+ // An FX failure is fatal for the whole mix. Every other failure mode
852
+ // degrades gracefully — the track drops and siblings continue — but
853
+ // substituting the dry signal for a processed one ships a render that
854
+ // sounds plausible and is not what was authored.
855
+ if (err instanceof AudioFxRenderError)
856
+ throw err;
730
857
  failures.push({
731
858
  stage: "internal",
732
859
  reason: "internal",
@@ -736,7 +863,18 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
736
863
  detail: boundedDetail(`Audio processing failed for element ${element.id}: ${err instanceof Error ? err.message : String(err)}`),
737
864
  });
738
865
  }
739
- }));
866
+ })).catch((err) => {
867
+ // Promise.all rejected on the first fatal failure without waiting for its
868
+ // siblings; abort them so their ffmpeg stops before workDir disappears.
869
+ internalController.abort();
870
+ try {
871
+ rmSync(workDir, { recursive: true, force: true });
872
+ }
873
+ catch {
874
+ /* ignore */
875
+ }
876
+ throw err;
877
+ });
740
878
  // Never turn a per-track preparation failure into a successful partial mix.
741
879
  // The producer only surfaces audio failures when `success` is false; mixing
742
880
  // the remaining tracks made the omitted cue indistinguishable from a valid
@@ -1 +1 @@
1
- {"version":3,"file":"audioMixer.js","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audioMixer.js","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAwB,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAsB,MAAM,wBAAwB,CAAC;AAQpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GAEd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAK3E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEhD,SAAS,WAAW,CAAC,MAAc;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB;IAChD,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,qCAAqC,CAAC,MAAc;IAC3D,OAAO,CACL,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;QACrC,oDAAoD,CAAC,IAAI,CAAC,MAAM,CAAC,CAClE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC,4EAA4E;AAC5E,8EAA8E;AAC9E,+DAA+D;AAC/D,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAE7D,KAAK,UAAU,gBAAgB,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,uBAAuB,CAC9B,SAA6C;IAE7C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,IAAI,GAAG,IAAI,KAAK,CAAU,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACf,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAClC,MAAM,KAAK,GAAuB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAE,CAAC;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAE,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACnC,IAAI,WAAW,GAAG,uBAAuB,CAAC;QAC1C,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC5B,MAAM,YAAY,GAChB,IAAI,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;YACvD,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC3B,WAAW,GAAG,QAAQ,CAAC;gBACvB,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,UAAU,CAAC,MAAM,IAAI,mBAAmB;QAAE,OAAO,UAAU,CAAC;IAEhE,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAuC,EAAE,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAE,CAAC;QAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAiB,EAAE,eAAe,GAAG,KAAK;IACvE,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACxF,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;KACrC,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAEhF,IAAI,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;YACnE,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,kFAAkF;IAClF,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,IAAI,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QAChC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,GAAG,aAAa,KAAK,KAAK,QAAQ,WAAW,GAAG,CAAC;QACjE,UAAU,GAAG,WAAW,QAAQ,KAAK,OAAO,IAAI,UAAU,GAAG,CAAC;IAChE,CAAC;IAED,OAAO,UAAU,sBAAsB,CAAC,UAAU,CAAC,aAAa,CAAC;AACnE,CAAC;AAUD,SAAS,aAAa,CAAC,OAAe,EAAE,SAAS,GAAG,KAAK;IACvD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,2BAA2B,EAAE,gBAAgB,CAAC;SACtD,OAAO,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;SACrD,OAAO,CACN,oEAAoE,EACpE,iBAAiB,CAClB;SACA,OAAO,CACN,iEAAiE,EACjE,mBAAmB,CACpB,CAAC;IACJ,OAAO,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC;AAC1F,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,SAAiB;IACtD,MAAM,WAAW,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,+CAA+C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/E,MAAM,YAAY,GAChB,6FAA6F,CAAC,IAAI,CAChG,OAAO,CACR,CAAC;IACJ,OAAO;QACL,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,SAAS;YACf,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,YAAY;gBACZ,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,WAAW;oBACX,CAAC,CAAC,oBAAoB;oBACtB,CAAC,CAAC,QAAQ;wBACR,CAAC,CAAC,gBAAgB;wBAClB,CAAC,CAAC,cAAc;QACxB,KAAK,EAAE,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACpD,SAAS,EAAE,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC;QACnE,SAAS;QACT,MAAM,EAAE,aAAa,CAAC,kCAAkC,SAAS,KAAK,OAAO,EAAE,CAAC;KACjF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,SAAiB;IACxD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,aAAa,GACjB,KAAK,YAAY,gBAAgB;QAC/B,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB;YAC/B,KAAK,CAAC,IAAI,KAAK,eAAe;YAC9B,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAChC,KAAK,CAAC,IAAI,KAAK,WAAW;QAC5B,CAAC,CAAC,sFAAsF,CAAC,IAAI,CACzF,OAAO,CACR,CAAC;IACR,MAAM,SAAS,GAAG,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACvF,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACxC,SAAS;QACT,SAAS;QACT,MAAM,EAAE,aAAa,CAAC,qCAAqC,SAAS,KAAK,OAAO,EAAE,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,KAA4E,EAC5E,MAAuB,EACvB,SAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,GAAqC,eAAe,CAAC;IAC/D,IAAI,KAAK,GAAoC,QAAQ,CAAC;IACtD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,MAAM,CAAC,iBAAiB,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,GAAG,WAAW,CAAC;QACrB,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;SAAM,IAAI,MAAM,CAAC,iBAAiB,KAAK,UAAU,IAAI,MAAM,CAAC,iBAAiB,KAAK,YAAY,EAAE,CAAC;QAChG,MAAM,GAAG,gBAAgB,CAAC;QAC1B,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;SAAM,IAAI,MAAM,CAAC,iBAAiB,KAAK,aAAa,EAAE,CAAC;QACtD,MAAM,GAAG,oBAAoB,CAAC;QAC9B,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;SAAM,IACL,wEAAwE,CAAC,IAAI,CAAC,MAAM,CAAC,EACrF,CAAC;QACD,MAAM,GAAG,oBAAoB,CAAC;IAChC,CAAC;SAAM,IACL,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC;QAC5C,6EAA6E,CAAC,IAAI,CAAC,MAAM,CAAC,EAC1F,CAAC;QACD,MAAM,GAAG,eAAe,CAAC;QACzB,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM;QACN,KAAK;QACL,SAAS;QACT,SAAS;QACT,MAAM,EAAE,aAAa,CACnB,MAAM,CAAC,KAAK,EAAE,OAAO;YACnB,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YAC1E,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAC/C;KACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAyC,EACzC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAQ,EAAE;QAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,yEAAyE;IACzE,iCAAiC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;YAAE,SAAS;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,8BAA8B,CAAC,CAAC,CAAC;QACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YAC1C,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,qDAAqD;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAClD,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC;QAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAMrD,8EAA8E;IAC9E,8DAA8D;IAC9D,+EAA+E;IAC/E,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,MAAM,YAAY,GAAG,CAAC,EAAiB,EAAU,EAAE,CACjD,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,8EAA8E;IAC9E,2EAA2E;IAC3E,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAU,EAAE;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,EAAqB,EAAW,EAAE;QAClD,KAAK,IAAI,OAAO,GAA6B,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1F,IAAI,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC;gBAAE,OAAO,IAAI,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,0EAA0E;IAE1E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,CAAC,EAAiB,EAAE,EAAU,EAAE,IAA0B,EAAgB,EAAE;QACxF,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;QAC7D,OAAO;YACL,EAAE;YACF,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAW;YACrC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YACvB,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;YACjD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,IAAI;SACL,CAAC;IACJ,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,EAAE,CAAC;QACpF,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAAiB,EACjB,UAAkB,EAClB,OAAmD,EACnD,MAAoB,EACpB,MAA4D;IAE5D,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB,CAAC;IACjG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAClF,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAEhF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAA2B;YACtC,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,yBAAyB;SAClC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,QAAgB,EAChB,MAAoB,EACpB,MAA4D;IAE5D,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB,CAAC;IACjG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG;QACX,KAAK;QACL,MAAM,CAAC,UAAU,CAAC;QAClB,IAAI;QACJ,MAAM,CAAC,QAAQ,CAAC;QAChB,IAAI;QACJ,OAAO;QACP,SAAS;QACT,WAAW;QACX,KAAK;QACL,OAAO;QACP,GAAG,WAAW;QACd,IAAI;QACJ,UAAU;KACX,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAEhF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAA2B;YACtC,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,yBAAyB;SAClC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,OAAO,EAAE,MAAM;QACtB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,QAAgB,EAChB,MAAoB,EACpB,MAA4D;IAE5D,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB,CAAC;IACjG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,4BAA4B;QAC5B,IAAI;QACJ,MAAM,CAAC,QAAQ,CAAC;QAChB,SAAS;QACT,WAAW;QACX,IAAI;QACJ,UAAU;KACX,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAEhF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAA2B;YACtC,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,8BAA8B;SACvC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,OAAO,EAAE,MAAM;QACtB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAoB,EACpB,UAAkB,EAClB,aAAqB,EACrB,MAAoB,EACpB,MAA0E;IAE1E,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB,CAAC;IACjG,MAAM,gBAAgB,GAAG,MAAM,EAAE,SAAS,IAAI,cAAc,CAAC,SAAS,CAAC;IAEvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SACxD,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,kBAAkB,GAAG,CAAC,gBAAyB,EAAU,EAAE;QAC/D,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YAC/C,0EAA0E;YAC1E,yEAAyE;YACzE,yEAAyE;YACzE,iEAAiE;YACjE,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;YACxE,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACpE,WAAW,CAAC,IAAI,CACd,IAAI,CAAC,cAAc,kBAAkB,CAAC,YAAY,CAAC,IAAI,YAAY,WAAW,OAAO,IAAI,OAAO,iBAAiB,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAC5J,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,GAAG,SAAS,eAAe,MAAM,CAAC,MAAM,+CAA+C,CAAC;QAC1G,gFAAgF;QAChF,kFAAkF;QAClF,MAAM,eAAe,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;QACzD,MAAM,iBAAiB,GAAG,iBAAiB,kBAAkB,CAAC,eAAe,CAAC,OAAO,CAAC;QACtF,OAAO,CAAC,GAAG,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,yEAAyE;IACzE,mEAAmE;IACnE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,yEAAyE;IACzE,8DAA8D;IAC9D,6EAA6E;IAC7E,2EAA2E;IAC3E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,MAAM,GAAG,KAAK,EAAE,gBAAyB,EAAE,EAAE;QACjD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,aAAa,CAAC,EAAE,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,GAAG;YACX,GAAG,MAAM;YACT,wBAAwB;YACxB,UAAU;YACV,MAAM;YACN,OAAO;YACP,SAAS;YACT,KAAK;YACL,MAAM;YACN,MAAM;YACN,IAAI;YACJ,MAAM,CAAC,aAAa,CAAC;YACrB,IAAI;YACJ,UAAU;SACX,CAAC;QACF,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACtF,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,qCAAqC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9B,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,kBAAkB,CAAC;YAChF,OAAO,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACjF,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,wEAAwE;IACxE,6DAA6D;IAC7D,2EAA2E;IAC3E,uEAAuE;IACvE,yEAAyE;IACzE,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,aAAa,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,KAAK,CAAC;YACf,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,qBAAqB;YAC5B,QAAQ,EAAE;gBACR;oBACE,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,MAAM;oBACb,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,qBAAqB;iBAC9B;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,MAAM,CAAC,MAAM;QAC9B,KAAK,EAAE,kBAAkB;YACvB,CAAC,CAAC,2FAA2F;YAC7F,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAwB,EACxB,OAAe,EACf,OAAe,EACf,UAAkB,EAClB,aAAqB,EACrB,MAAoB,EACpB,MAA0E,EAC1E,WAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,2EAA2E;IAC3E,wCAAwC;IACxC,EAAE;IACF,wEAAwE;IACxE,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;IACjD,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO;YAAE,kBAAkB,CAAC,KAAK,EAAE,CAAC;;YAC1C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7B,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,MAAM;gBACb,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,aAAa,CAAC,2BAA2B,OAAO,CAAC,EAAE,EAAE,CAAC;aAC/D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,4DAA4D;gBAC5D,qEAAqE;gBACrE,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,cAAc,CAC5B,OAAO,EACP,OAAO,EACP,SAAS,EACT,eAAe,EACf,SAAS,EACT;wBACE,WAAW,EAAE,yBAAyB;qBACvC,CACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;oBAChD,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,kBAAkB;oBAC1B,KAAK,EAAE,MAAM;oBACb,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,MAAM,EAAE,aAAa,CAAC,sCAAsC,OAAO,CAAC,EAAE,EAAE,CAAC;iBAC1E,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,iEAAiE;YACjE,sEAAsE;YACtE,wEAAwE;YACxE,8DAA8D;YAC9D,uEAAuE;YACvE,oEAAoE;YACpE,IAAI,MAAM,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,eAAe;oBACvB,KAAK,EAAE,MAAM;oBACb,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,MAAM,EAAE,aAAa,CACnB,iBAAiB,OAAO,CAAC,EAAE,uDAAuD,CACnF;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,gEAAgE;YAChE,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,QAAQ,CAAC;gBACb,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBACjD,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,QAAQ,CAAC,IAAI,CACX,YAAY,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAC3E,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;gBACxE,OAAO,CAAC,GAAG;oBACT,OAAO,CAAC,KAAK,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC3F,CAAC;YAED,IAAI,YAAY,GAAG,OAAO,CAAC;YAC3B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACnE,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAC/C,OAAO,EACP,aAAa,EACb;oBACE,SAAS,EAAE,OAAO,CAAC,UAAU;oBAC7B,QAAQ,EAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK;iBACtC,EACD,eAAe,EACf,MAAM,CACP,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CACX,aAAa,CAAC,OAAO;wBACnB,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;wBACrD,CAAC,CAAC;4BACE,KAAK,EAAE,SAAS;4BAChB,MAAM,EAAE,eAAe;4BACvB,KAAK,EAAE,QAAQ;4BACf,SAAS,EAAE,KAAK;4BAChB,SAAS,EAAE,OAAO,CAAC,EAAE;4BACrB,MAAM,EAAE,aAAa,CAAC,oCAAoC,OAAO,CAAC,EAAE,EAAE,CAAC;yBACxE,CACN,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,YAAY,GAAG,aAAa,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC/D,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,OAAO,EACP,WAAW,EACX,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,EAC3B,eAAe,EACf,MAAM,CACP,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxB,QAAQ,CAAC,IAAI,CACX,UAAU,CAAC,OAAO;wBAChB,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;wBAClD,CAAC,CAAC;4BACE,KAAK,EAAE,SAAS;4BAChB,MAAM,EAAE,eAAe;4BACvB,KAAK,EAAE,QAAQ;4BACf,SAAS,EAAE,KAAK;4BAChB,SAAS,EAAE,OAAO,CAAC,EAAE;4BACrB,MAAM,EAAE,aAAa,CAAC,oCAAoC,OAAO,CAAC,EAAE,EAAE,CAAC;yBACxE,CACN,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,YAAY,GAAG,WAAW,CAAC;YAC7B,CAAC;YAED,sEAAsE;YACtE,qEAAqE;YACrE,uEAAuE;YACvE,wEAAwE;YACxE,iEAAiE;YACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;gBACnC,CAAC,CAAC,iBAAiB,CACf,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EACnC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CACjE;gBACH,CAAC,CAAC,IAAI,CAAC;YAET,mEAAmE;YACnE,uEAAuE;YACvE,oCAAoC;YACpC,EAAE;YACF,uEAAuE;YACvE,qEAAqE;YACrE,sBAAsB;YACtB,MAAM,aAAa,GAAG,UAAU;gBAC9B,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC7E,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,iBAAiB,GAAG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;YACnE,MAAM,QAAQ,GACZ,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;gBAC/C,CAAC,CAAC;oBACE,SAAS,EAAE,iBAAiB;oBAC5B,UAAU,EAAE,OAAO,CAAC,KAAK;oBACzB,UAAU,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;iBAClC;gBACH,CAAC,CAAC,IAAI,CAAC;YAEX,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,kEAAkE;gBAClE,oEAAoE;gBACpE,mBAAmB;gBACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjD,qEAAqE;gBACrE,4CAA4C;gBAC5C,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC;gBAC/D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,YAAY,EACZ,KAAK,EACL,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,CAAC,EACrC;oBACE,OAAO,EAAE,OAAO,CAAC,EAAE;oBACnB,MAAM,EAAE,eAAe;oBACvB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClC,CACF,CAAC;gBACF,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAC7B,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YACzC,CAAC;YAED,uEAAuE;YACvE,kEAAkE;YAClE,oEAAoE;YACpE,qEAAqE;YACrE,6CAA6C;YAC7C,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC/B,aAAa,GAAG,wBAAwB,CACtC,YAAY,EACZ,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,CACpB,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK;gBACrC,8DAA8D;gBAC9D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;gBACrD,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,SAAS,CAAC;gBAC7E,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,qEAAqE;YACrE,oEAAoE;YACpE,sEAAsE;YACtE,iDAAiD;YACjD,IAAI,GAAG,YAAY,kBAAkB;gBAAE,MAAM,GAAG,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,aAAa,CACnB,uCAAuC,OAAO,CAAC,EAAE,KAC/C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CACH,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACvB,0EAA0E;QAC1E,wEAAwE;QACxE,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAChC,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,KAAK,EAAE,aAAa,CAClB,4BAA4B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF;YACD,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE1F,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,OAAO;QACL,GAAG,SAAS;QACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;QAChC,KAAK,EAAE,SAAS,CAAC,KAAK;KACvB,CAAC;AACJ,CAAC"}
@@ -11,6 +11,10 @@ export interface AudioElement {
11
11
  layer: number;
12
12
  volume?: number;
13
13
  volumeKeyframes?: AudioVolumeKeyframe[];
14
+ /** Serialised FX chain JSON from `data-fx-chain`, when set. */
15
+ fxChain?: string;
16
+ /** Serialised automation JSON from `data-automation`, when set. */
17
+ automation?: string;
14
18
  type: "audio" | "video";
15
19
  }
16
20
  export interface AudioTrack {
@@ -22,6 +26,12 @@ export interface AudioTrack {
22
26
  duration: number;
23
27
  volume: number;
24
28
  volumeKeyframes?: AudioVolumeKeyframe[];
29
+ /**
30
+ * Seconds of FX tail past `end` that the mix should let through — a reverb or
31
+ * delay still decaying when the clip's own audio stops. Absent means cut at
32
+ * the clip boundary, which is what every track without an FX chain wants.
33
+ */
34
+ tailSeconds?: number;
25
35
  }
26
36
  export type AudioFailureStage = "source" | "download" | "probe" | "extract" | "prepare" | "mix" | "silence" | "cancelled" | "internal";
27
37
  export type AudioFailureReason = "source_not_found" | "download_failed" | "probe_failed" | "invalid_media" | "ffmpeg_unsupported" | "ffmpeg_timeout" | "ffmpeg_unavailable" | "ffmpeg_failed" | "cancelled" | "internal";
@@ -1 +1 @@
1
- {"version":3,"file":"audioMixer.types.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,SAAS,GACT,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACrC"}
1
+ {"version":3,"file":"audioMixer.types.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,SAAS,GACT,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACrC"}
@@ -15,6 +15,17 @@
15
15
  * the caller can fall back to the expression path rather than corrupting audio.
16
16
  */
17
17
  import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
18
+ /**
19
+ * A gain lookup that walks forward through the envelope with a segment cursor,
20
+ * so a whole track costs O(N+M) rather than O(N×M). `interpolateVolumeGain`
21
+ * restarts from segment 0 on every call — fine for the preview path (once per
22
+ * RAF tick), not for a per-sample walk over 48k×duration frames.
23
+ *
24
+ * The cursor only ever advances, so callers must pass non-decreasing times.
25
+ * Returns null when the keyframes normalise to nothing, which the callers read
26
+ * as "no automation here".
27
+ */
28
+ export declare function createEnvelopeWalker(keyframes: AudioVolumeKeyframe[], trackStart: number, baseVolume: number): ((time: number) => number) | null;
18
29
  /**
19
30
  * Multiply a prepared WAV's samples by a time-varying gain envelope in place.
20
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"audioVolumeEnvelope.d.ts","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAyDjE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,mBAAmB,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAkDT"}
1
+ {"version":3,"file":"audioVolumeEnvelope.d.ts","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAoDjE;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAkBnC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,mBAAmB,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAqCT"}
@@ -17,6 +17,7 @@
17
17
  import { readFileSync, renameSync, writeFileSync } from "fs";
18
18
  import { randomBytes } from "crypto";
19
19
  import { normaliseEnvelope } from "@hyperframes/core/media-volume-envelope";
20
+ import { riffChunks } from "./wavChunks.js";
20
21
  const PCM_FORMAT = 1; // WAVE_FORMAT_PCM
21
22
  const SUPPORTED_BITS = 16;
22
23
  /**
@@ -32,14 +33,10 @@ function parseWavLayout(buffer) {
32
33
  return null;
33
34
  if (buffer.toString("ascii", 8, 12) !== "WAVE")
34
35
  return null;
35
- let offset = 12;
36
36
  let fmt = null;
37
37
  let data = null;
38
- while (offset + 8 <= buffer.length) {
39
- const chunkId = buffer.toString("ascii", offset, offset + 4);
40
- const chunkSize = buffer.readUInt32LE(offset + 4);
41
- const body = offset + 8;
42
- if (chunkId === "fmt " && body + 16 <= buffer.length) {
38
+ for (const { id, body, size } of riffChunks(buffer)) {
39
+ if (id === "fmt " && body + 16 <= buffer.length) {
43
40
  if (buffer.readUInt16LE(body) !== PCM_FORMAT)
44
41
  return null;
45
42
  fmt = {
@@ -48,11 +45,9 @@ function parseWavLayout(buffer) {
48
45
  bitsPerSample: buffer.readUInt16LE(body + 14),
49
46
  };
50
47
  }
51
- else if (chunkId === "data") {
52
- data = { offset: body, size: Math.min(chunkSize, buffer.length - body) };
48
+ else if (id === "data") {
49
+ data = { offset: body, size: Math.min(size, buffer.length - body) };
53
50
  }
54
- // Chunks are word-aligned: an odd size carries a trailing pad byte.
55
- offset = body + chunkSize + (chunkSize % 2);
56
51
  }
57
52
  if (!fmt || !data)
58
53
  return null;
@@ -65,6 +60,36 @@ function parseWavLayout(buffer) {
65
60
  dataSize: data.size,
66
61
  };
67
62
  }
63
+ /**
64
+ * A gain lookup that walks forward through the envelope with a segment cursor,
65
+ * so a whole track costs O(N+M) rather than O(N×M). `interpolateVolumeGain`
66
+ * restarts from segment 0 on every call — fine for the preview path (once per
67
+ * RAF tick), not for a per-sample walk over 48k×duration frames.
68
+ *
69
+ * The cursor only ever advances, so callers must pass non-decreasing times.
70
+ * Returns null when the keyframes normalise to nothing, which the callers read
71
+ * as "no automation here".
72
+ */
73
+ export function createEnvelopeWalker(keyframes, trackStart, baseVolume) {
74
+ const envelope = normaliseEnvelope(keyframes, trackStart, baseVolume);
75
+ const first = envelope[0];
76
+ if (!first)
77
+ return null;
78
+ let segment = 0;
79
+ return (time) => {
80
+ for (;;) {
81
+ const next = envelope[segment + 1];
82
+ if (segment >= envelope.length - 2 || !next || time < next.time)
83
+ break;
84
+ segment += 1;
85
+ }
86
+ const a = envelope[segment] ?? first;
87
+ const b = envelope[segment + 1] ?? a;
88
+ const span = b.time - a.time;
89
+ const progress = span <= 0 ? 0 : Math.min(1, Math.max(0, (time - a.time) / span));
90
+ return a.volume + (b.volume - a.volume) * progress;
91
+ };
92
+ }
68
93
  /**
69
94
  * Multiply a prepared WAV's samples by a time-varying gain envelope in place.
70
95
  *
@@ -72,8 +97,8 @@ function parseWavLayout(buffer) {
72
97
  * expected 16-bit PCM (caller should fall back to the expression path).
73
98
  */
74
99
  export function applyVolumeEnvelopeToWav(wavPath, keyframes, trackStart, baseVolume) {
75
- const envelope = normaliseEnvelope(keyframes, trackStart, baseVolume);
76
- if (envelope.length === 0)
100
+ const gainAt = createEnvelopeWalker(keyframes, trackStart, baseVolume);
101
+ if (!gainAt)
77
102
  return false;
78
103
  try {
79
104
  const buffer = readFileSync(wavPath);
@@ -84,20 +109,8 @@ export function applyVolumeEnvelopeToWav(wavPath, keyframes, trackStart, baseVol
84
109
  const bytesPerSample = SUPPORTED_BITS / 8;
85
110
  const frameBytes = numChannels * bytesPerSample;
86
111
  const frameCount = Math.floor(dataSize / frameBytes);
87
- // Maintain an incremental segment cursor so the per-frame envelope lookup
88
- // is O(N+M) overall, not O(N×M). interpolateVolumeGain restarts from 0 on
89
- // each call — fine for the preview path (one call per RAF tick) but not for
90
- // the PCM path (one call per sample, 48k×duration frames total).
91
- let segment = 0;
92
112
  for (let frame = 0; frame < frameCount; frame += 1) {
93
- const time = frame / sampleRate;
94
- while (segment < envelope.length - 2 && time >= envelope[segment + 1].time)
95
- segment += 1;
96
- const a = envelope[segment];
97
- const b = envelope[segment + 1] ?? a;
98
- const span = b.time - a.time;
99
- const progress = span <= 0 ? 0 : Math.min(1, Math.max(0, (time - a.time) / span));
100
- const gain = a.volume + (b.volume - a.volume) * progress;
113
+ const gain = gainAt(frame / sampleRate);
101
114
  const base = dataOffset + frame * frameBytes;
102
115
  for (let channel = 0; channel < numChannels; channel += 1) {
103
116
  const at = base + channel * bytesPerSample;
@@ -1 +1 @@
1
- {"version":3,"file":"audioVolumeEnvelope.js","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audioVolumeEnvelope.js","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The RIFF chunk walk, which two WAV readers in this directory each had a copy
3
+ * of: `audioFxRender`'s `readWavChunks` and `audioVolumeEnvelope`'s
4
+ * `parseWavLayout`.
5
+ *
6
+ * Only the walk is shared. What the two do with the chunks is genuinely
7
+ * different — one wants a slice of the payload and lets the decoder judge the
8
+ * format, the other wants offsets to edit in place and refuses anything that is
9
+ * not 16-bit PCM — and folding those together would mean picking one behaviour
10
+ * for each difference, in the parser every render's audio passes through. So
11
+ * this yields chunks and holds no policy at all.
12
+ */
13
+ export interface RiffChunk {
14
+ /** Four ASCII characters: `fmt `, `data`, `LIST`, `fact`, … */
15
+ id: string;
16
+ /** Byte offset of the chunk's body, past the 8-byte header. */
17
+ body: number;
18
+ /** The size the chunk declares. May run past the end of a truncated file. */
19
+ size: number;
20
+ }
21
+ /**
22
+ * Every chunk after the 12-byte RIFF header, in the order they sit.
23
+ *
24
+ * Advances by each chunk's declared size, so ordering is not assumed — `data`
25
+ * may precede `fmt `, and trailing LIST/fact chunks are walked past rather than
26
+ * tripped over. Chunks are word-aligned, so an odd size carries a pad byte.
27
+ */
28
+ export declare function riffChunks(buffer: Buffer): Generator<RiffChunk>;
29
+ //# sourceMappingURL=wavChunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wavChunks.d.ts","sourceRoot":"","sources":["../../src/services/wavChunks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAiB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAQhE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The RIFF chunk walk, which two WAV readers in this directory each had a copy
3
+ * of: `audioFxRender`'s `readWavChunks` and `audioVolumeEnvelope`'s
4
+ * `parseWavLayout`.
5
+ *
6
+ * Only the walk is shared. What the two do with the chunks is genuinely
7
+ * different — one wants a slice of the payload and lets the decoder judge the
8
+ * format, the other wants offsets to edit in place and refuses anything that is
9
+ * not 16-bit PCM — and folding those together would mean picking one behaviour
10
+ * for each difference, in the parser every render's audio passes through. So
11
+ * this yields chunks and holds no policy at all.
12
+ */
13
+ /**
14
+ * Every chunk after the 12-byte RIFF header, in the order they sit.
15
+ *
16
+ * Advances by each chunk's declared size, so ordering is not assumed — `data`
17
+ * may precede `fmt `, and trailing LIST/fact chunks are walked past rather than
18
+ * tripped over. Chunks are word-aligned, so an odd size carries a pad byte.
19
+ */
20
+ export function* riffChunks(buffer) {
21
+ let offset = 12;
22
+ while (offset + 8 <= buffer.length) {
23
+ const id = buffer.toString("ascii", offset, offset + 4);
24
+ const size = buffer.readUInt32LE(offset + 4);
25
+ yield { id, body: offset + 8, size };
26
+ offset += 8 + size + (size % 2);
27
+ }
28
+ }
29
+ //# sourceMappingURL=wavChunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wavChunks.js","sourceRoot":"","sources":["../../src/services/wavChunks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH;;;;;;GAMG;AACH,MAAM,SAAS,CAAC,CAAC,UAAU,CAAC,MAAc;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/engine",
3
- "version": "0.7.107",
3
+ "version": "0.7.108",
4
4
  "description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -38,8 +38,8 @@
38
38
  "linkedom": "^0.18.12",
39
39
  "puppeteer": "^25.2.1",
40
40
  "puppeteer-core": "^25.2.1",
41
- "@hyperframes/core": "^0.7.107",
42
- "@hyperframes/parsers": "^0.7.107"
41
+ "@hyperframes/core": "^0.7.108",
42
+ "@hyperframes/parsers": "^0.7.108"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^25.0.10",