@kite3d/engine 0.15.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.
Files changed (74) hide show
  1. package/dist/authoring.d.ts +54 -0
  2. package/dist/authoring.js +165 -0
  3. package/dist/authoring.js.map +1 -0
  4. package/dist/authoringValidation.d.ts +110 -0
  5. package/dist/authoringValidation.js +488 -0
  6. package/dist/authoringValidation.js.map +1 -0
  7. package/dist/defaults.d.ts +2 -0
  8. package/dist/fileTypes.d.ts +5 -0
  9. package/dist/fileTypes.js +51 -0
  10. package/dist/fileTypes.js.map +1 -0
  11. package/dist/importMap.d.ts +15 -0
  12. package/dist/importMap.js +62 -0
  13. package/dist/importMap.js.map +1 -0
  14. package/dist/index.d.ts +15 -0
  15. package/dist/index.js +2756 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/migrations.js +5 -0
  18. package/dist/migrations.js.map +1 -0
  19. package/dist/paths.d.ts +9 -0
  20. package/dist/paths.js +13 -0
  21. package/dist/paths.js.map +1 -0
  22. package/dist/plugins/GeneratorComponent.d.ts +40 -0
  23. package/dist/plugins/HtmlUiComponent.d.ts +52 -0
  24. package/dist/plugins/HtmlUiComponent.example.d.ts +0 -0
  25. package/dist/plugins/cannon/Cannon3DBodyComponent.d.ts +27 -0
  26. package/dist/plugins/cannon/Cannon3DShapeComponent.d.ts +57 -0
  27. package/dist/plugins/cannon/CannonPhysicsPlugin.d.ts +63 -0
  28. package/dist/plugins/cannon/CannonRagdollComponent.d.ts +148 -0
  29. package/dist/plugins/cannon/helper.d.ts +24 -0
  30. package/dist/plugins/cannon/threeToCannon.d.ts +63 -0
  31. package/dist/plugins/cannon/utils.d.ts +9 -0
  32. package/dist/projectFormat.js +108 -0
  33. package/dist/projectFormat.js.map +1 -0
  34. package/dist/runtime/createGame.d.ts +29 -0
  35. package/dist/runtime/index.d.ts +18 -0
  36. package/dist/runtime/migrations.d.ts +5 -0
  37. package/dist/runtime/nestedAssets.d.ts +26 -0
  38. package/dist/runtime/projectFormat.d.ts +83 -0
  39. package/dist/runtime/version.d.ts +1 -0
  40. package/dist/runtime.js +72835 -0
  41. package/dist/runtime.js.map +1 -0
  42. package/dist/sceneSerialization.d.ts +17 -0
  43. package/dist/sceneSerialization.js +174 -0
  44. package/dist/sceneSerialization.js.map +1 -0
  45. package/dist/scripts.d.ts +17 -0
  46. package/dist/version.js +7 -0
  47. package/dist/version.js.map +1 -0
  48. package/package.json +86 -0
  49. package/src/authoring.ts +293 -0
  50. package/src/authoringValidation.ts +815 -0
  51. package/src/defaults.ts +277 -0
  52. package/src/fileTypes.ts +53 -0
  53. package/src/importMap.ts +105 -0
  54. package/src/index.ts +15 -0
  55. package/src/paths.ts +9 -0
  56. package/src/plugins/GeneratorComponent.ts +275 -0
  57. package/src/plugins/HtmlUiComponent.example.ts +202 -0
  58. package/src/plugins/HtmlUiComponent.md +219 -0
  59. package/src/plugins/HtmlUiComponent.ts +320 -0
  60. package/src/plugins/cannon/Cannon3DBodyComponent.ts +227 -0
  61. package/src/plugins/cannon/Cannon3DShapeComponent.ts +258 -0
  62. package/src/plugins/cannon/CannonPhysicsPlugin.ts +409 -0
  63. package/src/plugins/cannon/CannonRagdollComponent.ts +1170 -0
  64. package/src/plugins/cannon/helper.ts +255 -0
  65. package/src/plugins/cannon/threeToCannon.ts +441 -0
  66. package/src/plugins/cannon/utils.ts +185 -0
  67. package/src/runtime/createGame.ts +337 -0
  68. package/src/runtime/index.ts +19 -0
  69. package/src/runtime/migrations.ts +6 -0
  70. package/src/runtime/nestedAssets.ts +226 -0
  71. package/src/runtime/projectFormat.ts +233 -0
  72. package/src/runtime/version.ts +3 -0
  73. package/src/sceneSerialization.ts +289 -0
  74. package/src/scripts.ts +52 -0
@@ -0,0 +1,488 @@
1
+ import { Box3 as ee, Vector3 as z, Frustum as ue, Matrix4 as ce, EntityComponentPlugin as fe } from "threepipe";
2
+ import { getAuthoringMetadata as P, getTrackedRuntimeObjects as de, getRuntimeObjectMetadata as j, KITE3D_AUTHORING_METADATA_KEY as J } from "./authoring.js";
3
+ const N = 1e-6;
4
+ function Ce(e) {
5
+ const t = e.scene;
6
+ if (!(t != null && t.modelRoot)) throw new Error("Authoring validation requires viewer.scene.modelRoot");
7
+ t.updateMatrixWorld(!0);
8
+ const r = [], n = te(t.modelRoot), o = [], i = [], a = /* @__PURE__ */ new Set(), s = [];
9
+ let u = 0, l = 0, m = 0, R = 0;
10
+ t.modelRoot.traverse((c) => {
11
+ if (c === t.modelRoot) return;
12
+ u += 1;
13
+ const f = P(c);
14
+ if ((f == null ? void 0 : f.role) === "generator" && !f.sourceId && o.push({ object: c, metadata: f }), (f == null ? void 0 : f.role) === "generator" && f.sourceId && i.push({ object: c, metadata: f }), !F(c) || (l += 1, !he(c, t.modelRoot))) return;
15
+ m += 1, ye(c) && (R += 1);
16
+ const x = new ee().setFromObject(c);
17
+ !x.isEmpty() && W(x.min) && W(x.max) && (s.push({ object: c, bounds: x }), (f == null ? void 0 : f.role) === "generator" && f.sourceId && a.add(f.sourceId));
18
+ });
19
+ for (const c of i) {
20
+ const f = n.get(c.metadata.sourceId || "");
21
+ (!f || f.metadata.role !== "generator") && G(r, {
22
+ code: "MISSING_AUTHORING_SOURCE",
23
+ severity: "error",
24
+ message: `Generator output source "${c.metadata.sourceId || "(missing)"}" is not present beneath modelRoot.`,
25
+ object: _(c.object)
26
+ });
27
+ }
28
+ for (const c of o)
29
+ a.has(c.metadata.id) || G(r, {
30
+ code: "GENERATOR_PREVIEW_MISSING",
31
+ severity: "error",
32
+ message: "An authored generator needs a bounded stopped-mode preview.",
33
+ object: _(c.object)
34
+ });
35
+ r.push(...re(t, n));
36
+ const S = u === 0 && o.length === 0;
37
+ (m === 0 || R === 0) && r.push({
38
+ code: "NO_VISIBLE_AUTHORED_CONTENT",
39
+ severity: S ? "warning" : "error",
40
+ message: S ? "The scene is empty; add authored content when you are ready." : m === 0 ? "No visible renderable authored content exists beneath modelRoot." : "Visible authored renderables are not selectable."
41
+ });
42
+ const E = t.defaultCamera || t.mainCamera, w = t.defaultCamera ? "scene.defaultCamera" : "scene.mainCamera", y = S ? { useful: !1, framed: 0, inside: 0 } : le(E, w, s, r), A = r.filter(({ severity: c }) => c === "error"), C = !A.some(({ code: c }) => c === "MISSING_AUTHORING_SOURCE" || c === "RUNTIME_SOURCE_DRIFT"), I = !A.some(({ code: c }) => c === "GENERATOR_PREVIEW_MISSING"), k = A.length === 0;
43
+ return {
44
+ ok: k,
45
+ status: k ? "pass" : "fail",
46
+ summary: k ? "Stopped-mode authored representation passed." : `${A.length} authoring check(s) failed.`,
47
+ issues: r,
48
+ checks: {
49
+ visibleAuthoredContent: m > 0,
50
+ selectableAuthoredContent: R > 0,
51
+ relationshipsValid: C,
52
+ generatorPreviews: I,
53
+ cameraUseful: y.useful
54
+ },
55
+ metrics: {
56
+ authoredObjectCount: u,
57
+ renderableCount: l,
58
+ visibleRenderableCount: m,
59
+ selectableCount: R,
60
+ generatorCount: o.length,
61
+ generatorPreviewCount: a.size,
62
+ cameraFramedRenderableCount: y.framed,
63
+ cameraInsideRenderableCount: y.inside
64
+ }
65
+ };
66
+ }
67
+ function Ie(e) {
68
+ const t = e.scene;
69
+ if (!(t != null && t.modelRoot)) throw new Error("Runtime cleanup validation requires viewer.scene.modelRoot");
70
+ t.updateMatrixWorld(!0);
71
+ const r = re(t, te(t.modelRoot)), n = de(t), o = /* @__PURE__ */ new Set();
72
+ let i = 0;
73
+ for (const s of n)
74
+ X(s, o) || o.add(s);
75
+ t.traverse((s) => {
76
+ if (s === t || s === t.modelRoot || ge(s, t.modelRoot) || be(s, t)) return;
77
+ F(s) && (i += 1);
78
+ const u = Re(s);
79
+ u ? X(u, o) || o.add(u) : F(s) && o.add(s);
80
+ });
81
+ for (const s of o)
82
+ G(r, {
83
+ code: "RUNTIME_OBJECT_AFTER_STOP",
84
+ severity: "error",
85
+ message: j(s) ? "A tracked runtime object remains after Stop." : "An unmarked renderable remains outside modelRoot after Stop.",
86
+ object: _(s)
87
+ });
88
+ const a = !r.some(({ severity: s }) => s === "error");
89
+ return {
90
+ ok: a,
91
+ status: a ? "pass" : "fail",
92
+ summary: a ? "Runtime cleanup passed." : `${r.filter(({ severity: s }) => s === "error").length} runtime cleanup check(s) failed.`,
93
+ issues: r,
94
+ trackedObjectCount: n.length,
95
+ outsideRenderableCount: i
96
+ };
97
+ }
98
+ function H(e) {
99
+ const t = "scene" in e ? e.scene : e;
100
+ if (!(t != null && t.modelRoot)) throw new Error("A semantic snapshot requires scene.modelRoot");
101
+ return {
102
+ schemaVersion: 1,
103
+ scene: t.modelRoot.children.filter((r) => {
104
+ var n;
105
+ return ((n = r.userData) == null ? void 0 : n.excludeFromExport) !== !0;
106
+ }).map((r) => ne(r))
107
+ };
108
+ }
109
+ function Oe(e, t) {
110
+ const r = p(v(e)), n = p(v(t)), o = JSON.stringify(r), i = JSON.stringify(n), a = [];
111
+ B(r, n, "", a);
112
+ const s = a.map((l) => ({
113
+ code: "PERSISTENCE_DRIFT",
114
+ severity: "error",
115
+ message: `Saved authoring semantics changed at ${l.path || "/"}.`,
116
+ ...l
117
+ })), u = a.length === 0;
118
+ return {
119
+ ok: u,
120
+ status: u ? "pass" : "fail",
121
+ summary: u ? "Save/Reload semantic equivalence passed." : `${a.length} persisted semantic difference(s) found.`,
122
+ issues: s,
123
+ changes: a,
124
+ beforeBytes: o.length,
125
+ afterBytes: i.length
126
+ };
127
+ }
128
+ let b;
129
+ function xe(e) {
130
+ if (!b) throw new Error("registerGameValidation must be called while createGame is active");
131
+ return b.registerGameValidation(e);
132
+ }
133
+ function Ne(e) {
134
+ if (!b) throw new Error("publishGameTelemetry must be called while createGame is active");
135
+ return b.publishGameTelemetry(e);
136
+ }
137
+ function Te() {
138
+ const e = /* @__PURE__ */ new Set();
139
+ let t, r = !1;
140
+ const n = Object.freeze({
141
+ get telemetry() {
142
+ return t;
143
+ },
144
+ validate: () => o.runGameValidation()
145
+ }), o = {
146
+ registerGameValidation(i) {
147
+ if (r || typeof i != "function") throw new Error("Game validation must be a function on an active game");
148
+ return e.add(i), () => e.delete(i);
149
+ },
150
+ publishGameTelemetry(i) {
151
+ if (r || !i || typeof i != "object" || Array.isArray(i))
152
+ throw new Error("Game telemetry must be an object on an active game");
153
+ const a = pe(i);
154
+ return t = a, () => {
155
+ t === a && (t = void 0);
156
+ };
157
+ },
158
+ async runGameValidation() {
159
+ const i = [];
160
+ for (const s of e)
161
+ try {
162
+ const u = await s();
163
+ u === void 0 || u === !0 ? i.push({ status: "pass", summary: "Project validation passed." }) : u === !1 ? i.push({ status: "fail", summary: "Project validation failed." }) : u && ["pass", "fail"].includes(u.status) && typeof u.summary == "string" ? i.push(u) : i.push({ status: "fail", summary: "Project validation returned an invalid result." });
164
+ } catch (u) {
165
+ i.push({ status: "fail", summary: `Project validation threw: ${Ae(u)}` });
166
+ }
167
+ const a = i.filter(({ status: s }) => s === "fail");
168
+ return {
169
+ ok: a.length === 0,
170
+ status: a.length ? "fail" : "pass",
171
+ summary: a.length ? a.map(({ summary: s }) => s).join(" ") : "Project validations passed.",
172
+ results: i
173
+ };
174
+ },
175
+ dispose() {
176
+ r = !0, e.clear(), t = void 0, b === o && (b = void 0), typeof window < "u" && window.kite3dGame === n && delete window.kite3dGame;
177
+ }
178
+ };
179
+ return b == null || b.dispose(), b = o, typeof window < "u" && (window.kite3dGame = n), o;
180
+ }
181
+ function te(e) {
182
+ const t = /* @__PURE__ */ new Map();
183
+ return e.traverse((r) => {
184
+ if (r === e) return;
185
+ const n = P(r);
186
+ n && !n.sourceId ? t.set(n.id, { object: r, metadata: n }) : n || t.set(r.uuid, { object: r, metadata: { role: "direct", id: r.uuid } });
187
+ }), t;
188
+ }
189
+ function re(e, t) {
190
+ const r = [];
191
+ return e.traverse((n) => {
192
+ const o = P(n);
193
+ if (!(o != null && o.sourceId)) return;
194
+ const i = t.get(o.sourceId);
195
+ if (!i) {
196
+ G(r, {
197
+ code: "MISSING_AUTHORING_SOURCE",
198
+ severity: "error",
199
+ message: `Authored source "${o.sourceId}" is not present beneath modelRoot.`,
200
+ object: _(n)
201
+ });
202
+ return;
203
+ }
204
+ const a = j(n);
205
+ if (!a || a.kind === "effect" || i.metadata.role === "generator") return;
206
+ const s = new Set(a.overrides || []);
207
+ JSON.stringify(U(i.object, s)) !== JSON.stringify(U(n, s)) && G(r, {
208
+ code: "RUNTIME_SOURCE_DRIFT",
209
+ severity: "error",
210
+ message: "A runtime copy differs from its authored source in a non-mutable field.",
211
+ object: _(n)
212
+ });
213
+ }), r;
214
+ }
215
+ function le(e, t, r, n) {
216
+ var S, E, w, y, A;
217
+ let o = 0, i = 0, a = !1;
218
+ const s = `${t}${e != null && e.name ? ` "${e.name}"` : ""}`;
219
+ let u = `${s} must be finite and face visible authored content.`;
220
+ const l = e == null ? void 0 : e.projectionMatrix, m = e == null ? void 0 : e.matrixWorldInverse;
221
+ if (e && W(e.position) && l && m && r.length) {
222
+ e.updateMatrixWorld(!0), (S = e.updateProjectionMatrix) == null || S.call(e);
223
+ const C = e.getWorldPosition(new z()), I = new ee().makeEmpty();
224
+ for (const { bounds: h } of r) I.union(h);
225
+ const k = I.getCenter(new z()), c = (E = e.getWorldDirection) == null ? void 0 : E.call(e, new z()), f = k.clone().sub(C);
226
+ a = !c || f.lengthSq() === 0 || c.dot(f.normalize()) > 0;
227
+ const x = new ue().setFromProjectionMatrix(new ce().multiplyMatrices(l, m));
228
+ o = r.filter(({ bounds: h }) => x.intersectsBox(h)).length;
229
+ for (const { object: h, bounds: se } of r) {
230
+ if (we(h) || !L(se, C)) continue;
231
+ const V = h, g = V.geometry, ie = V.isInstancedMesh || V.isSkinnedMesh || ((y = (w = g == null ? void 0 : g.morphAttributes) == null ? void 0 : w.position) == null ? void 0 : y.length);
232
+ if (!g || ie || h.matrixWorld.determinant() === 0) {
233
+ q(n, h);
234
+ continue;
235
+ }
236
+ (A = g.computeBoundingBox) == null || A.call(g);
237
+ const ae = h.worldToLocal(C.clone());
238
+ !g.boundingBox || !L(g.boundingBox, ae) || (V.isMesh && g.type === "BoxGeometry" ? i += 1 : q(n, h));
239
+ }
240
+ i ? u = `${s} is inside ${i} visible authored mesh(es).` : o ? a || (u = `${s} faces away from visible authored content.`) : u = `No visible authored renderable intersects ${s}'s frustum.`;
241
+ }
242
+ const R = !!(e && r.length && o > 0 && i === 0 && a);
243
+ return R || n.push({ code: "CAMERA_NOT_USEFUL", severity: "error", message: u }), { useful: R, framed: o, inside: i };
244
+ }
245
+ function L(e, t) {
246
+ return t.x > e.min.x + N && t.x < e.max.x - N && t.y > e.min.y + N && t.y < e.max.y - N && t.z > e.min.z + N && t.z < e.max.z - N;
247
+ }
248
+ function q(e, t) {
249
+ G(e, {
250
+ code: "CAMERA_CONTAINMENT_UNVERIFIED",
251
+ severity: "warning",
252
+ message: "The camera intersects local geometry bounds, but hollow or imported mesh containment is unverified.",
253
+ object: _(t)
254
+ });
255
+ }
256
+ function U(e, t, r = !0) {
257
+ var i;
258
+ const n = e, o = {
259
+ type: oe(e),
260
+ geometry: p((i = n.geometry) == null ? void 0 : i.parameters),
261
+ children: e.children.map((a) => U(a, /* @__PURE__ */ new Set(), !1))
262
+ };
263
+ return (!r || !t.has("visible")) && (o.visible = e.visible), (!r || !t.has("position")) && (o.position = T(e.position)), (!r || !t.has("rotation")) && (o.rotation = T(e.rotation)), (!r || !t.has("scale")) && (o.scale = T(e.scale)), n.material && (!r || !t.has("material")) && (o.material = Array.isArray(n.material) ? n.material.map(K) : K(n.material)), o;
264
+ }
265
+ function K(e) {
266
+ var r, n, o, i;
267
+ const t = e;
268
+ return p({
269
+ type: t == null ? void 0 : t.type,
270
+ color: (n = (r = t == null ? void 0 : t.color) == null ? void 0 : r.getHex) == null ? void 0 : n.call(r),
271
+ emissive: (i = (o = t == null ? void 0 : t.emissive) == null ? void 0 : o.getHex) == null ? void 0 : i.call(o),
272
+ opacity: t == null ? void 0 : t.opacity,
273
+ transparent: t == null ? void 0 : t.transparent,
274
+ metalness: t == null ? void 0 : t.metalness,
275
+ roughness: t == null ? void 0 : t.roughness
276
+ });
277
+ }
278
+ function ne(e) {
279
+ const t = P(e);
280
+ return p({
281
+ name: e.name,
282
+ type: oe(e),
283
+ visible: e.visible,
284
+ position: T(e.position),
285
+ rotation: T(e.rotation),
286
+ scale: T(e.scale),
287
+ components: me(e),
288
+ ...t ? { authoring: t } : {},
289
+ children: e.children.filter((r) => {
290
+ var n;
291
+ return ((n = r.userData) == null ? void 0 : n.excludeFromExport) !== !0;
292
+ }).map((r) => ne(r))
293
+ });
294
+ }
295
+ function me(e) {
296
+ var n;
297
+ const t = fe.ObjectToComponents.get(e);
298
+ if (t != null && t.length)
299
+ return t.map((o) => {
300
+ const i = o.constructor, a = (i.StateProperties || []).map((s) => typeof s == "string" ? s : s.name || s.key).filter((s) => !!s);
301
+ return p({
302
+ id: o.uuid,
303
+ type: i.ComponentType || o.constructor.name,
304
+ state: Object.fromEntries(a.map((s) => [s, O(o[s])]))
305
+ });
306
+ }).sort(D);
307
+ const r = (n = e.userData) == null ? void 0 : n.EntityComponentPlugin;
308
+ return d(r) ? Object.entries(r).map(([o, i]) => {
309
+ const a = d(i) ? i : {};
310
+ return p({ id: o, type: a.type, state: O(a.state) });
311
+ }).sort(D) : [];
312
+ }
313
+ function v(e) {
314
+ if (typeof e == "string") return v(JSON.parse(e));
315
+ if (e instanceof Uint8Array) return v(JSON.parse(new TextDecoder().decode(e)));
316
+ if (d(e) && d(e.document)) return Q(e.document);
317
+ if (d(e) && e.schemaVersion === 1 && Array.isArray(e.scene)) return e;
318
+ if (d(e) && d(e.asset)) return Q(e);
319
+ if (d(e) && "scene" in e || d(e) && "modelRoot" in e) return H(e);
320
+ throw new Error("Persistence comparison requires a semantic snapshot, viewer, scene, or serialized glTF document");
321
+ }
322
+ function Q(e) {
323
+ const t = Array.isArray(e.nodes) ? e.nodes : [], r = Array.isArray(e.scenes) ? e.scenes : [], n = typeof e.scene == "number" ? e.scene : 0, o = d(r[n]) ? r[n] : {}, i = Array.isArray(o.nodes) ? o.nodes : [], a = (s) => {
324
+ const u = typeof s == "number" && d(t[s]) ? t[s] : {}, l = d(u.extras) ? u.extras : {}, m = d(l[J]) ? l[J] : void 0, R = d(l.EntityComponentPlugin) ? l.EntityComponentPlugin : {}, S = Object.entries(R).map(([A, C]) => {
325
+ const I = d(C) ? C : {};
326
+ return p({ id: A, type: I.type, state: O(I.state) });
327
+ }).sort(D), E = $(u.translation, [0, 0, 0]), w = $(u.rotation, [0, 0, 0, 1]), y = $(u.scale, [1, 1, 1]);
328
+ return p({
329
+ name: typeof u.name == "string" ? u.name : "",
330
+ type: typeof u.mesh == "number" ? "Mesh" : typeof u.camera == "number" ? "Camera" : "Group",
331
+ visible: l.visible !== !1,
332
+ position: { x: E[0], y: E[1], z: E[2] },
333
+ quaternion: { x: w[0], y: w[1], z: w[2], w: w[3] },
334
+ scale: { x: y[0], y: y[1], z: y[2] },
335
+ components: S,
336
+ ...m ? { authoring: O(m) } : {},
337
+ children: (Array.isArray(u.children) ? u.children : []).map(a)
338
+ });
339
+ };
340
+ return { schemaVersion: 1, scene: i.map(a) };
341
+ }
342
+ function B(e, t, r, n) {
343
+ if (n.length >= 50 || Object.is(e, t) || e === t) return;
344
+ if (!e || !t || typeof e != "object" || typeof t != "object" || Array.isArray(e) !== Array.isArray(t)) {
345
+ n.push({ path: r || "/", before: e, after: t });
346
+ return;
347
+ }
348
+ if (Array.isArray(e) && Array.isArray(t)) {
349
+ const s = Math.max(e.length, t.length);
350
+ for (let u = 0; u < s; u += 1) {
351
+ const l = Y(e[u]) || Y(t[u]);
352
+ B(e[u], t[u], `${r}/${Z(l || String(u))}`, n);
353
+ }
354
+ return;
355
+ }
356
+ const o = e, i = t, a = [.../* @__PURE__ */ new Set([...Object.keys(o), ...Object.keys(i)])].sort();
357
+ for (const s of a) B(o[s], i[s], `${r}/${Z(s)}`, n);
358
+ }
359
+ function Y(e) {
360
+ if (!(!d(e) || typeof e.name != "string"))
361
+ return e.name || void 0;
362
+ }
363
+ function O(e, t = /* @__PURE__ */ new WeakSet(), r = 0) {
364
+ var i;
365
+ if (typeof e == "number") return M(e);
366
+ if (e === null || typeof e == "string" || typeof e == "boolean") return e;
367
+ if (e === void 0 || typeof e == "function") return;
368
+ if (Array.isArray(e)) return e.map((a) => O(a, t, r + 1));
369
+ if (typeof e != "object" || r > 5) return String(e);
370
+ if (t.has(e)) return "[Circular]";
371
+ t.add(e);
372
+ const n = e;
373
+ if (n.isColor && n.getHexString) return `#${n.getHexString()}`;
374
+ if (n.toArray && /Vector|Euler|Quaternion/.test(((i = e.constructor) == null ? void 0 : i.name) || ""))
375
+ return n.toArray().map((a) => O(a, t, r + 1));
376
+ const o = {};
377
+ for (const a of Object.keys(n).sort()) {
378
+ if (a.startsWith("_") || ["id", "uuid", "uiConfig", "object", "ctx", "body", "world"].includes(a)) continue;
379
+ const s = O(n[a], t, r + 1);
380
+ s !== void 0 && (o[a] = s);
381
+ }
382
+ return o;
383
+ }
384
+ function p(e) {
385
+ return typeof e == "number" ? M(e) : Array.isArray(e) ? e.map(p) : d(e) ? Object.fromEntries(Object.keys(e).sort().flatMap((t) => {
386
+ const r = p(e[t]);
387
+ return r === void 0 ? [] : [[t, r]];
388
+ })) : e;
389
+ }
390
+ function T(e) {
391
+ return { x: M(e.x), y: M(e.y), z: M(e.z) };
392
+ }
393
+ function M(e) {
394
+ if (!Number.isFinite(e)) return null;
395
+ const t = Math.round(e * 1e6) / 1e6;
396
+ return Object.is(t, -0) ? 0 : t;
397
+ }
398
+ function $(e, t) {
399
+ return !Array.isArray(e) || e.some((r) => typeof r != "number") ? t : e.map((r) => M(r) ?? 0);
400
+ }
401
+ function pe(e) {
402
+ const t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)), r = (n) => {
403
+ if (!(!n || typeof n != "object" || Object.isFrozen(n))) {
404
+ for (const o of Object.values(n)) r(o);
405
+ Object.freeze(n);
406
+ }
407
+ };
408
+ return r(t), t;
409
+ }
410
+ function G(e, t) {
411
+ e.some((r) => {
412
+ var n, o;
413
+ return r.code === t.code && ((n = r.object) == null ? void 0 : n.uuid) === ((o = t.object) == null ? void 0 : o.uuid) && r.path === t.path;
414
+ }) || e.push(t);
415
+ }
416
+ function _(e) {
417
+ return { uuid: e.uuid, name: e.name || "(unnamed)" };
418
+ }
419
+ function F(e) {
420
+ const t = e;
421
+ return !!(t.isMesh || t.isLine || t.isPoints || t.isSprite);
422
+ }
423
+ function ye(e) {
424
+ var t;
425
+ return ((t = e.userData) == null ? void 0 : t.selectable) !== !1 && !e.isWidget;
426
+ }
427
+ function he(e, t) {
428
+ for (let r = e; r; r = r.parent) {
429
+ if (!r.visible) return !1;
430
+ if (r === t) return !0;
431
+ }
432
+ return !1;
433
+ }
434
+ function ge(e, t) {
435
+ for (let r = e; r; r = r.parent)
436
+ if (r === t) return !0;
437
+ return !1;
438
+ }
439
+ function be(e, t) {
440
+ if (e === t.mainCamera || e === t.defaultCamera) return !0;
441
+ for (let r = e; r; r = r.parent)
442
+ if (r.isWidget) return !0;
443
+ return !1;
444
+ }
445
+ function Re(e) {
446
+ for (let t = e; t; t = t.parent)
447
+ if (j(t)) return t;
448
+ }
449
+ function X(e, t) {
450
+ for (let r = e.parent; r; r = r.parent)
451
+ if (t.has(r)) return !0;
452
+ return !1;
453
+ }
454
+ function we(e) {
455
+ var t;
456
+ for (let r = e; r; r = r.parent)
457
+ if ((t = P(r)) != null && t.allowCameraInside) return !0;
458
+ return !1;
459
+ }
460
+ function W(e) {
461
+ return Number.isFinite(e.x) && Number.isFinite(e.y) && Number.isFinite(e.z);
462
+ }
463
+ function oe(e) {
464
+ const t = e;
465
+ return t.isMesh ? "Mesh" : t.isCamera ? "Camera" : t.isLight ? "Light" : e.children.length ? "Group" : e.type;
466
+ }
467
+ function D(e, t) {
468
+ return JSON.stringify(e).localeCompare(JSON.stringify(t));
469
+ }
470
+ function Z(e) {
471
+ return e.replace(/~/g, "~0").replace(/\//g, "~1");
472
+ }
473
+ function Ae(e) {
474
+ return e instanceof Error ? e.message : String(e);
475
+ }
476
+ function d(e) {
477
+ return !!e && typeof e == "object" && !Array.isArray(e);
478
+ }
479
+ export {
480
+ Ce as authoringQualityReport,
481
+ Te as installGameHooks,
482
+ Oe as persistenceReport,
483
+ Ne as publishGameTelemetry,
484
+ xe as registerGameValidation,
485
+ Ie as runtimeCleanupReport,
486
+ H as semanticSceneSnapshot
487
+ };
488
+ //# sourceMappingURL=authoringValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringValidation.js","sources":["../src/authoringValidation.ts"],"sourcesContent":["import {\n Box3,\n EntityComponentPlugin,\n Frustum,\n Matrix4,\n Vector3,\n type IObject3D,\n type ThreeViewer,\n} from 'threepipe'\nimport {\n KITE3D_AUTHORING_METADATA_KEY,\n getAuthoringMetadata,\n getRuntimeObjectMetadata,\n getTrackedRuntimeObjects,\n type AuthoringMetadata,\n type RuntimeMutableProperty,\n} from './authoring.ts'\n\nexport type AuthoringFailureCode =\n | 'NO_VISIBLE_AUTHORED_CONTENT'\n | 'GENERATOR_PREVIEW_MISSING'\n | 'RUNTIME_OBJECT_AFTER_STOP'\n | 'MISSING_AUTHORING_SOURCE'\n | 'RUNTIME_SOURCE_DRIFT'\n | 'CAMERA_NOT_USEFUL'\n | 'CAMERA_CONTAINMENT_UNVERIFIED'\n | 'PERSISTENCE_DRIFT'\n\nexport interface AuthoringValidationIssue {\n code: AuthoringFailureCode\n severity: 'error' | 'warning'\n message: string\n object?: {uuid: string, name: string}\n path?: string\n before?: unknown\n after?: unknown\n}\n\nexport interface AuthoringQualityReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n checks: {\n visibleAuthoredContent: boolean\n selectableAuthoredContent: boolean\n relationshipsValid: boolean\n generatorPreviews: boolean\n cameraUseful: boolean\n }\n metrics: {\n authoredObjectCount: number\n renderableCount: number\n visibleRenderableCount: number\n selectableCount: number\n generatorCount: number\n generatorPreviewCount: number\n cameraFramedRenderableCount: number\n cameraInsideRenderableCount: number\n }\n}\n\nexport interface RuntimeCleanupReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n trackedObjectCount: number\n outsideRenderableCount: number\n}\n\nexport interface SemanticSceneSnapshot {\n schemaVersion: 1\n scene: unknown[]\n}\n\nexport interface PersistenceChange {\n path: string\n before: unknown\n after: unknown\n}\n\nexport interface PersistenceReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n changes: PersistenceChange[]\n beforeBytes: number\n afterBytes: number\n}\n\ntype ViewerLike = Pick<ThreeViewer, 'scene'>\ntype SceneLike = IObject3D & {modelRoot: IObject3D, mainCamera?: IObject3D, defaultCamera?: IObject3D}\nconst CAMERA_BOUNDS_EPSILON = 1e-6\n\ninterface SourceRecord {\n object: IObject3D\n metadata: AuthoringMetadata\n}\n\n/** Validate the stopped authoring hierarchy, its sources, previews, and saved camera. */\nexport function authoringQualityReport(viewer: ViewerLike): AuthoringQualityReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Authoring validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n\n const issues: AuthoringValidationIssue[] = []\n const sources = collectSources(scene.modelRoot)\n const generators: SourceRecord[] = []\n const previews: SourceRecord[] = []\n const boundedPreviewSourceIds = new Set<string>()\n const visibleBounds: Array<{object: IObject3D, bounds: Box3}> = []\n let authoredObjectCount = 0\n let renderableCount = 0\n let visibleRenderableCount = 0\n let selectableCount = 0\n\n scene.modelRoot.traverse((object) => {\n if (object === scene.modelRoot) return\n authoredObjectCount += 1\n const metadata = getAuthoringMetadata(object)\n if (metadata?.role === 'generator' && !metadata.sourceId) generators.push({object, metadata})\n if (metadata?.role === 'generator' && metadata.sourceId) previews.push({object, metadata})\n if (!isRenderable(object)) return\n renderableCount += 1\n if (!isEffectivelyVisible(object, scene.modelRoot)) return\n visibleRenderableCount += 1\n if (isSelectable(object)) selectableCount += 1\n const bounds = new Box3().setFromObject(object)\n if (!bounds.isEmpty() && finiteVector(bounds.min) && finiteVector(bounds.max)) {\n visibleBounds.push({object, bounds})\n if (metadata?.role === 'generator' && metadata.sourceId) boundedPreviewSourceIds.add(metadata.sourceId)\n }\n })\n\n for (const preview of previews) {\n const source = sources.get(preview.metadata.sourceId || '')\n if (!source || source.metadata.role !== 'generator') {\n pushIssue(issues, {\n code: 'MISSING_AUTHORING_SOURCE',\n severity: 'error',\n message: `Generator output source \"${preview.metadata.sourceId || '(missing)'}\" is not present beneath modelRoot.`,\n object: objectEvidence(preview.object),\n })\n }\n }\n for (const generator of generators) {\n if (!boundedPreviewSourceIds.has(generator.metadata.id)) {\n pushIssue(issues, {\n code: 'GENERATOR_PREVIEW_MISSING',\n severity: 'error',\n message: 'An authored generator needs a bounded stopped-mode preview.',\n object: objectEvidence(generator.object),\n })\n }\n }\n issues.push(...runtimeRelationshipIssues(scene, sources))\n\n const emptyScene = authoredObjectCount === 0 && generators.length === 0\n if (visibleRenderableCount === 0 || selectableCount === 0) {\n issues.push({\n code: 'NO_VISIBLE_AUTHORED_CONTENT',\n severity: emptyScene ? 'warning' : 'error',\n message: emptyScene\n ? 'The scene is empty; add authored content when you are ready.'\n : visibleRenderableCount === 0\n ? 'No visible renderable authored content exists beneath modelRoot.'\n : 'Visible authored renderables are not selectable.',\n })\n }\n\n const camera = scene.defaultCamera || scene.mainCamera\n const cameraSource = scene.defaultCamera ? 'scene.defaultCamera' : 'scene.mainCamera'\n const cameraResult = emptyScene\n ? {useful: false, framed: 0, inside: 0}\n : validateCamera(camera, cameraSource, visibleBounds, issues)\n const errors = issues.filter(({severity}) => severity === 'error')\n const relationshipsValid = !errors.some(({code}) =>\n code === 'MISSING_AUTHORING_SOURCE' || code === 'RUNTIME_SOURCE_DRIFT')\n const generatorPreviews = !errors.some(({code}) => code === 'GENERATOR_PREVIEW_MISSING')\n const ok = errors.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Stopped-mode authored representation passed.' : `${errors.length} authoring check(s) failed.`,\n issues,\n checks: {\n visibleAuthoredContent: visibleRenderableCount > 0,\n selectableAuthoredContent: selectableCount > 0,\n relationshipsValid,\n generatorPreviews,\n cameraUseful: cameraResult.useful,\n },\n metrics: {\n authoredObjectCount,\n renderableCount,\n visibleRenderableCount,\n selectableCount,\n generatorCount: generators.length,\n generatorPreviewCount: boundedPreviewSourceIds.size,\n cameraFramedRenderableCount: cameraResult.framed,\n cameraInsideRenderableCount: cameraResult.inside,\n },\n }\n}\n\n/** Validate that Play-only content was removed and its authored sources stayed valid. */\nexport function runtimeCleanupReport(viewer: ViewerLike): RuntimeCleanupReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Runtime cleanup validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n const issues = runtimeRelationshipIssues(scene, collectSources(scene.modelRoot))\n const tracked = getTrackedRuntimeObjects(scene)\n const leaked = new Set<IObject3D>()\n let outsideRenderableCount = 0\n\n for (const object of tracked) {\n if (!hasRuntimeAncestor(object, leaked)) leaked.add(object)\n }\n scene.traverse((object) => {\n if (object === scene || object === scene.modelRoot || isInside(object, scene.modelRoot) || isEditorObject(object, scene)) return\n if (isRenderable(object)) outsideRenderableCount += 1\n const runtimeRoot = nearestRuntimeRoot(object)\n if (runtimeRoot) {\n if (!hasRuntimeAncestor(runtimeRoot, leaked)) leaked.add(runtimeRoot)\n } else if (isRenderable(object)) {\n leaked.add(object)\n }\n })\n for (const object of leaked) {\n pushIssue(issues, {\n code: 'RUNTIME_OBJECT_AFTER_STOP',\n severity: 'error',\n message: getRuntimeObjectMetadata(object)\n ? 'A tracked runtime object remains after Stop.'\n : 'An unmarked renderable remains outside modelRoot after Stop.',\n object: objectEvidence(object),\n })\n }\n const ok = !issues.some(({severity}) => severity === 'error')\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Runtime cleanup passed.' : `${issues.filter(({severity}) => severity === 'error').length} runtime cleanup check(s) failed.`,\n issues,\n trackedObjectCount: tracked.length,\n outsideRenderableCount,\n }\n}\n\n/** Capture the supported saved semantics without transient engine identities. */\nexport function semanticSceneSnapshot(source: ViewerLike | SceneLike): SemanticSceneSnapshot {\n const scene = 'scene' in source ? source.scene as SceneLike : source\n if (!scene?.modelRoot) throw new Error('A semantic snapshot requires scene.modelRoot')\n return {\n schemaVersion: 1,\n scene: scene.modelRoot.children\n .filter((object) => object.userData?.excludeFromExport !== true)\n .map((object) => serializeObject(object)),\n }\n}\n\n/** Compare names, transforms, component state, and authored source relationships. */\nexport function persistenceReport(before: unknown, after: unknown): PersistenceReport {\n const beforeValue = canonicalValue(toSemanticSnapshot(before))\n const afterValue = canonicalValue(toSemanticSnapshot(after))\n const beforeText = JSON.stringify(beforeValue)\n const afterText = JSON.stringify(afterValue)\n const changes: PersistenceChange[] = []\n compareValues(beforeValue, afterValue, '', changes)\n const issues: AuthoringValidationIssue[] = changes.map((change) => ({\n code: 'PERSISTENCE_DRIFT',\n severity: 'error',\n message: `Saved authoring semantics changed at ${change.path || '/'}.`,\n ...change,\n }))\n const ok = changes.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Save/Reload semantic equivalence passed.' : `${changes.length} persisted semantic difference(s) found.`,\n issues,\n changes,\n beforeBytes: beforeText.length,\n afterBytes: afterText.length,\n }\n}\n\nexport interface GameValidationResult {\n status: 'pass' | 'fail'\n summary: string\n checks?: Record<string, boolean | number | string>\n}\n\nexport interface GameValidationReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n results: GameValidationResult[]\n}\n\nexport type GameValidationFunction = () => GameValidationResult | boolean | void | Promise<GameValidationResult | boolean | void>\n\ninterface GameHookHost {\n registerGameValidation(fn: GameValidationFunction): () => void\n publishGameTelemetry(value: object): () => void\n runGameValidation(): Promise<GameValidationReport>\n dispose(): void\n}\n\nlet activeGameHooks: GameHookHost | undefined\n\n/** Register a project-defined gameplay assertion for the currently starting game. */\nexport function registerGameValidation(fn: GameValidationFunction): () => void {\n if (!activeGameHooks) throw new Error('registerGameValidation must be called while createGame is active')\n return activeGameHooks.registerGameValidation(fn)\n}\n\n/** Publish an immutable telemetry snapshot on window.kite3dGame.telemetry. */\nexport function publishGameTelemetry(value: object): () => void {\n if (!activeGameHooks) throw new Error('publishGameTelemetry must be called while createGame is active')\n return activeGameHooks.publishGameTelemetry(value)\n}\n\n/** Install the per-createGame hook host before project modules are evaluated. */\nexport function installGameHooks(): GameHookHost {\n const validations = new Set<GameValidationFunction>()\n let telemetry: object | undefined\n let disposed = false\n const api = Object.freeze({\n get telemetry() { return telemetry },\n validate: () => host.runGameValidation(),\n })\n const host: GameHookHost = {\n registerGameValidation(fn) {\n if (disposed || typeof fn !== 'function') throw new Error('Game validation must be a function on an active game')\n validations.add(fn)\n return () => validations.delete(fn)\n },\n publishGameTelemetry(value) {\n if (disposed || !value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Game telemetry must be an object on an active game')\n }\n const published = immutableCopy(value)\n telemetry = published\n return () => {\n if (telemetry === published) telemetry = undefined\n }\n },\n async runGameValidation() {\n const results: GameValidationResult[] = []\n for (const validate of validations) {\n try {\n const result = await validate()\n if (result === undefined || result === true) {\n results.push({status: 'pass', summary: 'Project validation passed.'})\n } else if (result === false) {\n results.push({status: 'fail', summary: 'Project validation failed.'})\n } else if (result && ['pass', 'fail'].includes(result.status) && typeof result.summary === 'string') {\n results.push(result)\n } else {\n results.push({status: 'fail', summary: 'Project validation returned an invalid result.'})\n }\n } catch (error) {\n results.push({status: 'fail', summary: `Project validation threw: ${errorMessage(error)}`})\n }\n }\n const failed = results.filter(({status}) => status === 'fail')\n return {\n ok: failed.length === 0,\n status: failed.length ? 'fail' : 'pass',\n summary: failed.length ? failed.map(({summary}) => summary).join(' ') : 'Project validations passed.',\n results,\n }\n },\n dispose() {\n disposed = true\n validations.clear()\n telemetry = undefined\n if (activeGameHooks === host) activeGameHooks = undefined\n if (typeof window !== 'undefined' && window.kite3dGame === api) delete window.kite3dGame\n },\n }\n activeGameHooks?.dispose()\n activeGameHooks = host\n if (typeof window !== 'undefined') window.kite3dGame = api\n return host\n}\n\nfunction collectSources(modelRoot: IObject3D): Map<string, SourceRecord> {\n const sources = new Map<string, SourceRecord>()\n modelRoot.traverse((object) => {\n if (object === modelRoot) return\n const metadata = getAuthoringMetadata(object)\n if (metadata && !metadata.sourceId) sources.set(metadata.id, {object, metadata})\n else if (!metadata) sources.set(object.uuid, {object, metadata: {role: 'direct', id: object.uuid}})\n })\n return sources\n}\n\nfunction runtimeRelationshipIssues(scene: SceneLike, sources: Map<string, SourceRecord>): AuthoringValidationIssue[] {\n const issues: AuthoringValidationIssue[] = []\n scene.traverse((object) => {\n const metadata = getAuthoringMetadata(object)\n if (!metadata?.sourceId) return\n const source = sources.get(metadata.sourceId)\n if (!source) {\n pushIssue(issues, {\n code: 'MISSING_AUTHORING_SOURCE',\n severity: 'error',\n message: `Authored source \"${metadata.sourceId}\" is not present beneath modelRoot.`,\n object: objectEvidence(object),\n })\n return\n }\n const runtime = getRuntimeObjectMetadata(object)\n if (!runtime || runtime.kind === 'effect' || source.metadata.role === 'generator') return\n const overrides = new Set<RuntimeMutableProperty>(runtime.overrides || [])\n if (JSON.stringify(runtimeSignature(source.object, overrides)) !== JSON.stringify(runtimeSignature(object, overrides))) {\n pushIssue(issues, {\n code: 'RUNTIME_SOURCE_DRIFT',\n severity: 'error',\n message: 'A runtime copy differs from its authored source in a non-mutable field.',\n object: objectEvidence(object),\n })\n }\n })\n return issues\n}\n\nfunction validateCamera(\n camera: IObject3D | undefined,\n cameraSource: 'scene.defaultCamera' | 'scene.mainCamera',\n renderables: Array<{object: IObject3D, bounds: Box3}>,\n issues: AuthoringValidationIssue[],\n): {useful: boolean, framed: number, inside: number} {\n let framed = 0\n let inside = 0\n let facing = false\n const cameraLabel = `${cameraSource}${camera?.name ? ` \"${camera.name}\"` : ''}`\n let problem = `${cameraLabel} must be finite and face visible authored content.`\n const projectionMatrix = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.projectionMatrix\n const matrixWorldInverse = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.matrixWorldInverse\n if (camera && finiteVector(camera.position) && projectionMatrix && matrixWorldInverse && renderables.length) {\n camera.updateMatrixWorld(true)\n ;(camera as IObject3D & {updateProjectionMatrix?: () => void}).updateProjectionMatrix?.()\n const cameraPosition = camera.getWorldPosition(new Vector3())\n const totalBounds = new Box3().makeEmpty()\n for (const {bounds} of renderables) totalBounds.union(bounds)\n const center = totalBounds.getCenter(new Vector3())\n const direction = (camera as IObject3D & {getWorldDirection?: (target: Vector3) => Vector3}).getWorldDirection?.(new Vector3())\n const toward = center.clone().sub(cameraPosition)\n facing = !direction || toward.lengthSq() === 0 || direction.dot(toward.normalize()) > 0\n const frustum = new Frustum().setFromProjectionMatrix(new Matrix4().multiplyMatrices(projectionMatrix, matrixWorldInverse))\n framed = renderables.filter(({bounds}) => frustum.intersectsBox(bounds)).length\n\n for (const {object, bounds} of renderables) {\n if (cameraInsideAllowed(object) || !containsInteriorPoint(bounds, cameraPosition)) continue\n const mesh = object as IObject3D & {\n isMesh?: boolean\n isInstancedMesh?: boolean\n isSkinnedMesh?: boolean\n geometry?: {\n type?: string\n boundingBox?: Box3\n morphAttributes?: {position?: unknown[]}\n computeBoundingBox?(): void\n }\n }\n const geometry = mesh.geometry\n const deformed = mesh.isInstancedMesh || mesh.isSkinnedMesh || geometry?.morphAttributes?.position?.length\n if (!geometry || deformed || object.matrixWorld.determinant() === 0) {\n addContainmentWarning(issues, object)\n continue\n }\n geometry.computeBoundingBox?.()\n const localPosition = object.worldToLocal(cameraPosition.clone())\n if (!geometry.boundingBox || !containsInteriorPoint(geometry.boundingBox, localPosition)) continue\n if (mesh.isMesh && geometry.type === 'BoxGeometry') inside += 1\n else addContainmentWarning(issues, object)\n }\n if (inside) problem = `${cameraLabel} is inside ${inside} visible authored mesh(es).`\n else if (!framed) problem = `No visible authored renderable intersects ${cameraLabel}'s frustum.`\n else if (!facing) problem = `${cameraLabel} faces away from visible authored content.`\n }\n const useful = Boolean(camera && renderables.length && framed > 0 && inside === 0 && facing)\n if (!useful) issues.push({code: 'CAMERA_NOT_USEFUL', severity: 'error', message: problem})\n return {useful, framed, inside}\n}\n\nfunction containsInteriorPoint(bounds: Box3, point: Vector3): boolean {\n return point.x > bounds.min.x + CAMERA_BOUNDS_EPSILON\n && point.x < bounds.max.x - CAMERA_BOUNDS_EPSILON\n && point.y > bounds.min.y + CAMERA_BOUNDS_EPSILON\n && point.y < bounds.max.y - CAMERA_BOUNDS_EPSILON\n && point.z > bounds.min.z + CAMERA_BOUNDS_EPSILON\n && point.z < bounds.max.z - CAMERA_BOUNDS_EPSILON\n}\n\nfunction addContainmentWarning(issues: AuthoringValidationIssue[], object: IObject3D): void {\n pushIssue(issues, {\n code: 'CAMERA_CONTAINMENT_UNVERIFIED',\n severity: 'warning',\n message: 'The camera intersects local geometry bounds, but hollow or imported mesh containment is unverified.',\n object: objectEvidence(object),\n })\n}\n\nfunction runtimeSignature(object: IObject3D, overrides: Set<RuntimeMutableProperty>, root = true): unknown {\n const renderable = object as IObject3D & {geometry?: {parameters?: unknown}, material?: unknown | unknown[]}\n const result: Record<string, unknown> = {\n type: semanticType(object),\n geometry: canonicalValue(renderable.geometry?.parameters),\n children: object.children.map((child) => runtimeSignature(child, new Set(), false)),\n }\n if (!root || !overrides.has('visible')) result.visible = object.visible\n if (!root || !overrides.has('position')) result.position = vectorValue(object.position)\n if (!root || !overrides.has('rotation')) result.rotation = vectorValue(object.rotation)\n if (!root || !overrides.has('scale')) result.scale = vectorValue(object.scale)\n if (renderable.material && (!root || !overrides.has('material'))) {\n result.material = Array.isArray(renderable.material)\n ? renderable.material.map(materialValue)\n : materialValue(renderable.material)\n }\n return result\n}\n\nfunction materialValue(value: unknown): unknown {\n const material = value as {\n type?: string\n color?: {getHex?(): number}\n emissive?: {getHex?(): number}\n opacity?: number\n transparent?: boolean\n metalness?: number\n roughness?: number\n }\n return canonicalValue({\n type: material?.type,\n color: material?.color?.getHex?.(),\n emissive: material?.emissive?.getHex?.(),\n opacity: material?.opacity,\n transparent: material?.transparent,\n metalness: material?.metalness,\n roughness: material?.roughness,\n })\n}\n\nfunction serializeObject(object: IObject3D): unknown {\n const metadata = getAuthoringMetadata(object)\n return canonicalValue({\n name: object.name,\n type: semanticType(object),\n visible: object.visible,\n position: vectorValue(object.position),\n rotation: vectorValue(object.rotation),\n scale: vectorValue(object.scale),\n components: componentValues(object),\n ...(metadata ? {authoring: metadata} : {}),\n children: object.children\n .filter((child) => child.userData?.excludeFromExport !== true)\n .map((child) => serializeObject(child)),\n })\n}\n\nfunction componentValues(object: IObject3D): unknown[] {\n const live = EntityComponentPlugin.ObjectToComponents.get(object)\n if (live?.length) {\n return live.map((component) => {\n const definition = component.constructor as {ComponentType?: string, StateProperties?: Array<string | {name?: string, key?: string}>}\n const keys = (definition.StateProperties || []).map((property) =>\n typeof property === 'string' ? property : property.name || property.key).filter((key): key is string => Boolean(key))\n return canonicalValue({\n id: component.uuid,\n type: definition.ComponentType || component.constructor.name,\n state: Object.fromEntries(keys.map((key) => [key, semanticValue((component as unknown as Record<string, unknown>)[key])])),\n })\n }).sort(compareJson)\n }\n const saved = object.userData?.EntityComponentPlugin\n if (!isRecord(saved)) return []\n return Object.entries(saved).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n}\n\nfunction toSemanticSnapshot(value: unknown): SemanticSceneSnapshot {\n if (typeof value === 'string') return toSemanticSnapshot(JSON.parse(value))\n if (value instanceof Uint8Array) return toSemanticSnapshot(JSON.parse(new TextDecoder().decode(value)))\n if (isRecord(value) && isRecord(value.document)) return gltfSemanticSnapshot(value.document)\n if (isRecord(value) && value.schemaVersion === 1 && Array.isArray(value.scene)) return value as unknown as SemanticSceneSnapshot\n if (isRecord(value) && isRecord(value.asset)) return gltfSemanticSnapshot(value)\n if (isRecord(value) && 'scene' in value) return semanticSceneSnapshot(value as unknown as ViewerLike)\n if (isRecord(value) && 'modelRoot' in value) return semanticSceneSnapshot(value as unknown as SceneLike)\n throw new Error('Persistence comparison requires a semantic snapshot, viewer, scene, or serialized glTF document')\n}\n\nfunction gltfSemanticSnapshot(document: Record<string, unknown>): SemanticSceneSnapshot {\n const nodes = Array.isArray(document.nodes) ? document.nodes : []\n const scenes = Array.isArray(document.scenes) ? document.scenes : []\n const sceneIndex = typeof document.scene === 'number' ? document.scene : 0\n const root = isRecord(scenes[sceneIndex]) ? scenes[sceneIndex] : {}\n const rootNodes = Array.isArray(root.nodes) ? root.nodes : []\n const visit = (index: unknown): unknown => {\n const node = typeof index === 'number' && isRecord(nodes[index]) ? nodes[index] : {}\n const extras = isRecord(node.extras) ? node.extras : {}\n const authoring = isRecord(extras[KITE3D_AUTHORING_METADATA_KEY]) ? extras[KITE3D_AUTHORING_METADATA_KEY] : undefined\n const savedComponents = isRecord(extras.EntityComponentPlugin) ? extras.EntityComponentPlugin : {}\n const components = Object.entries(savedComponents).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n const translation = numericArray(node.translation, [0, 0, 0])\n const rotation = numericArray(node.rotation, [0, 0, 0, 1])\n const scale = numericArray(node.scale, [1, 1, 1])\n return canonicalValue({\n name: typeof node.name === 'string' ? node.name : '',\n type: typeof node.mesh === 'number' ? 'Mesh' : typeof node.camera === 'number' ? 'Camera' : 'Group',\n visible: extras.visible !== false,\n position: {x: translation[0], y: translation[1], z: translation[2]},\n quaternion: {x: rotation[0], y: rotation[1], z: rotation[2], w: rotation[3]},\n scale: {x: scale[0], y: scale[1], z: scale[2]},\n components,\n ...(authoring ? {authoring: semanticValue(authoring)} : {}),\n children: (Array.isArray(node.children) ? node.children : []).map(visit),\n })\n }\n return {schemaVersion: 1, scene: rootNodes.map(visit)}\n}\n\nfunction compareValues(left: unknown, right: unknown, path: string, changes: PersistenceChange[]): void {\n if (changes.length >= 50 || Object.is(left, right) || left === right) return\n if (!left || !right || typeof left !== 'object' || typeof right !== 'object'\n || Array.isArray(left) !== Array.isArray(right)) {\n changes.push({path: path || '/', before: left, after: right})\n return\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n const length = Math.max(left.length, right.length)\n for (let index = 0; index < length; index += 1) {\n const named = objectName(left[index]) || objectName(right[index])\n compareValues(left[index], right[index], `${path}/${escapePointer(named || String(index))}`, changes)\n }\n return\n }\n const leftRecord = left as Record<string, unknown>\n const rightRecord = right as Record<string, unknown>\n const keys = [...new Set([...Object.keys(leftRecord), ...Object.keys(rightRecord)])].sort()\n for (const key of keys) compareValues(leftRecord[key], rightRecord[key], `${path}/${escapePointer(key)}`, changes)\n}\n\nfunction objectName(value: unknown): string | undefined {\n if (!isRecord(value) || typeof value.name !== 'string') return undefined\n return value.name || undefined\n}\n\nfunction semanticValue(value: unknown, seen = new WeakSet<object>(), depth = 0): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value\n if (value === undefined || typeof value === 'function') return undefined\n if (Array.isArray(value)) return value.map((item) => semanticValue(item, seen, depth + 1))\n if (typeof value !== 'object' || depth > 5) return String(value)\n if (seen.has(value)) return '[Circular]'\n seen.add(value)\n const candidate = value as Record<string, unknown> & {isColor?: boolean, getHexString?(): string, toArray?(): unknown[]}\n if (candidate.isColor && candidate.getHexString) return `#${candidate.getHexString()}`\n if (candidate.toArray && /Vector|Euler|Quaternion/.test(value.constructor?.name || '')) {\n return candidate.toArray().map((item) => semanticValue(item, seen, depth + 1))\n }\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(candidate).sort()) {\n if (key.startsWith('_') || ['id', 'uuid', 'uiConfig', 'object', 'ctx', 'body', 'world'].includes(key)) continue\n const normalized = semanticValue(candidate[key], seen, depth + 1)\n if (normalized !== undefined) result[key] = normalized\n }\n return result\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (Array.isArray(value)) return value.map(canonicalValue)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().flatMap((key) => {\n const child = canonicalValue(value[key])\n return child === undefined ? [] : [[key, child]]\n }))\n}\n\nfunction vectorValue(value: {x: number, y: number, z: number}): {x: number | null, y: number | null, z: number | null} {\n return {x: normalizeNumber(value.x), y: normalizeNumber(value.y), z: normalizeNumber(value.z)}\n}\n\nfunction normalizeNumber(value: number): number | null {\n if (!Number.isFinite(value)) return null\n const rounded = Math.round(value * 1_000_000) / 1_000_000\n return Object.is(rounded, -0) ? 0 : rounded\n}\n\nfunction numericArray(value: unknown, fallback: number[]): number[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'number')) return fallback\n return value.map((item) => normalizeNumber(item) ?? 0)\n}\n\nfunction immutableCopy<T extends object>(value: T): T {\n const copy = typeof structuredClone === 'function' ? structuredClone(value) : JSON.parse(JSON.stringify(value)) as T\n const freeze = (candidate: unknown): void => {\n if (!candidate || typeof candidate !== 'object' || Object.isFrozen(candidate)) return\n for (const child of Object.values(candidate)) freeze(child)\n Object.freeze(candidate)\n }\n freeze(copy)\n return copy\n}\n\nfunction pushIssue(issues: AuthoringValidationIssue[], issue: AuthoringValidationIssue): void {\n if (issues.some((candidate) => candidate.code === issue.code && candidate.object?.uuid === issue.object?.uuid\n && candidate.path === issue.path)) return\n issues.push(issue)\n}\n\nfunction objectEvidence(object: IObject3D): {uuid: string, name: string} {\n return {uuid: object.uuid, name: object.name || '(unnamed)'}\n}\n\nfunction isRenderable(object: IObject3D): boolean {\n const candidate = object as IObject3D & {isMesh?: boolean, isLine?: boolean, isPoints?: boolean, isSprite?: boolean}\n return Boolean(candidate.isMesh || candidate.isLine || candidate.isPoints || candidate.isSprite)\n}\n\nfunction isSelectable(object: IObject3D): boolean {\n return object.userData?.selectable !== false && !object.isWidget\n}\n\nfunction isEffectivelyVisible(object: IObject3D, modelRoot: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (!current.visible) return false\n if (current === modelRoot) return true\n }\n return false\n}\n\nfunction isInside(object: IObject3D, ancestor: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current === ancestor) return true\n }\n return false\n}\n\nfunction isEditorObject(object: IObject3D, scene: SceneLike): boolean {\n if (object === scene.mainCamera || object === scene.defaultCamera) return true\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current.isWidget) return true\n }\n return false\n}\n\nfunction nearestRuntimeRoot(object: IObject3D): IObject3D | undefined {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getRuntimeObjectMetadata(current)) return current\n }\n return undefined\n}\n\nfunction hasRuntimeAncestor(object: IObject3D, candidates: Set<IObject3D>): boolean {\n for (let current = object.parent as IObject3D | null; current; current = current.parent as IObject3D | null) {\n if (candidates.has(current)) return true\n }\n return false\n}\n\nfunction cameraInsideAllowed(object: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getAuthoringMetadata(current)?.allowCameraInside) return true\n }\n return false\n}\n\nfunction finiteVector(value: {x: number, y: number, z: number}): boolean {\n return Number.isFinite(value.x) && Number.isFinite(value.y) && Number.isFinite(value.z)\n}\n\nfunction semanticType(object: IObject3D): string {\n const candidate = object as IObject3D & {isMesh?: boolean, isCamera?: boolean, isLight?: boolean}\n if (candidate.isMesh) return 'Mesh'\n if (candidate.isCamera) return 'Camera'\n if (candidate.isLight) return 'Light'\n return object.children.length ? 'Group' : object.type\n}\n\nfunction compareJson(left: unknown, right: unknown): number {\n return JSON.stringify(left).localeCompare(JSON.stringify(right))\n}\n\nfunction escapePointer(value: string): string {\n return value.replace(/~/g, '~0').replace(/\\//g, '~1')\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\ndeclare global {\n interface Window {\n kite3dGame?: Readonly<{\n readonly telemetry: object | undefined\n validate(): Promise<GameValidationReport>\n }>\n }\n}\n"],"names":["CAMERA_BOUNDS_EPSILON","authoringQualityReport","viewer","scene","issues","sources","collectSources","generators","previews","boundedPreviewSourceIds","visibleBounds","authoredObjectCount","renderableCount","visibleRenderableCount","selectableCount","object","metadata","getAuthoringMetadata","isRenderable","isEffectivelyVisible","isSelectable","bounds","Box3","finiteVector","preview","source","pushIssue","objectEvidence","generator","runtimeRelationshipIssues","emptyScene","camera","cameraSource","cameraResult","validateCamera","errors","severity","relationshipsValid","code","generatorPreviews","ok","runtimeCleanupReport","tracked","getTrackedRuntimeObjects","leaked","outsideRenderableCount","hasRuntimeAncestor","isInside","isEditorObject","runtimeRoot","nearestRuntimeRoot","getRuntimeObjectMetadata","semanticSceneSnapshot","_a","serializeObject","persistenceReport","before","after","beforeValue","canonicalValue","toSemanticSnapshot","afterValue","beforeText","afterText","changes","compareValues","change","activeGameHooks","registerGameValidation","fn","publishGameTelemetry","value","installGameHooks","validations","telemetry","disposed","api","host","published","immutableCopy","results","validate","result","error","errorMessage","failed","status","summary","modelRoot","runtime","overrides","runtimeSignature","renderables","framed","inside","facing","cameraLabel","problem","projectionMatrix","matrixWorldInverse","cameraPosition","Vector3","totalBounds","center","direction","_b","toward","frustum","Frustum","Matrix4","cameraInsideAllowed","containsInteriorPoint","mesh","geometry","deformed","_d","_c","addContainmentWarning","_e","localPosition","useful","point","root","renderable","semanticType","child","vectorValue","materialValue","material","componentValues","live","EntityComponentPlugin","component","definition","keys","property","key","semanticValue","compareJson","saved","isRecord","id","gltfSemanticSnapshot","document","nodes","scenes","sceneIndex","rootNodes","visit","index","node","extras","authoring","KITE3D_AUTHORING_METADATA_KEY","savedComponents","components","translation","numericArray","rotation","scale","left","right","path","length","named","objectName","escapePointer","leftRecord","rightRecord","seen","depth","normalizeNumber","item","candidate","normalized","rounded","fallback","copy","freeze","issue","current","ancestor","candidates"],"mappings":";;AA8FA,MAAMA,IAAwB;AAQvB,SAASC,GAAuBC,GAA4C;AAC/E,QAAMC,IAAQD,EAAO;AACrB,MAAI,EAACC,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,sDAAsD;AAC7F,EAAAA,EAAM,kBAAkB,EAAI;AAE5B,QAAMC,IAAqC,CAAA,GACrCC,IAAUC,GAAeH,EAAM,SAAS,GACxCI,IAA6B,CAAA,GAC7BC,IAA2B,CAAA,GAC3BC,wBAA8B,IAAA,GAC9BC,IAA0D,CAAA;AAChE,MAAIC,IAAsB,GACtBC,IAAkB,GAClBC,IAAyB,GACzBC,IAAkB;AAEtB,EAAAX,EAAM,UAAU,SAAS,CAACY,MAAW;AACjC,QAAIA,MAAWZ,EAAM,UAAW;AAChC,IAAAQ,KAAuB;AACvB,UAAMK,IAAWC,EAAqBF,CAAM;AAK5C,SAJIC,KAAA,gBAAAA,EAAU,UAAS,eAAe,CAACA,EAAS,YAAUT,EAAW,KAAK,EAAC,QAAAQ,GAAQ,UAAAC,EAAA,CAAS,IACxFA,KAAA,gBAAAA,EAAU,UAAS,eAAeA,EAAS,cAAmB,KAAK,EAAC,QAAAD,GAAQ,UAAAC,GAAS,GACrF,CAACE,EAAaH,CAAM,MACxBH,KAAmB,GACf,CAACO,GAAqBJ,GAAQZ,EAAM,SAAS,GAAG;AACpD,IAAAU,KAA0B,GACtBO,GAAaL,CAAM,MAAGD,KAAmB;AAC7C,UAAMO,IAAS,IAAIC,KAAO,cAAcP,CAAM;AAC9C,IAAI,CAACM,EAAO,QAAA,KAAaE,EAAaF,EAAO,GAAG,KAAKE,EAAaF,EAAO,GAAG,MACxEX,EAAc,KAAK,EAAC,QAAAK,GAAQ,QAAAM,EAAA,CAAO,IAC/BL,KAAA,gBAAAA,EAAU,UAAS,eAAeA,EAAS,YAAUP,EAAwB,IAAIO,EAAS,QAAQ;AAAA,EAE9G,CAAC;AAED,aAAWQ,KAAWhB,GAAU;AAC5B,UAAMiB,IAASpB,EAAQ,IAAImB,EAAQ,SAAS,YAAY,EAAE;AAC1D,KAAI,CAACC,KAAUA,EAAO,SAAS,SAAS,gBACpCC,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,4BAA4BoB,EAAQ,SAAS,YAAY,WAAW;AAAA,MAC7E,QAAQG,EAAeH,EAAQ,MAAM;AAAA,IAAA,CACxC;AAAA,EAET;AACA,aAAWI,KAAarB;AACpB,IAAKE,EAAwB,IAAImB,EAAU,SAAS,EAAE,KAClDF,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQuB,EAAeC,EAAU,MAAM;AAAA,IAAA,CAC1C;AAGT,EAAAxB,EAAO,KAAK,GAAGyB,GAA0B1B,GAAOE,CAAO,CAAC;AAExD,QAAMyB,IAAanB,MAAwB,KAAKJ,EAAW,WAAW;AACtE,GAAIM,MAA2B,KAAKC,MAAoB,MACpDV,EAAO,KAAK;AAAA,IACR,MAAM;AAAA,IACN,UAAU0B,IAAa,YAAY;AAAA,IACnC,SAASA,IACH,iEACAjB,MAA2B,IAC3B,qEACA;AAAA,EAAA,CACT;AAGL,QAAMkB,IAAS5B,EAAM,iBAAiBA,EAAM,YACtC6B,IAAe7B,EAAM,gBAAgB,wBAAwB,oBAC7D8B,IAAeH,IACf,EAAC,QAAQ,IAAO,QAAQ,GAAG,QAAQ,EAAA,IACnCI,GAAeH,GAAQC,GAActB,GAAeN,CAAM,GAC1D+B,IAAS/B,EAAO,OAAO,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO,GAC3DC,IAAqB,CAACF,EAAO,KAAK,CAAC,EAAC,MAAAG,EAAA,MACtCA,MAAS,8BAA8BA,MAAS,sBAAsB,GACpEC,IAAoB,CAACJ,EAAO,KAAK,CAAC,EAAC,MAAAG,EAAA,MAAUA,MAAS,2BAA2B,GACjFE,IAAKL,EAAO,WAAW;AAC7B,SAAO;AAAA,IACH,IAAAK;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,iDAAiD,GAAGL,EAAO,MAAM;AAAA,IAC/E,QAAA/B;AAAA,IACA,QAAQ;AAAA,MACJ,wBAAwBS,IAAyB;AAAA,MACjD,2BAA2BC,IAAkB;AAAA,MAC7C,oBAAAuB;AAAA,MACA,mBAAAE;AAAA,MACA,cAAcN,EAAa;AAAA,IAAA;AAAA,IAE/B,SAAS;AAAA,MACL,qBAAAtB;AAAA,MACA,iBAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,gBAAgBP,EAAW;AAAA,MAC3B,uBAAuBE,EAAwB;AAAA,MAC/C,6BAA6BwB,EAAa;AAAA,MAC1C,6BAA6BA,EAAa;AAAA,IAAA;AAAA,EAC9C;AAER;AAGO,SAASQ,GAAqBvC,GAA0C;AAC3E,QAAMC,IAAQD,EAAO;AACrB,MAAI,EAACC,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,4DAA4D;AACnG,EAAAA,EAAM,kBAAkB,EAAI;AAC5B,QAAMC,IAASyB,GAA0B1B,GAAOG,GAAeH,EAAM,SAAS,CAAC,GACzEuC,IAAUC,GAAyBxC,CAAK,GACxCyC,wBAAa,IAAA;AACnB,MAAIC,IAAyB;AAE7B,aAAW9B,KAAU2B;AACjB,IAAKI,EAAmB/B,GAAQ6B,CAAM,KAAGA,EAAO,IAAI7B,CAAM;AAE9D,EAAAZ,EAAM,SAAS,CAACY,MAAW;AACvB,QAAIA,MAAWZ,KAASY,MAAWZ,EAAM,aAAa4C,GAAShC,GAAQZ,EAAM,SAAS,KAAK6C,GAAejC,GAAQZ,CAAK,EAAG;AAC1H,IAAIe,EAAaH,CAAM,MAAG8B,KAA0B;AACpD,UAAMI,IAAcC,GAAmBnC,CAAM;AAC7C,IAAIkC,IACKH,EAAmBG,GAAaL,CAAM,KAAGA,EAAO,IAAIK,CAAW,IAC7D/B,EAAaH,CAAM,KAC1B6B,EAAO,IAAI7B,CAAM;AAAA,EAEzB,CAAC;AACD,aAAWA,KAAU6B;AACjB,IAAAlB,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS+C,EAAyBpC,CAAM,IAClC,iDACA;AAAA,MACN,QAAQY,EAAeZ,CAAM;AAAA,IAAA,CAChC;AAEL,QAAMyB,IAAK,CAACpC,EAAO,KAAK,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO;AAC5D,SAAO;AAAA,IACH,IAAAI;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,4BAA4B,GAAGpC,EAAO,OAAO,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO,EAAE,MAAM;AAAA,IACvG,QAAAhC;AAAA,IACA,oBAAoBsC,EAAQ;AAAA,IAC5B,wBAAAG;AAAA,EAAA;AAER;AAGO,SAASO,EAAsB3B,GAAuD;AACzF,QAAMtB,IAAQ,WAAWsB,IAASA,EAAO,QAAqBA;AAC9D,MAAI,EAACtB,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,8CAA8C;AACrF,SAAO;AAAA,IACH,eAAe;AAAA,IACf,OAAOA,EAAM,UAAU,SAClB,OAAO,CAACY;;AAAW,eAAAsC,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB,uBAAsB;AAAA,KAAI,EAC9D,IAAI,CAACtC,MAAWuC,GAAgBvC,CAAM,CAAC;AAAA,EAAA;AAEpD;AAGO,SAASwC,GAAkBC,GAAiBC,GAAmC;AAClF,QAAMC,IAAcC,EAAeC,EAAmBJ,CAAM,CAAC,GACvDK,IAAaF,EAAeC,EAAmBH,CAAK,CAAC,GACrDK,IAAa,KAAK,UAAUJ,CAAW,GACvCK,IAAY,KAAK,UAAUF,CAAU,GACrCG,IAA+B,CAAA;AACrC,EAAAC,EAAcP,GAAaG,GAAY,IAAIG,CAAO;AAClD,QAAM5D,IAAqC4D,EAAQ,IAAI,CAACE,OAAY;AAAA,IAChE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,wCAAwCA,EAAO,QAAQ,GAAG;AAAA,IACnE,GAAGA;AAAA,EAAA,EACL,GACI1B,IAAKwB,EAAQ,WAAW;AAC9B,SAAO;AAAA,IACH,IAAAxB;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,6CAA6C,GAAGwB,EAAQ,MAAM;AAAA,IAC5E,QAAA5D;AAAA,IACA,SAAA4D;AAAA,IACA,aAAaF,EAAW;AAAA,IACxB,YAAYC,EAAU;AAAA,EAAA;AAE9B;AAwBA,IAAII;AAGG,SAASC,GAAuBC,GAAwC;AAC3E,MAAI,CAACF,EAAiB,OAAM,IAAI,MAAM,kEAAkE;AACxG,SAAOA,EAAgB,uBAAuBE,CAAE;AACpD;AAGO,SAASC,GAAqBC,GAA2B;AAC5D,MAAI,CAACJ,EAAiB,OAAM,IAAI,MAAM,gEAAgE;AACtG,SAAOA,EAAgB,qBAAqBI,CAAK;AACrD;AAGO,SAASC,KAAiC;AAC7C,QAAMC,wBAAkB,IAAA;AACxB,MAAIC,GACAC,IAAW;AACf,QAAMC,IAAM,OAAO,OAAO;AAAA,IACtB,IAAI,YAAY;AAAE,aAAOF;AAAA,IAAU;AAAA,IACnC,UAAU,MAAMG,EAAK,kBAAA;AAAA,EAAkB,CAC1C,GACKA,IAAqB;AAAA,IACvB,uBAAuBR,GAAI;AACvB,UAAIM,KAAY,OAAON,KAAO,WAAY,OAAM,IAAI,MAAM,sDAAsD;AAChH,aAAAI,EAAY,IAAIJ,CAAE,GACX,MAAMI,EAAY,OAAOJ,CAAE;AAAA,IACtC;AAAA,IACA,qBAAqBE,GAAO;AACxB,UAAII,KAAY,CAACJ,KAAS,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK;AACtE,cAAM,IAAI,MAAM,oDAAoD;AAExE,YAAMO,IAAYC,GAAcR,CAAK;AACrC,aAAAG,IAAYI,GACL,MAAM;AACT,QAAIJ,MAAcI,MAAWJ,IAAY;AAAA,MAC7C;AAAA,IACJ;AAAA,IACA,MAAM,oBAAoB;AACtB,YAAMM,IAAkC,CAAA;AACxC,iBAAWC,KAAYR;AACnB,YAAI;AACA,gBAAMS,IAAS,MAAMD,EAAA;AACrB,UAAIC,MAAW,UAAaA,MAAW,KACnCF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,8BAA6B,IAC7DE,MAAW,KAClBF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,8BAA6B,IAC7DE,KAAU,CAAC,QAAQ,MAAM,EAAE,SAASA,EAAO,MAAM,KAAK,OAAOA,EAAO,WAAY,WACvFF,EAAQ,KAAKE,CAAM,IAEnBF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,kDAAiD;AAAA,QAEhG,SAASG,GAAO;AACZ,UAAAH,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,6BAA6BI,GAAaD,CAAK,CAAC,GAAA,CAAG;AAAA,QAC9F;AAEJ,YAAME,IAASL,EAAQ,OAAO,CAAC,EAAC,QAAAM,EAAA,MAAYA,MAAW,MAAM;AAC7D,aAAO;AAAA,QACH,IAAID,EAAO,WAAW;AAAA,QACtB,QAAQA,EAAO,SAAS,SAAS;AAAA,QACjC,SAASA,EAAO,SAASA,EAAO,IAAI,CAAC,EAAC,SAAAE,EAAA,MAAaA,CAAO,EAAE,KAAK,GAAG,IAAI;AAAA,QACxE,SAAAP;AAAA,MAAA;AAAA,IAER;AAAA,IACA,UAAU;AACN,MAAAL,IAAW,IACXF,EAAY,MAAA,GACZC,IAAY,QACRP,MAAoBU,MAAMV,IAAkB,SAC5C,OAAO,SAAW,OAAe,OAAO,eAAeS,YAAY,OAAO;AAAA,IAClF;AAAA,EAAA;AAEJ,SAAAT,KAAA,QAAAA,EAAiB,WACjBA,IAAkBU,GACd,OAAO,SAAW,QAAa,OAAO,aAAaD,IAChDC;AACX;AAEA,SAASvE,GAAekF,GAAiD;AACrE,QAAMnF,wBAAc,IAAA;AACpB,SAAAmF,EAAU,SAAS,CAACzE,MAAW;AAC3B,QAAIA,MAAWyE,EAAW;AAC1B,UAAMxE,IAAWC,EAAqBF,CAAM;AAC5C,IAAIC,KAAY,CAACA,EAAS,WAAUX,EAAQ,IAAIW,EAAS,IAAI,EAAC,QAAAD,GAAQ,UAAAC,EAAA,CAAS,IACrEA,KAAUX,EAAQ,IAAIU,EAAO,MAAM,EAAC,QAAAA,GAAQ,UAAU,EAAC,MAAM,UAAU,IAAIA,EAAO,KAAA,GAAM;AAAA,EACtG,CAAC,GACMV;AACX;AAEA,SAASwB,GAA0B1B,GAAkBE,GAAgE;AACjH,QAAMD,IAAqC,CAAA;AAC3C,SAAAD,EAAM,SAAS,CAACY,MAAW;AACvB,UAAMC,IAAWC,EAAqBF,CAAM;AAC5C,QAAI,EAACC,KAAA,QAAAA,EAAU,UAAU;AACzB,UAAMS,IAASpB,EAAQ,IAAIW,EAAS,QAAQ;AAC5C,QAAI,CAACS,GAAQ;AACT,MAAAC,EAAUtB,GAAQ;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oBAAoBY,EAAS,QAAQ;AAAA,QAC9C,QAAQW,EAAeZ,CAAM;AAAA,MAAA,CAChC;AACD;AAAA,IACJ;AACA,UAAM0E,IAAUtC,EAAyBpC,CAAM;AAC/C,QAAI,CAAC0E,KAAWA,EAAQ,SAAS,YAAYhE,EAAO,SAAS,SAAS,YAAa;AACnF,UAAMiE,IAAY,IAAI,IAA4BD,EAAQ,aAAa,CAAA,CAAE;AACzE,IAAI,KAAK,UAAUE,EAAiBlE,EAAO,QAAQiE,CAAS,CAAC,MAAM,KAAK,UAAUC,EAAiB5E,GAAQ2E,CAAS,CAAC,KACjHhE,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQuB,EAAeZ,CAAM;AAAA,IAAA,CAChC;AAAA,EAET,CAAC,GACMX;AACX;AAEA,SAAS8B,GACLH,GACAC,GACA4D,GACAxF,GACiD;;AACjD,MAAIyF,IAAS,GACTC,IAAS,GACTC,IAAS;AACb,QAAMC,IAAc,GAAGhE,CAAY,GAAGD,KAAA,QAAAA,EAAQ,OAAO,KAAKA,EAAO,IAAI,MAAM,EAAE;AAC7E,MAAIkE,IAAU,GAAGD,CAAW;AAC5B,QAAME,IAAoBnE,KAAA,gBAAAA,EAAmF,kBACvGoE,IAAsBpE,KAAA,gBAAAA,EAAmF;AAC/G,MAAIA,KAAUR,EAAaQ,EAAO,QAAQ,KAAKmE,KAAoBC,KAAsBP,EAAY,QAAQ;AACzG,IAAA7D,EAAO,kBAAkB,EAAI,IAC3BsB,IAAAtB,EAA6D,2BAA7D,QAAAsB,EAAA,KAAAtB;AACF,UAAMqE,IAAiBrE,EAAO,iBAAiB,IAAIsE,GAAS,GACtDC,IAAc,IAAIhF,GAAA,EAAO,UAAA;AAC/B,eAAW,EAAC,QAAAD,EAAA,KAAWuE,EAAa,CAAAU,EAAY,MAAMjF,CAAM;AAC5D,UAAMkF,IAASD,EAAY,UAAU,IAAID,GAAS,GAC5CG,KAAaC,IAAA1E,EAA0E,sBAA1E,gBAAA0E,EAAA,KAAA1E,GAA8F,IAAIsE,MAC/GK,IAASH,EAAO,MAAA,EAAQ,IAAIH,CAAc;AAChD,IAAAL,IAAS,CAACS,KAAaE,EAAO,SAAA,MAAe,KAAKF,EAAU,IAAIE,EAAO,UAAA,CAAW,IAAI;AACtF,UAAMC,IAAU,IAAIC,GAAA,EAAU,wBAAwB,IAAIC,GAAA,EAAU,iBAAiBX,GAAkBC,CAAkB,CAAC;AAC1H,IAAAN,IAASD,EAAY,OAAO,CAAC,EAAC,QAAAvE,QAAYsF,EAAQ,cAActF,CAAM,CAAC,EAAE;AAEzE,eAAW,EAAC,QAAAN,GAAQ,QAAAM,GAAA,KAAWuE,GAAa;AACxC,UAAIkB,GAAoB/F,CAAM,KAAK,CAACgG,EAAsB1F,IAAQ+E,CAAc,EAAG;AACnF,YAAMY,IAAOjG,GAWPkG,IAAWD,EAAK,UAChBE,KAAWF,EAAK,mBAAmBA,EAAK,mBAAiBG,KAAAC,IAAAH,KAAA,gBAAAA,EAAU,oBAAV,gBAAAG,EAA2B,aAA3B,gBAAAD,EAAqC;AACpG,UAAI,CAACF,KAAYC,MAAYnG,EAAO,YAAY,YAAA,MAAkB,GAAG;AACjE,QAAAsG,EAAsBjH,GAAQW,CAAM;AACpC;AAAA,MACJ;AACA,OAAAuG,IAAAL,EAAS,uBAAT,QAAAK,EAAA,KAAAL;AACA,YAAMM,KAAgBxG,EAAO,aAAaqF,EAAe,OAAO;AAChE,MAAI,CAACa,EAAS,eAAe,CAACF,EAAsBE,EAAS,aAAaM,EAAa,MACnFP,EAAK,UAAUC,EAAS,SAAS,gBAAenB,KAAU,IACzDuB,EAAsBjH,GAAQW,CAAM;AAAA,IAC7C;AACA,IAAI+E,IAAQG,IAAU,GAAGD,CAAW,cAAcF,CAAM,gCAC9CD,IACAE,MAAQE,IAAU,GAAGD,CAAW,gDADxBC,IAAU,6CAA6CD,CAAW;AAAA,EAExF;AACA,QAAMwB,IAAS,GAAQzF,KAAU6D,EAAY,UAAUC,IAAS,KAAKC,MAAW,KAAKC;AACrF,SAAKyB,KAAQpH,EAAO,KAAK,EAAC,MAAM,qBAAqB,UAAU,SAAS,SAAS6F,EAAA,CAAQ,GAClF,EAAC,QAAAuB,GAAQ,QAAA3B,GAAQ,QAAAC,EAAA;AAC5B;AAEA,SAASiB,EAAsB1F,GAAcoG,GAAyB;AAClE,SAAOA,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB;AACpC;AAEA,SAASqH,EAAsBjH,GAAoCW,GAAyB;AACxF,EAAAW,EAAUtB,GAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQuB,EAAeZ,CAAM;AAAA,EAAA,CAChC;AACL;AAEA,SAAS4E,EAAiB5E,GAAmB2E,GAAwCgC,IAAO,IAAe;;AACvG,QAAMC,IAAa5G,GACbmE,IAAkC;AAAA,IACpC,MAAM0C,GAAa7G,CAAM;AAAA,IACzB,UAAU4C,GAAeN,IAAAsE,EAAW,aAAX,gBAAAtE,EAAqB,UAAU;AAAA,IACxD,UAAUtC,EAAO,SAAS,IAAI,CAAC8G,MAAUlC,EAAiBkC,GAAO,oBAAI,IAAA,GAAO,EAAK,CAAC;AAAA,EAAA;AAEtF,UAAI,CAACH,KAAQ,CAAChC,EAAU,IAAI,SAAS,OAAGR,EAAO,UAAUnE,EAAO,WAC5D,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAAGR,EAAO,WAAW4C,EAAY/G,EAAO,QAAQ,KAClF,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAAGR,EAAO,WAAW4C,EAAY/G,EAAO,QAAQ,KAClF,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,OAAO,OAAGR,EAAO,QAAQ4C,EAAY/G,EAAO,KAAK,IACzE4G,EAAW,aAAa,CAACD,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAC1DR,EAAO,WAAW,MAAM,QAAQyC,EAAW,QAAQ,IAC7CA,EAAW,SAAS,IAAII,CAAa,IACrCA,EAAcJ,EAAW,QAAQ,IAEpCzC;AACX;AAEA,SAAS6C,EAAcxD,GAAyB;;AAC5C,QAAMyD,IAAWzD;AASjB,SAAOZ,EAAe;AAAA,IAClB,MAAMqE,KAAA,gBAAAA,EAAU;AAAA,IAChB,QAAOvB,KAAApD,IAAA2E,KAAA,gBAAAA,EAAU,UAAV,gBAAA3E,EAAiB,WAAjB,gBAAAoD,EAAA,KAAApD;AAAA,IACP,WAAU8D,KAAAC,IAAAY,KAAA,gBAAAA,EAAU,aAAV,gBAAAZ,EAAoB,WAApB,gBAAAD,EAAA,KAAAC;AAAA,IACV,SAASY,KAAA,gBAAAA,EAAU;AAAA,IACnB,aAAaA,KAAA,gBAAAA,EAAU;AAAA,IACvB,WAAWA,KAAA,gBAAAA,EAAU;AAAA,IACrB,WAAWA,KAAA,gBAAAA,EAAU;AAAA,EAAA,CACxB;AACL;AAEA,SAAS1E,GAAgBvC,GAA4B;AACjD,QAAMC,IAAWC,EAAqBF,CAAM;AAC5C,SAAO4C,EAAe;AAAA,IAClB,MAAM5C,EAAO;AAAA,IACb,MAAM6G,GAAa7G,CAAM;AAAA,IACzB,SAASA,EAAO;AAAA,IAChB,UAAU+G,EAAY/G,EAAO,QAAQ;AAAA,IACrC,UAAU+G,EAAY/G,EAAO,QAAQ;AAAA,IACrC,OAAO+G,EAAY/G,EAAO,KAAK;AAAA,IAC/B,YAAYkH,GAAgBlH,CAAM;AAAA,IAClC,GAAIC,IAAW,EAAC,WAAWA,EAAA,IAAY,CAAA;AAAA,IACvC,UAAUD,EAAO,SACZ,OAAO,CAAC8G;;AAAU,eAAAxE,IAAAwE,EAAM,aAAN,gBAAAxE,EAAgB,uBAAsB;AAAA,KAAI,EAC5D,IAAI,CAACwE,MAAUvE,GAAgBuE,CAAK,CAAC;AAAA,EAAA,CAC7C;AACL;AAEA,SAASI,GAAgBlH,GAA8B;;AACnD,QAAMmH,IAAOC,GAAsB,mBAAmB,IAAIpH,CAAM;AAChE,MAAImH,KAAA,QAAAA,EAAM;AACN,WAAOA,EAAK,IAAI,CAACE,MAAc;AAC3B,YAAMC,IAAaD,EAAU,aACvBE,KAAQD,EAAW,mBAAmB,CAAA,GAAI,IAAI,CAACE,MACjD,OAAOA,KAAa,WAAWA,IAAWA,EAAS,QAAQA,EAAS,GAAG,EAAE,OAAO,CAACC,MAAuB,EAAQA,CAAI;AACxH,aAAO7E,EAAe;AAAA,QAClB,IAAIyE,EAAU;AAAA,QACd,MAAMC,EAAW,iBAAiBD,EAAU,YAAY;AAAA,QACxD,OAAO,OAAO,YAAYE,EAAK,IAAI,CAACE,MAAQ,CAACA,GAAKC,EAAeL,EAAiDI,CAAG,CAAC,CAAC,CAAC,CAAC;AAAA,MAAA,CAC5H;AAAA,IACL,CAAC,EAAE,KAAKE,CAAW;AAEvB,QAAMC,KAAQtF,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB;AAC/B,SAAKuF,EAASD,CAAK,IACZ,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACE,GAAItE,CAAK,MAAM;AAC9C,UAAM6D,IAAYQ,EAASrE,CAAK,IAAIA,IAAQ,CAAA;AAC5C,WAAOZ,EAAe,EAAC,IAAAkF,GAAI,MAAMT,EAAU,MAAM,OAAOK,EAAcL,EAAU,KAAK,EAAA,CAAE;AAAA,EAC3F,CAAC,EAAE,KAAKM,CAAW,IAJU,CAAA;AAKjC;AAEA,SAAS9E,EAAmBW,GAAuC;AAC/D,MAAI,OAAOA,KAAU,SAAU,QAAOX,EAAmB,KAAK,MAAMW,CAAK,CAAC;AAC1E,MAAIA,aAAiB,WAAY,QAAOX,EAAmB,KAAK,MAAM,IAAI,YAAA,EAAc,OAAOW,CAAK,CAAC,CAAC;AACtG,MAAIqE,EAASrE,CAAK,KAAKqE,EAASrE,EAAM,QAAQ,EAAG,QAAOuE,EAAqBvE,EAAM,QAAQ;AAC3F,MAAIqE,EAASrE,CAAK,KAAKA,EAAM,kBAAkB,KAAK,MAAM,QAAQA,EAAM,KAAK,EAAG,QAAOA;AACvF,MAAIqE,EAASrE,CAAK,KAAKqE,EAASrE,EAAM,KAAK,EAAG,QAAOuE,EAAqBvE,CAAK;AAE/E,MADIqE,EAASrE,CAAK,KAAK,WAAWA,KAC9BqE,EAASrE,CAAK,KAAK,eAAeA,EAAO,QAAOnB,EAAsBmB,CAA6B;AACvG,QAAM,IAAI,MAAM,iGAAiG;AACrH;AAEA,SAASuE,EAAqBC,GAA0D;AACpF,QAAMC,IAAQ,MAAM,QAAQD,EAAS,KAAK,IAAIA,EAAS,QAAQ,CAAA,GACzDE,IAAS,MAAM,QAAQF,EAAS,MAAM,IAAIA,EAAS,SAAS,CAAA,GAC5DG,IAAa,OAAOH,EAAS,SAAU,WAAWA,EAAS,QAAQ,GACnErB,IAAOkB,EAASK,EAAOC,CAAU,CAAC,IAAID,EAAOC,CAAU,IAAI,CAAA,GAC3DC,IAAY,MAAM,QAAQzB,EAAK,KAAK,IAAIA,EAAK,QAAQ,CAAA,GACrD0B,IAAQ,CAACC,MAA4B;AACvC,UAAMC,IAAO,OAAOD,KAAU,YAAYT,EAASI,EAAMK,CAAK,CAAC,IAAIL,EAAMK,CAAK,IAAI,CAAA,GAC5EE,IAASX,EAASU,EAAK,MAAM,IAAIA,EAAK,SAAS,CAAA,GAC/CE,IAAYZ,EAASW,EAAOE,CAA6B,CAAC,IAAIF,EAAOE,CAA6B,IAAI,QACtGC,IAAkBd,EAASW,EAAO,qBAAqB,IAAIA,EAAO,wBAAwB,CAAA,GAC1FI,IAAa,OAAO,QAAQD,CAAe,EAAE,IAAI,CAAC,CAACb,GAAItE,CAAK,MAAM;AACpE,YAAM6D,IAAYQ,EAASrE,CAAK,IAAIA,IAAQ,CAAA;AAC5C,aAAOZ,EAAe,EAAC,IAAAkF,GAAI,MAAMT,EAAU,MAAM,OAAOK,EAAcL,EAAU,KAAK,EAAA,CAAE;AAAA,IAC3F,CAAC,EAAE,KAAKM,CAAW,GACbkB,IAAcC,EAAaP,EAAK,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,GACtDQ,IAAWD,EAAaP,EAAK,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GACnDS,IAAQF,EAAaP,EAAK,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAChD,WAAO3F,EAAe;AAAA,MAClB,MAAM,OAAO2F,EAAK,QAAS,WAAWA,EAAK,OAAO;AAAA,MAClD,MAAM,OAAOA,EAAK,QAAS,WAAW,SAAS,OAAOA,EAAK,UAAW,WAAW,WAAW;AAAA,MAC5F,SAASC,EAAO,YAAY;AAAA,MAC5B,UAAU,EAAC,GAAGK,EAAY,CAAC,GAAG,GAAGA,EAAY,CAAC,GAAG,GAAGA,EAAY,CAAC,EAAA;AAAA,MACjE,YAAY,EAAC,GAAGE,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,EAAA;AAAA,MAC1E,OAAO,EAAC,GAAGC,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,EAAA;AAAA,MAC5C,YAAAJ;AAAA,MACA,GAAIH,IAAY,EAAC,WAAWf,EAAce,CAAS,EAAA,IAAK,CAAA;AAAA,MACxD,WAAW,MAAM,QAAQF,EAAK,QAAQ,IAAIA,EAAK,WAAW,IAAI,IAAIF,CAAK;AAAA,IAAA,CAC1E;AAAA,EACL;AACA,SAAO,EAAC,eAAe,GAAG,OAAOD,EAAU,IAAIC,CAAK,EAAA;AACxD;AAEA,SAASnF,EAAc+F,GAAeC,GAAgBC,GAAclG,GAAoC;AACpG,MAAIA,EAAQ,UAAU,MAAM,OAAO,GAAGgG,GAAMC,CAAK,KAAKD,MAASC,EAAO;AACtE,MAAI,CAACD,KAAQ,CAACC,KAAS,OAAOD,KAAS,YAAY,OAAOC,KAAU,YAC7D,MAAM,QAAQD,CAAI,MAAM,MAAM,QAAQC,CAAK,GAAG;AACjD,IAAAjG,EAAQ,KAAK,EAAC,MAAMkG,KAAQ,KAAK,QAAQF,GAAM,OAAOC,GAAM;AAC5D;AAAA,EACJ;AACA,MAAI,MAAM,QAAQD,CAAI,KAAK,MAAM,QAAQC,CAAK,GAAG;AAC7C,UAAME,IAAS,KAAK,IAAIH,EAAK,QAAQC,EAAM,MAAM;AACjD,aAASZ,IAAQ,GAAGA,IAAQc,GAAQd,KAAS,GAAG;AAC5C,YAAMe,IAAQC,EAAWL,EAAKX,CAAK,CAAC,KAAKgB,EAAWJ,EAAMZ,CAAK,CAAC;AAChE,MAAApF,EAAc+F,EAAKX,CAAK,GAAGY,EAAMZ,CAAK,GAAG,GAAGa,CAAI,IAAII,EAAcF,KAAS,OAAOf,CAAK,CAAC,CAAC,IAAIrF,CAAO;AAAA,IACxG;AACA;AAAA,EACJ;AACA,QAAMuG,IAAaP,GACbQ,IAAcP,GACd3B,IAAO,CAAC,uBAAO,IAAI,CAAC,GAAG,OAAO,KAAKiC,CAAU,GAAG,GAAG,OAAO,KAAKC,CAAW,CAAC,CAAC,CAAC,EAAE,KAAA;AACrF,aAAWhC,KAAOF,EAAM,CAAArE,EAAcsG,EAAW/B,CAAG,GAAGgC,EAAYhC,CAAG,GAAG,GAAG0B,CAAI,IAAII,EAAc9B,CAAG,CAAC,IAAIxE,CAAO;AACrH;AAEA,SAASqG,EAAW9F,GAAoC;AACpD,MAAI,GAACqE,EAASrE,CAAK,KAAK,OAAOA,EAAM,QAAS;AAC9C,WAAOA,EAAM,QAAQ;AACzB;AAEA,SAASkE,EAAclE,GAAgBkG,wBAAW,QAAA,GAAmBC,IAAQ,GAAY;;AACrF,MAAI,OAAOnG,KAAU,SAAU,QAAOoG,EAAgBpG,CAAK;AAC3D,MAAIA,MAAU,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU,UAAW,QAAOA;AACtF,MAAIA,MAAU,UAAa,OAAOA,KAAU,WAAY;AACxD,MAAI,MAAM,QAAQA,CAAK,UAAUA,EAAM,IAAI,CAACqG,MAASnC,EAAcmC,GAAMH,GAAMC,IAAQ,CAAC,CAAC;AACzF,MAAI,OAAOnG,KAAU,YAAYmG,IAAQ,EAAG,QAAO,OAAOnG,CAAK;AAC/D,MAAIkG,EAAK,IAAIlG,CAAK,EAAG,QAAO;AAC5B,EAAAkG,EAAK,IAAIlG,CAAK;AACd,QAAMsG,IAAYtG;AAClB,MAAIsG,EAAU,WAAWA,EAAU,qBAAqB,IAAIA,EAAU,cAAc;AACpF,MAAIA,EAAU,WAAW,0BAA0B,OAAKxH,IAAAkB,EAAM,gBAAN,gBAAAlB,EAAmB,SAAQ,EAAE;AACjF,WAAOwH,EAAU,UAAU,IAAI,CAACD,MAASnC,EAAcmC,GAAMH,GAAMC,IAAQ,CAAC,CAAC;AAEjF,QAAMxF,IAAkC,CAAA;AACxC,aAAWsD,KAAO,OAAO,KAAKqC,CAAS,EAAE,QAAQ;AAC7C,QAAIrC,EAAI,WAAW,GAAG,KAAK,CAAC,MAAM,QAAQ,YAAY,UAAU,OAAO,QAAQ,OAAO,EAAE,SAASA,CAAG,EAAG;AACvG,UAAMsC,IAAarC,EAAcoC,EAAUrC,CAAG,GAAGiC,GAAMC,IAAQ,CAAC;AAChE,IAAII,MAAe,WAAW5F,EAAOsD,CAAG,IAAIsC;AAAA,EAChD;AACA,SAAO5F;AACX;AAEA,SAASvB,EAAeY,GAAyB;AAC7C,SAAI,OAAOA,KAAU,WAAiBoG,EAAgBpG,CAAK,IACvD,MAAM,QAAQA,CAAK,IAAUA,EAAM,IAAIZ,CAAc,IACpDiF,EAASrE,CAAK,IACZ,OAAO,YAAY,OAAO,KAAKA,CAAK,EAAE,KAAA,EAAO,QAAQ,CAACiE,MAAQ;AACjE,UAAMX,IAAQlE,EAAeY,EAAMiE,CAAG,CAAC;AACvC,WAAOX,MAAU,SAAY,CAAA,IAAK,CAAC,CAACW,GAAKX,CAAK,CAAC;AAAA,EACnD,CAAC,CAAC,IAJ2BtD;AAKjC;AAEA,SAASuD,EAAYvD,GAAkG;AACnH,SAAO,EAAC,GAAGoG,EAAgBpG,EAAM,CAAC,GAAG,GAAGoG,EAAgBpG,EAAM,CAAC,GAAG,GAAGoG,EAAgBpG,EAAM,CAAC,EAAA;AAChG;AAEA,SAASoG,EAAgBpG,GAA8B;AACnD,MAAI,CAAC,OAAO,SAASA,CAAK,EAAG,QAAO;AACpC,QAAMwG,IAAU,KAAK,MAAMxG,IAAQ,GAAS,IAAI;AAChD,SAAO,OAAO,GAAGwG,GAAS,EAAE,IAAI,IAAIA;AACxC;AAEA,SAASlB,EAAatF,GAAgByG,GAA8B;AAChE,SAAI,CAAC,MAAM,QAAQzG,CAAK,KAAKA,EAAM,KAAK,CAACqG,MAAS,OAAOA,KAAS,QAAQ,IAAUI,IAC7EzG,EAAM,IAAI,CAACqG,MAASD,EAAgBC,CAAI,KAAK,CAAC;AACzD;AAEA,SAAS7F,GAAgCR,GAAa;AAClD,QAAM0G,IAAO,OAAO,mBAAoB,aAAa,gBAAgB1G,CAAK,IAAI,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,GACxG2G,IAAS,CAACL,MAA6B;AACzC,QAAI,GAACA,KAAa,OAAOA,KAAc,YAAY,OAAO,SAASA,CAAS,IAC5E;AAAA,iBAAWhD,KAAS,OAAO,OAAOgD,CAAS,KAAUhD,CAAK;AAC1D,aAAO,OAAOgD,CAAS;AAAA;AAAA,EAC3B;AACA,SAAAK,EAAOD,CAAI,GACJA;AACX;AAEA,SAASvJ,EAAUtB,GAAoC+K,GAAuC;AAC1F,EAAI/K,EAAO,KAAK,CAACyK;;AAAc,WAAAA,EAAU,SAASM,EAAM,UAAQ9H,IAAAwH,EAAU,WAAV,gBAAAxH,EAAkB,YAASoD,IAAA0E,EAAM,WAAN,gBAAA1E,EAAc,SAClGoE,EAAU,SAASM,EAAM;AAAA,GAAI,KACpC/K,EAAO,KAAK+K,CAAK;AACrB;AAEA,SAASxJ,EAAeZ,GAAiD;AACrE,SAAO,EAAC,MAAMA,EAAO,MAAM,MAAMA,EAAO,QAAQ,YAAA;AACpD;AAEA,SAASG,EAAaH,GAA4B;AAC9C,QAAM8J,IAAY9J;AAClB,SAAO,GAAQ8J,EAAU,UAAUA,EAAU,UAAUA,EAAU,YAAYA,EAAU;AAC3F;AAEA,SAASzJ,GAAaL,GAA4B;;AAC9C,WAAOsC,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB,gBAAe,MAAS,CAACtC,EAAO;AAC5D;AAEA,SAASI,GAAqBJ,GAAmByE,GAA+B;AAC5E,WAAS4F,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ,QAA4B;AAChG,QAAI,CAACA,EAAQ,QAAS,QAAO;AAC7B,QAAIA,MAAY5F,EAAW,QAAO;AAAA,EACtC;AACA,SAAO;AACX;AAEA,SAASzC,GAAShC,GAAmBsK,GAA8B;AAC/D,WAASD,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIA,MAAYC,EAAU,QAAO;AAErC,SAAO;AACX;AAEA,SAASrI,GAAejC,GAAmBZ,GAA2B;AAClE,MAAIY,MAAWZ,EAAM,cAAcY,MAAWZ,EAAM,cAAe,QAAO;AAC1E,WAASiL,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIA,EAAQ,SAAU,QAAO;AAEjC,SAAO;AACX;AAEA,SAASlI,GAAmBnC,GAA0C;AAClE,WAASqK,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIjI,EAAyBiI,CAAO,EAAG,QAAOA;AAGtD;AAEA,SAAStI,EAAmB/B,GAAmBuK,GAAqC;AAChF,WAASF,IAAUrK,EAAO,QAA4BqK,GAASA,IAAUA,EAAQ;AAC7E,QAAIE,EAAW,IAAIF,CAAO,EAAG,QAAO;AAExC,SAAO;AACX;AAEA,SAAStE,GAAoB/F,GAA4B;;AACrD,WAASqK,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,SAAI/H,IAAApC,EAAqBmK,CAAO,MAA5B,QAAA/H,EAA+B,kBAAmB,QAAO;AAEjE,SAAO;AACX;AAEA,SAAS9B,EAAagD,GAAmD;AACrE,SAAO,OAAO,SAASA,EAAM,CAAC,KAAK,OAAO,SAASA,EAAM,CAAC,KAAK,OAAO,SAASA,EAAM,CAAC;AAC1F;AAEA,SAASqD,GAAa7G,GAA2B;AAC7C,QAAM8J,IAAY9J;AAClB,SAAI8J,EAAU,SAAe,SACzBA,EAAU,WAAiB,WAC3BA,EAAU,UAAgB,UACvB9J,EAAO,SAAS,SAAS,UAAUA,EAAO;AACrD;AAEA,SAAS2H,EAAYsB,GAAeC,GAAwB;AACxD,SAAO,KAAK,UAAUD,CAAI,EAAE,cAAc,KAAK,UAAUC,CAAK,CAAC;AACnE;AAEA,SAASK,EAAc/F,GAAuB;AAC1C,SAAOA,EAAM,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AACxD;AAEA,SAASa,GAAaD,GAAwB;AAC1C,SAAOA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAChE;AAEA,SAASyD,EAASrE,GAAkD;AAChE,SAAO,EAAQA,KAAU,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC9E;"}
@@ -0,0 +1,2 @@
1
+ import { ProjectConfigSettings } from './runtime/projectFormat.ts';
2
+ export declare const emptyProjectSettings: ProjectConfigSettings;
@@ -0,0 +1,5 @@
1
+ export type Kite3dFileType = 'plugin' | 'script' | 'material' | 'image';
2
+ export declare const typesExts: Partial<Record<Kite3dFileType, string[]>>;
3
+ export declare const mimeToExt: Record<string, string>;
4
+ export declare const extensionMimeTypes: Record<string, string>;
5
+ export declare function mimeTypeForPath(path: string): string;