@aura3d/editor-runtime 1.0.6 → 1.3.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/dist/AnimationSceneEditor.d.ts +111 -0
- package/dist/AnimationSceneEditor.d.ts.map +1 -0
- package/dist/AnimationSceneEditor.js +285 -0
- package/dist/AnimationSceneEditor.js.map +1 -0
- package/dist/AssetDropZone.d.ts +52 -0
- package/dist/AssetDropZone.d.ts.map +1 -0
- package/dist/AssetDropZone.js +115 -0
- package/dist/AssetDropZone.js.map +1 -0
- package/dist/CameraPathEditor.d.ts +48 -0
- package/dist/CameraPathEditor.d.ts.map +1 -0
- package/dist/CameraPathEditor.js +181 -0
- package/dist/CameraPathEditor.js.map +1 -0
- package/dist/CartoonSceneEditor.d.ts +111 -0
- package/dist/CartoonSceneEditor.d.ts.map +1 -0
- package/dist/CartoonSceneEditor.js +285 -0
- package/dist/CartoonSceneEditor.js.map +1 -0
- package/dist/CurveEditor.d.ts +38 -0
- package/dist/CurveEditor.d.ts.map +1 -0
- package/dist/CurveEditor.js +112 -0
- package/dist/CurveEditor.js.map +1 -0
- package/dist/EpisodeReviewPanel.d.ts +67 -0
- package/dist/EpisodeReviewPanel.d.ts.map +1 -0
- package/dist/EpisodeReviewPanel.js +162 -0
- package/dist/EpisodeReviewPanel.js.map +1 -0
- package/dist/EventTrackEditor.d.ts +54 -0
- package/dist/EventTrackEditor.d.ts.map +1 -0
- package/dist/EventTrackEditor.js +124 -0
- package/dist/EventTrackEditor.js.map +1 -0
- package/dist/KeyframeEditor.d.ts +49 -0
- package/dist/KeyframeEditor.d.ts.map +1 -0
- package/dist/KeyframeEditor.js +161 -0
- package/dist/KeyframeEditor.js.map +1 -0
- package/dist/MultiUserReviewWorkflow.d.ts +77 -0
- package/dist/MultiUserReviewWorkflow.d.ts.map +1 -0
- package/dist/MultiUserReviewWorkflow.js +162 -0
- package/dist/MultiUserReviewWorkflow.js.map +1 -0
- package/dist/NonlinearAnimationEditor.d.ts +81 -0
- package/dist/NonlinearAnimationEditor.d.ts.map +1 -0
- package/dist/NonlinearAnimationEditor.js +180 -0
- package/dist/NonlinearAnimationEditor.js.map +1 -0
- package/dist/PropertyPanel.d.ts +21 -0
- package/dist/PropertyPanel.d.ts.map +1 -0
- package/dist/PropertyPanel.js +72 -0
- package/dist/PropertyPanel.js.map +1 -0
- package/dist/RenderQueuePanel.d.ts +38 -0
- package/dist/RenderQueuePanel.d.ts.map +1 -0
- package/dist/RenderQueuePanel.js +72 -0
- package/dist/RenderQueuePanel.js.map +1 -0
- package/dist/SceneOutliner.d.ts +19 -0
- package/dist/SceneOutliner.d.ts.map +1 -0
- package/dist/SceneOutliner.js +64 -0
- package/dist/SceneOutliner.js.map +1 -0
- package/dist/TimelineEditorController.d.ts +102 -0
- package/dist/TimelineEditorController.d.ts.map +1 -0
- package/dist/TimelineEditorController.js +449 -0
- package/dist/TimelineEditorController.js.map +1 -0
- package/dist/TimelineTrackTypes.d.ts +25 -0
- package/dist/TimelineTrackTypes.d.ts.map +1 -0
- package/dist/TimelineTrackTypes.js +48 -0
- package/dist/TimelineTrackTypes.js.map +1 -0
- package/dist/TimelineUI.d.ts +27 -0
- package/dist/TimelineUI.d.ts.map +1 -0
- package/dist/TimelineUI.js +123 -0
- package/dist/TimelineUI.js.map +1 -0
- package/dist/VisualReviewDashboard.d.ts +43 -0
- package/dist/VisualReviewDashboard.d.ts.map +1 -0
- package/dist/VisualReviewDashboard.js +47 -0
- package/dist/VisualReviewDashboard.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/AnimationSceneEditor.ts +368 -0
- package/src/AssetDropZone.ts +144 -0
- package/src/CameraPathEditor.ts +223 -0
- package/src/CurveEditor.ts +152 -0
- package/src/EpisodeReviewPanel.ts +236 -0
- package/src/EventTrackEditor.ts +169 -0
- package/src/KeyframeEditor.ts +214 -0
- package/src/MultiUserReviewWorkflow.ts +229 -0
- package/src/NonlinearAnimationEditor.ts +262 -0
- package/src/PropertyPanel.ts +82 -0
- package/src/RenderQueuePanel.ts +106 -0
- package/src/SceneOutliner.ts +78 -0
- package/src/TimelineEditorController.ts +525 -0
- package/src/TimelineTrackTypes.ts +89 -0
- package/src/TimelineUI.ts +153 -0
- package/src/VisualReviewDashboard.ts +87 -0
- package/src/index.ts +55 -0
- package/tests/editor-runtime.test.ts +490 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { TimelineEditorController } from "./TimelineEditorController.js";
|
|
2
|
+
import { TimelineModel } from "./TimelineModel.js";
|
|
3
|
+
import { createTimelineTrackConfig } from "./TimelineTrackTypes.js";
|
|
4
|
+
export class NonlinearAnimationEditor {
|
|
5
|
+
binAssets = new Map();
|
|
6
|
+
sequences = new Map();
|
|
7
|
+
activeSequenceId;
|
|
8
|
+
constructor(state) {
|
|
9
|
+
if (state.sequences.length === 0)
|
|
10
|
+
throw new Error("Nonlinear animation editor requires at least one sequence.");
|
|
11
|
+
for (const asset of state.binAssets)
|
|
12
|
+
this.addBinAsset(asset);
|
|
13
|
+
for (const sequence of state.sequences)
|
|
14
|
+
this.createSequence(sequence);
|
|
15
|
+
this.activeSequenceId = nonEmpty(state.activeSequenceId, "Active sequence id");
|
|
16
|
+
this.requireSequence(this.activeSequenceId);
|
|
17
|
+
}
|
|
18
|
+
addBinAsset(asset) {
|
|
19
|
+
const clean = sanitizeBinAsset(asset);
|
|
20
|
+
this.binAssets.set(clean.id, clean);
|
|
21
|
+
return clean;
|
|
22
|
+
}
|
|
23
|
+
createSequence(config) {
|
|
24
|
+
const id = nonEmpty(config.id, "Sequence id");
|
|
25
|
+
const timeline = new TimelineModel({
|
|
26
|
+
id,
|
|
27
|
+
name: config.name,
|
|
28
|
+
duration: 10,
|
|
29
|
+
frameRate: 24,
|
|
30
|
+
loopMode: "none",
|
|
31
|
+
...config.timeline
|
|
32
|
+
});
|
|
33
|
+
this.sequences.set(id, {
|
|
34
|
+
id,
|
|
35
|
+
name: nonEmpty(config.name, "Sequence name"),
|
|
36
|
+
controller: new TimelineEditorController({ timeline })
|
|
37
|
+
});
|
|
38
|
+
return this.sequenceSnapshot(this.requireSequence(id));
|
|
39
|
+
}
|
|
40
|
+
selectSequence(sequenceId) {
|
|
41
|
+
this.activeSequenceId = this.requireSequence(sequenceId).id;
|
|
42
|
+
return this.snapshot();
|
|
43
|
+
}
|
|
44
|
+
async addTrack(kind, name, options = {}) {
|
|
45
|
+
const track = await this.activeSequence().controller.addTrack(kind, name, options);
|
|
46
|
+
return track.id;
|
|
47
|
+
}
|
|
48
|
+
async insertAssetClip(trackId, assetId, options) {
|
|
49
|
+
const asset = this.requireBinAsset(assetId);
|
|
50
|
+
const clip = await this.activeSequence().controller.addClip(trackId, {
|
|
51
|
+
...options,
|
|
52
|
+
id: options.id ?? `${asset.id}-${Math.round(options.startTime * 1000)}`,
|
|
53
|
+
name: options.name ?? asset.name,
|
|
54
|
+
startTime: options.startTime,
|
|
55
|
+
duration: options.duration ?? asset.duration ?? 1,
|
|
56
|
+
assetId: asset.assetId ?? asset.id,
|
|
57
|
+
clipName: asset.clipName ?? asset.name,
|
|
58
|
+
properties: {
|
|
59
|
+
...(options.properties ?? {}),
|
|
60
|
+
binAssetId: asset.id,
|
|
61
|
+
binAssetKind: asset.kind
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return clip.id;
|
|
65
|
+
}
|
|
66
|
+
async insertNestedSequence(trackId, sequenceId, options) {
|
|
67
|
+
const nested = this.requireSequence(sequenceId);
|
|
68
|
+
const clip = await this.activeSequence().controller.addClip(trackId, {
|
|
69
|
+
...options,
|
|
70
|
+
id: options.id ?? `${sequenceId}-nested-${Math.round(options.startTime * 1000)}`,
|
|
71
|
+
name: nested.name,
|
|
72
|
+
startTime: options.startTime,
|
|
73
|
+
duration: options.duration ?? nested.controller.timeline.duration,
|
|
74
|
+
properties: {
|
|
75
|
+
...(options.properties ?? {}),
|
|
76
|
+
nestedSequenceId: nested.id
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return clip.id;
|
|
80
|
+
}
|
|
81
|
+
async moveClip(clipId, startTime) {
|
|
82
|
+
await this.activeSequence().controller.moveClip(clipId, startTime);
|
|
83
|
+
}
|
|
84
|
+
async trimClip(clipId, duration, startTime) {
|
|
85
|
+
await this.activeSequence().controller.resizeClip(clipId, duration, startTime);
|
|
86
|
+
}
|
|
87
|
+
async splitClip(clipId, splitTime) {
|
|
88
|
+
const clips = await this.activeSequence().controller.splitClip(clipId, splitTime);
|
|
89
|
+
return clips.map((clip) => clip.id);
|
|
90
|
+
}
|
|
91
|
+
async duplicateClip(clipId, timeOffset) {
|
|
92
|
+
const clip = await this.activeSequence().controller.duplicateClip(clipId, timeOffset);
|
|
93
|
+
return clip.id;
|
|
94
|
+
}
|
|
95
|
+
serialize() {
|
|
96
|
+
return {
|
|
97
|
+
activeSequenceId: this.activeSequenceId,
|
|
98
|
+
binAssets: [...this.binAssets.values()],
|
|
99
|
+
sequences: [...this.sequences.values()].map((sequence) => ({
|
|
100
|
+
id: sequence.id,
|
|
101
|
+
name: sequence.name,
|
|
102
|
+
timeline: sequence.controller.serializeTimeline()
|
|
103
|
+
}))
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
snapshot() {
|
|
107
|
+
const sequences = [...this.sequences.values()];
|
|
108
|
+
const active = this.activeSequence();
|
|
109
|
+
const totalTrackCount = sequences.reduce((count, sequence) => count + sequence.controller.timeline.tracks.length, 0);
|
|
110
|
+
const totalClipCount = sequences.reduce((count, sequence) => count + sequence.controller.timeline.tracks.reduce((clipCount, track) => clipCount + track.clips.length, 0), 0);
|
|
111
|
+
const nestedSequenceClipCount = sequences.reduce((count, sequence) => count + sequence.controller.timeline.tracks.reduce((trackCount, track) => trackCount + track.clips.filter((clip) => typeof clip.properties.nestedSequenceId === "string").length, 0), 0);
|
|
112
|
+
return {
|
|
113
|
+
kind: "nonlinear-animation-editor",
|
|
114
|
+
activeSequenceId: active.id,
|
|
115
|
+
sequenceCount: sequences.length,
|
|
116
|
+
binAssetCount: this.binAssets.size,
|
|
117
|
+
nestedSequenceClipCount,
|
|
118
|
+
totalTrackCount,
|
|
119
|
+
totalClipCount,
|
|
120
|
+
sequences: sequences.map((sequence) => this.sequenceSnapshot(sequence)),
|
|
121
|
+
activeTimeline: active.controller.snapshot(),
|
|
122
|
+
evidence: {
|
|
123
|
+
nonlinearSequences: sequences.length > 1,
|
|
124
|
+
trimSplitMoveDuplicate: active.controller.history.canUndo || active.controller.history.canRedo,
|
|
125
|
+
nestedSequences: nestedSequenceClipCount > 0,
|
|
126
|
+
multiTrackTimeline: totalTrackCount > 1,
|
|
127
|
+
serialization: true
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
activeSequence() {
|
|
132
|
+
return this.requireSequence(this.activeSequenceId);
|
|
133
|
+
}
|
|
134
|
+
requireSequence(id) {
|
|
135
|
+
const sequence = this.sequences.get(id);
|
|
136
|
+
if (!sequence)
|
|
137
|
+
throw new Error(`Unknown nonlinear sequence: ${id}`);
|
|
138
|
+
return sequence;
|
|
139
|
+
}
|
|
140
|
+
requireBinAsset(id) {
|
|
141
|
+
const asset = this.binAssets.get(id);
|
|
142
|
+
if (!asset)
|
|
143
|
+
throw new Error(`Unknown nonlinear bin asset: ${id}`);
|
|
144
|
+
return asset;
|
|
145
|
+
}
|
|
146
|
+
sequenceSnapshot(sequence) {
|
|
147
|
+
const timeline = sequence.controller.timeline;
|
|
148
|
+
return {
|
|
149
|
+
id: sequence.id,
|
|
150
|
+
name: sequence.name,
|
|
151
|
+
trackCount: timeline.tracks.length,
|
|
152
|
+
clipCount: timeline.tracks.reduce((count, track) => count + track.clips.length, 0),
|
|
153
|
+
duration: timeline.duration
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function createNonlinearAnimationEditor(state) {
|
|
158
|
+
return new NonlinearAnimationEditor(state);
|
|
159
|
+
}
|
|
160
|
+
function sanitizeBinAsset(asset) {
|
|
161
|
+
if (asset.duration !== undefined && (!Number.isFinite(asset.duration) || asset.duration <= 0)) {
|
|
162
|
+
throw new Error(`Nonlinear bin asset "${asset.id}" duration must be positive when provided.`);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
id: nonEmpty(asset.id, "Bin asset id"),
|
|
166
|
+
name: nonEmpty(asset.name, "Bin asset name"),
|
|
167
|
+
kind: asset.kind,
|
|
168
|
+
assetId: asset.assetId,
|
|
169
|
+
clipName: asset.clipName,
|
|
170
|
+
duration: asset.duration,
|
|
171
|
+
metadata: asset.metadata
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function nonEmpty(value, label) {
|
|
175
|
+
const trimmed = value.trim();
|
|
176
|
+
if (!trimmed)
|
|
177
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
178
|
+
return trimmed;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=NonlinearAnimationEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NonlinearAnimationEditor.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/NonlinearAnimationEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory";
|
|
2
|
+
import { InspectorModel, type InspectorEditableValue, type InspectorProperty } from "./InspectorModel";
|
|
3
|
+
export interface PropertyPanelField extends InspectorProperty {
|
|
4
|
+
readonly label: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PropertyPanelOptions {
|
|
7
|
+
readonly history?: CommandHistory;
|
|
8
|
+
readonly inspector?: InspectorModel;
|
|
9
|
+
readonly onEdit?: (path: readonly string[], value: InspectorEditableValue) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class PropertyPanel {
|
|
12
|
+
readonly history: CommandHistory;
|
|
13
|
+
readonly inspector: InspectorModel;
|
|
14
|
+
private disposers;
|
|
15
|
+
constructor(options?: PropertyPanelOptions);
|
|
16
|
+
describe(target: object): readonly PropertyPanelField[];
|
|
17
|
+
edit(target: object, path: readonly string[], value: InspectorEditableValue): Promise<void>;
|
|
18
|
+
render(target: object | undefined, container: HTMLElement, options?: Pick<PropertyPanelOptions, "onEdit">): readonly PropertyPanelField[];
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=PropertyPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPanel.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PropertyPanel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,KAAK,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEvG,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACpF;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,OAAO,CAAC,SAAS,CAAsB;gBAE3B,OAAO,GAAE,oBAAyB;IAK9C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE;IAOjD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAM,GAAG,SAAS,kBAAkB,EAAE;IAsC7I,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory.js";
|
|
2
|
+
import { InspectorModel } from "./InspectorModel.js";
|
|
3
|
+
export class PropertyPanel {
|
|
4
|
+
history;
|
|
5
|
+
inspector;
|
|
6
|
+
disposers = [];
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.history = options.history ?? new CommandHistory();
|
|
9
|
+
this.inspector = options.inspector ?? new InspectorModel();
|
|
10
|
+
}
|
|
11
|
+
describe(target) {
|
|
12
|
+
return this.inspector.describe(target).map((property) => ({
|
|
13
|
+
...property,
|
|
14
|
+
label: property.path.join(".")
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
async edit(target, path, value) {
|
|
18
|
+
await this.history.execute(this.inspector.createSetPropertyCommand(target, path, value));
|
|
19
|
+
}
|
|
20
|
+
render(target, container, options = {}) {
|
|
21
|
+
this.dispose();
|
|
22
|
+
container.replaceChildren();
|
|
23
|
+
if (!target)
|
|
24
|
+
return [];
|
|
25
|
+
const fields = this.describe(target);
|
|
26
|
+
const documentRef = container.ownerDocument;
|
|
27
|
+
for (const field of fields) {
|
|
28
|
+
const row = documentRef.createElement("label");
|
|
29
|
+
row.className = "aura-property-panel__row";
|
|
30
|
+
const name = documentRef.createElement("span");
|
|
31
|
+
name.className = "aura-property-panel__label";
|
|
32
|
+
name.textContent = field.label;
|
|
33
|
+
row.append(name);
|
|
34
|
+
if (field.editable) {
|
|
35
|
+
const input = documentRef.createElement("input");
|
|
36
|
+
input.className = "aura-property-panel__input";
|
|
37
|
+
input.name = field.label;
|
|
38
|
+
input.value = String(field.value);
|
|
39
|
+
input.type = field.type === "number" ? "number" : field.type === "boolean" ? "checkbox" : "text";
|
|
40
|
+
if (field.type === "boolean")
|
|
41
|
+
input.checked = Boolean(field.value);
|
|
42
|
+
const change = () => {
|
|
43
|
+
const value = parseInput(input, field.type);
|
|
44
|
+
void this.edit(target, field.path, value).then(() => options.onEdit?.(field.path, value));
|
|
45
|
+
};
|
|
46
|
+
input.addEventListener("change", change);
|
|
47
|
+
this.disposers.push(() => input.removeEventListener("change", change));
|
|
48
|
+
row.append(input);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const value = documentRef.createElement("span");
|
|
52
|
+
value.className = "aura-property-panel__value";
|
|
53
|
+
value.textContent = field.type;
|
|
54
|
+
row.append(value);
|
|
55
|
+
}
|
|
56
|
+
container.append(row);
|
|
57
|
+
}
|
|
58
|
+
return fields;
|
|
59
|
+
}
|
|
60
|
+
dispose() {
|
|
61
|
+
for (const dispose of this.disposers.splice(0))
|
|
62
|
+
dispose();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function parseInput(input, type) {
|
|
66
|
+
if (type === "number")
|
|
67
|
+
return Number(input.value);
|
|
68
|
+
if (type === "boolean")
|
|
69
|
+
return input.checked;
|
|
70
|
+
return input.value;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=PropertyPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPanel.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PropertyPanel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type RenderQueuePanelItemStatus = "queued" | "running" | "done" | "failed";
|
|
2
|
+
export interface RenderQueuePanelItem {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly status: RenderQueuePanelItemStatus;
|
|
6
|
+
readonly progress: number;
|
|
7
|
+
readonly currentFrame?: number;
|
|
8
|
+
readonly totalFrames?: number;
|
|
9
|
+
readonly outputPath?: string;
|
|
10
|
+
readonly error?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RenderQueuePanelSnapshot {
|
|
13
|
+
readonly kind: "render-queue-panel";
|
|
14
|
+
readonly itemCount: number;
|
|
15
|
+
readonly queuedCount: number;
|
|
16
|
+
readonly runningCount: number;
|
|
17
|
+
readonly doneCount: number;
|
|
18
|
+
readonly failedCount: number;
|
|
19
|
+
readonly progress: number;
|
|
20
|
+
readonly items: readonly RenderQueuePanelItem[];
|
|
21
|
+
readonly outputPaths: readonly string[];
|
|
22
|
+
readonly errors: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare class RenderQueuePanel {
|
|
25
|
+
private readonly items;
|
|
26
|
+
constructor(items?: readonly RenderQueuePanelItem[]);
|
|
27
|
+
upsert(item: RenderQueuePanelItem): RenderQueuePanelSnapshot;
|
|
28
|
+
updateProgress(id: string, progress: number, options?: {
|
|
29
|
+
readonly currentFrame?: number;
|
|
30
|
+
readonly totalFrames?: number;
|
|
31
|
+
readonly status?: RenderQueuePanelItemStatus;
|
|
32
|
+
readonly outputPath?: string;
|
|
33
|
+
readonly error?: string;
|
|
34
|
+
}): RenderQueuePanelSnapshot;
|
|
35
|
+
snapshot(): RenderQueuePanelSnapshot;
|
|
36
|
+
}
|
|
37
|
+
export declare function createRenderQueuePanel(items?: readonly RenderQueuePanelItem[]): RenderQueuePanel;
|
|
38
|
+
//# sourceMappingURL=RenderQueuePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderQueuePanel.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/RenderQueuePanel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;gBAErD,KAAK,GAAE,SAAS,oBAAoB,EAAO;IAIvD,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,wBAAwB;IAK5D,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,0BAA0B,CAAC;QAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,wBAAwB;IAcjC,QAAQ,IAAI,wBAAwB;CAgBrC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,SAAS,oBAAoB,EAAO,GAAG,gBAAgB,CAEpG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class RenderQueuePanel {
|
|
2
|
+
items = new Map();
|
|
3
|
+
constructor(items = []) {
|
|
4
|
+
for (const item of items)
|
|
5
|
+
this.upsert(item);
|
|
6
|
+
}
|
|
7
|
+
upsert(item) {
|
|
8
|
+
this.items.set(item.id, sanitizeRenderQueueItem(item));
|
|
9
|
+
return this.snapshot();
|
|
10
|
+
}
|
|
11
|
+
updateProgress(id, progress, options = {}) {
|
|
12
|
+
const existing = this.items.get(id);
|
|
13
|
+
if (!existing)
|
|
14
|
+
throw new Error(`Render queue item does not exist: ${id}`);
|
|
15
|
+
return this.upsert({
|
|
16
|
+
...existing,
|
|
17
|
+
progress,
|
|
18
|
+
status: options.status ?? existing.status,
|
|
19
|
+
currentFrame: options.currentFrame ?? existing.currentFrame,
|
|
20
|
+
totalFrames: options.totalFrames ?? existing.totalFrames,
|
|
21
|
+
outputPath: options.outputPath ?? existing.outputPath,
|
|
22
|
+
error: options.error ?? existing.error
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
snapshot() {
|
|
26
|
+
const items = [...this.items.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
27
|
+
const sum = items.reduce((total, item) => total + item.progress, 0);
|
|
28
|
+
return {
|
|
29
|
+
kind: "render-queue-panel",
|
|
30
|
+
itemCount: items.length,
|
|
31
|
+
queuedCount: items.filter((item) => item.status === "queued").length,
|
|
32
|
+
runningCount: items.filter((item) => item.status === "running").length,
|
|
33
|
+
doneCount: items.filter((item) => item.status === "done").length,
|
|
34
|
+
failedCount: items.filter((item) => item.status === "failed").length,
|
|
35
|
+
progress: items.length === 0 ? 0 : sum / items.length,
|
|
36
|
+
items,
|
|
37
|
+
outputPaths: items.flatMap((item) => item.outputPath ? [item.outputPath] : []),
|
|
38
|
+
errors: items.flatMap((item) => item.error ? [item.error] : [])
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function createRenderQueuePanel(items = []) {
|
|
43
|
+
return new RenderQueuePanel(items);
|
|
44
|
+
}
|
|
45
|
+
function sanitizeRenderQueueItem(item) {
|
|
46
|
+
const progress = Number.isFinite(item.progress) ? Math.min(1, Math.max(0, item.progress)) : Number.NaN;
|
|
47
|
+
if (!Number.isFinite(progress))
|
|
48
|
+
throw new Error("Render queue item progress must be finite.");
|
|
49
|
+
if (item.currentFrame !== undefined && (!Number.isFinite(item.currentFrame) || item.currentFrame < 0)) {
|
|
50
|
+
throw new Error("Render queue currentFrame must be a non-negative finite number.");
|
|
51
|
+
}
|
|
52
|
+
if (item.totalFrames !== undefined && (!Number.isFinite(item.totalFrames) || item.totalFrames <= 0)) {
|
|
53
|
+
throw new Error("Render queue totalFrames must be a positive finite number.");
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
id: nonEmpty(item.id, "Render queue item id"),
|
|
57
|
+
label: nonEmpty(item.label, "Render queue item label"),
|
|
58
|
+
status: item.status,
|
|
59
|
+
progress,
|
|
60
|
+
currentFrame: item.currentFrame,
|
|
61
|
+
totalFrames: item.totalFrames,
|
|
62
|
+
outputPath: item.outputPath,
|
|
63
|
+
error: item.error
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function nonEmpty(value, label) {
|
|
67
|
+
const trimmed = value.trim();
|
|
68
|
+
if (!trimmed)
|
|
69
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
70
|
+
return trimmed;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=RenderQueuePanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderQueuePanel.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/RenderQueuePanel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type HierarchyNodeDescriptor } from "./HierarchyModel";
|
|
2
|
+
import type { SelectionId } from "./Selection";
|
|
3
|
+
import type { AnimationSceneNode } from "./AnimationSceneEditor";
|
|
4
|
+
export interface SceneOutlinerItem extends HierarchyNodeDescriptor {
|
|
5
|
+
readonly icon: string;
|
|
6
|
+
readonly kind: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SceneOutlinerOptions {
|
|
9
|
+
readonly selectedIds?: ReadonlySet<SelectionId>;
|
|
10
|
+
readonly onSelect?: (id: SelectionId) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class SceneOutliner {
|
|
13
|
+
private readonly hierarchy;
|
|
14
|
+
private disposers;
|
|
15
|
+
describe(root: AnimationSceneNode, selectedIds?: ReadonlySet<SelectionId>): readonly SceneOutlinerItem[];
|
|
16
|
+
render(root: AnimationSceneNode, container: HTMLElement, options?: SceneOutlinerOptions): readonly SceneOutlinerItem[];
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SceneOutliner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneOutliner.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/SceneOutliner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,SAAS,CAAsB;IAEvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,EAAE,WAAW,GAAE,WAAW,CAAC,WAAW,CAAa,GAAG,SAAS,iBAAiB,EAAE;IAYnH,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,oBAAyB,GAAG,SAAS,iBAAiB,EAAE;IAsB1H,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { HierarchyModel } from "./HierarchyModel.js";
|
|
2
|
+
export class SceneOutliner {
|
|
3
|
+
hierarchy = new HierarchyModel();
|
|
4
|
+
disposers = [];
|
|
5
|
+
describe(root, selectedIds = new Set()) {
|
|
6
|
+
return this.hierarchy.flatten(root, selectedIds).map((item) => {
|
|
7
|
+
const node = findNode(root, String(item.id));
|
|
8
|
+
const kind = node?.kind ?? "unknown";
|
|
9
|
+
return {
|
|
10
|
+
...item,
|
|
11
|
+
kind,
|
|
12
|
+
icon: iconForKind(kind)
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
render(root, container, options = {}) {
|
|
17
|
+
this.dispose();
|
|
18
|
+
const items = this.describe(root, options.selectedIds);
|
|
19
|
+
container.replaceChildren();
|
|
20
|
+
const documentRef = container.ownerDocument;
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
const row = documentRef.createElement("button");
|
|
23
|
+
row.type = "button";
|
|
24
|
+
row.className = "aura-scene-outliner__item";
|
|
25
|
+
row.dataset.nodeId = String(item.id);
|
|
26
|
+
row.dataset.kind = item.kind;
|
|
27
|
+
row.dataset.selected = String(item.selected);
|
|
28
|
+
row.style.paddingLeft = `${item.depth * 14}px`;
|
|
29
|
+
row.textContent = `${item.icon} ${item.name}`;
|
|
30
|
+
const click = () => options.onSelect?.(item.id);
|
|
31
|
+
row.addEventListener("click", click);
|
|
32
|
+
this.disposers.push(() => row.removeEventListener("click", click));
|
|
33
|
+
container.append(row);
|
|
34
|
+
}
|
|
35
|
+
return items;
|
|
36
|
+
}
|
|
37
|
+
dispose() {
|
|
38
|
+
for (const dispose of this.disposers.splice(0))
|
|
39
|
+
dispose();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function iconForKind(kind) {
|
|
43
|
+
switch (kind) {
|
|
44
|
+
case "character": return "[CHAR]";
|
|
45
|
+
case "set": return "[SET]";
|
|
46
|
+
case "prop": return "[PROP]";
|
|
47
|
+
case "camera": return "[CAM]";
|
|
48
|
+
case "light": return "[LIGHT]";
|
|
49
|
+
case "audio": return "[AUD]";
|
|
50
|
+
case "material": return "[MAT]";
|
|
51
|
+
default: return "[NODE]";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function findNode(root, id) {
|
|
55
|
+
if (root.id === id)
|
|
56
|
+
return root;
|
|
57
|
+
for (const child of root.children) {
|
|
58
|
+
const found = findNode(child, id);
|
|
59
|
+
if (found)
|
|
60
|
+
return found;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=SceneOutliner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneOutliner.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/SceneOutliner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory";
|
|
2
|
+
import { Selection, type SelectionId } from "./Selection";
|
|
3
|
+
import { TimelineClip, TimelineModel, TimelineTrack, type TimelineClipConfig, type TimelineModelConfig, type TimelineTrackConfig } from "./TimelineModel";
|
|
4
|
+
import { type TimelineEditorTrackKind } from "./TimelineTrackTypes";
|
|
5
|
+
export interface TimelineEditorControllerOptions {
|
|
6
|
+
readonly timeline?: TimelineModel;
|
|
7
|
+
readonly history?: CommandHistory;
|
|
8
|
+
readonly selection?: Selection;
|
|
9
|
+
readonly zoomPixelsPerSecond?: number;
|
|
10
|
+
readonly snapEnabled?: boolean;
|
|
11
|
+
readonly snapInterval?: number;
|
|
12
|
+
readonly onPreviewTime?: (time: number, snapshot: TimelineEditorSnapshot) => void;
|
|
13
|
+
readonly routeBinding?: TimelineRoutePlaybackBinding;
|
|
14
|
+
}
|
|
15
|
+
export interface TimelineRoutePlaybackBinding {
|
|
16
|
+
play?(): void;
|
|
17
|
+
pause?(): void;
|
|
18
|
+
scrub(time: number, snapshot: TimelineEditorSnapshot): void;
|
|
19
|
+
jumpToShot?(shotId: string, time: number, snapshot: TimelineEditorSnapshot): void;
|
|
20
|
+
}
|
|
21
|
+
export interface TimelineEditorClipboard {
|
|
22
|
+
readonly clips: readonly TimelineClipConfig[];
|
|
23
|
+
}
|
|
24
|
+
export interface TimelineEditorSnapshot {
|
|
25
|
+
readonly timeline: ReturnType<TimelineModel["snapshot"]>;
|
|
26
|
+
readonly zoomPixelsPerSecond: number;
|
|
27
|
+
readonly scrollX: number;
|
|
28
|
+
readonly scrollY: number;
|
|
29
|
+
readonly snapEnabled: boolean;
|
|
30
|
+
readonly snapInterval: number;
|
|
31
|
+
readonly selectedIds: readonly SelectionId[];
|
|
32
|
+
readonly clipboardClipCount: number;
|
|
33
|
+
readonly canUndo: boolean;
|
|
34
|
+
readonly canRedo: boolean;
|
|
35
|
+
readonly tracks: readonly {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly kind: TimelineEditorTrackKind;
|
|
39
|
+
readonly laneHeight: number;
|
|
40
|
+
readonly color: string;
|
|
41
|
+
readonly clipIds: readonly string[];
|
|
42
|
+
}[];
|
|
43
|
+
readonly evidence: {
|
|
44
|
+
readonly clipEditing: boolean;
|
|
45
|
+
readonly keyframeReadyTracks: boolean;
|
|
46
|
+
readonly timelineScrubbing: true;
|
|
47
|
+
readonly undoRedo: boolean;
|
|
48
|
+
readonly serialization: true;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export declare class TimelineEditorController {
|
|
52
|
+
readonly timeline: TimelineModel;
|
|
53
|
+
readonly history: CommandHistory;
|
|
54
|
+
readonly selection: Selection;
|
|
55
|
+
private zoomPixelsPerSecondInternal;
|
|
56
|
+
private scrollXInternal;
|
|
57
|
+
private scrollYInternal;
|
|
58
|
+
private snapEnabledInternal;
|
|
59
|
+
private snapIntervalInternal;
|
|
60
|
+
private clipboardInternal;
|
|
61
|
+
private readonly preview?;
|
|
62
|
+
private routeBinding?;
|
|
63
|
+
constructor(options?: TimelineEditorControllerOptions);
|
|
64
|
+
get zoomPixelsPerSecond(): number;
|
|
65
|
+
get snapEnabled(): boolean;
|
|
66
|
+
get snapInterval(): number;
|
|
67
|
+
get scrollX(): number;
|
|
68
|
+
get scrollY(): number;
|
|
69
|
+
addTrack(kind: TimelineEditorTrackKind, name?: string, options?: Omit<TimelineTrackConfig, "name" | "type">): Promise<TimelineTrack>;
|
|
70
|
+
addClip(trackId: string, config: TimelineClipConfig): Promise<TimelineClip>;
|
|
71
|
+
deleteClip(clipId: string): Promise<void>;
|
|
72
|
+
moveClip(clipId: string, startTime: number): Promise<TimelineClip>;
|
|
73
|
+
resizeClip(clipId: string, duration: number, startTime?: number): Promise<TimelineClip>;
|
|
74
|
+
splitClip(clipId: string, splitTime: number): Promise<readonly TimelineClip[]>;
|
|
75
|
+
duplicateClip(clipId: string, timeOffset?: number): Promise<TimelineClip>;
|
|
76
|
+
copySelection(): TimelineEditorClipboard;
|
|
77
|
+
pasteClips(trackId: string, startTime: number): Promise<readonly TimelineClip[]>;
|
|
78
|
+
select(ids: readonly SelectionId[]): void;
|
|
79
|
+
selectClip(clipId: string, additive?: boolean): void;
|
|
80
|
+
clearSelection(): void;
|
|
81
|
+
setZoom(pixelsPerSecond: number): void;
|
|
82
|
+
zoomBy(multiplier: number): number;
|
|
83
|
+
scrollTo(x: number, y?: number): void;
|
|
84
|
+
configureSnap(options: {
|
|
85
|
+
readonly enabled?: boolean;
|
|
86
|
+
readonly interval?: number;
|
|
87
|
+
}): void;
|
|
88
|
+
scrubTo(time: number): void;
|
|
89
|
+
stepFrames(frames: number): void;
|
|
90
|
+
togglePlayback(): void;
|
|
91
|
+
bindRoutePlayback(binding: TimelineRoutePlaybackBinding | undefined): void;
|
|
92
|
+
jumpToShot(shotId: string): number;
|
|
93
|
+
handleKeyboardShortcut(key: string): boolean;
|
|
94
|
+
undo(): Promise<void>;
|
|
95
|
+
redo(): Promise<void>;
|
|
96
|
+
serializeTimeline(): TimelineModelConfig;
|
|
97
|
+
snapshot(): TimelineEditorSnapshot;
|
|
98
|
+
private snapTime;
|
|
99
|
+
private requireTrack;
|
|
100
|
+
private requireClip;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=TimelineEditorController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimelineEditorController.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/TimelineEditorController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC1J,OAAO,EAAuF,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEzJ,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,4BAA4B,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,IAAI,IAAI,CAAC;IACd,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC5D,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACnF;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,WAAW,EAAE,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS;QACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;QACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;KACrC,EAAE,CAAC;IACJ,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACtC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,wBAAwB;IACnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,iBAAiB,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA2D;IACpF,OAAO,CAAC,YAAY,CAAC,CAA+B;gBAExC,OAAO,GAAE,+BAAoC;IAWzD,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEK,QAAQ,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAO3E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMlE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMvF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAmB9E,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAc/E,aAAa,IAAI,uBAAuB;IAOlC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IActF,MAAM,CAAC,GAAG,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAIzC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,IAAI;IAMlD,cAAc,IAAI,IAAI;IAItB,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAItC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAKlC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,SAAuB,GAAG,IAAI;IAKnD,aAAa,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKxF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO3B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOhC,cAAc,IAAI,IAAI;IAUtB,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,SAAS,GAAG,IAAI;IAI1E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAclC,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAwBtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,iBAAiB,IAAI,mBAAmB;IAIxC,QAAQ,IAAI,sBAAsB;IAqClC,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;CAOpB"}
|