ldr 0.30.0 → 0.31.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/README.md +16 -14
- package/dist/cli.js +11 -11
- package/dist/cull.d.ts +2 -1
- package/dist/index.js +33 -19
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/node/index.js +41 -27
- package/dist/parts-cdn.d.ts +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Render 100,000-brick LEGO® (LDraw) models in three.js at interactive frame rates.**
|
|
4
4
|
|
|
5
|
-
`ldr` compiles the parts a model uses into a compact binary **parts pack** ahead of time. At runtime it draws them with GPU instancing, hidden-stud and underside culling, distance LOD (simplified meshes, sub-pixel studs dropped, per-cluster frustum culling), single-sided (BFC) faces and indexed edge lines. On an Apple M4 Pro that takes
|
|
5
|
+
`ldr` compiles the parts a model uses into a compact binary **parts pack** ahead of time. At runtime it draws them with GPU instancing, hidden-stud and underside culling, distance LOD (simplified meshes, sub-pixel studs dropped, per-cluster frustum culling), single-sided (BFC) faces and indexed edge lines. On an Apple M4 Pro that takes a fleet of 75 UCS Millennium Falcons (394,950 bricks) from 205 ms to 29 ms per frame, and its load time from 2.4 s to 1.0 s.
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/ldr) · MIT · ESM + TypeScript · `three` is a peer dependency
|
|
8
8
|
- **Spec-compliant LDraw reader:** `.ldr`, `.mpd` and `.dat`, including MPD-embedded parts, geometry drawn directly in models, BFC, `STEP`/`ROTSTEP`, `!TEXMAP` and `!DATA`.
|
|
@@ -178,29 +178,31 @@ All numbers below were measured with the harness in [`bench/`](https://github.co
|
|
|
178
178
|
- **Hardware and browser:** Apple **M4 Pro** MacBook Pro, Chrome with native GL (ANGLE → Metal), Bun 1.3.
|
|
179
179
|
- **Frame time:** the **median synced frame time** (`gl.finish` per frame) while orbiting the camera.
|
|
180
180
|
- **Load:** from fetch to the first rendered frame.
|
|
181
|
-
- **Baseline:** three.js geometry from `LDrawLoader` merged per part and drawn with `InstancedMesh`, which is the fastest stock approach. Stock `LDrawLoader` scenes crash the tab (OOM) at 50k bricks and above
|
|
181
|
+
- **Baseline:** three.js geometry from `LDrawLoader` merged per part and drawn with `InstancedMesh`, which is the fastest stock approach. Stock `LDrawLoader` scenes crash the tab (OOM) at 50k bricks and above.
|
|
182
182
|
- **ldr settings:** the defaults: LOD pack, distance LOD, low-detail studs, stud and underside culling, single-sided faces, no edges.
|
|
183
183
|
|
|
184
|
-
Sources: `bench/results/latest-perf.md` (the regression gate, `bench/baselines/darwin-apple-m4-pro.json`), `latest-mac-ablation.md`, and `research.md` §7 and Round 19.
|
|
184
|
+
Sources: `bench/results/2026-10-18T18-10-46-518Z-falcon-vs-stock.md` (the Falcon rows), `bench/results/latest-perf.md` (the regression gate, `bench/baselines/darwin-apple-m4-pro.json`), `latest-mac-ablation.md`, and `research.md` §7 and Round 19.
|
|
185
185
|
|
|
186
186
|
| model | bricks | baseline frame | **ldr frame** | baseline load | **ldr load** |
|
|
187
187
|
|---|---|---|---|---|---|
|
|
188
188
|
| synthetic grid | 100,021 | 24.4 ms | **2.7 ms** | 0.2 s | 0.3 s |
|
|
189
|
-
|
|
|
190
|
-
|
|
|
191
|
-
|
|
|
189
|
+
| Millennium Falcon ×2 | 10,532 | 8.0 ms | 8.2 ms | 1.98 s | **0.14 s** |
|
|
190
|
+
| Millennium Falcon ×19 | 100,054 | 54.2 ms | **19.6 ms** | 2.04 s | **0.38 s** |
|
|
191
|
+
| Millennium Falcon ×75 | 394,950 | 204.7 ms | **29.2 ms** | 2.40 s | **1.03 s** |
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
The benchmark model is a fleet: the LDraw OMR model of set 10179 (UCS Millennium Falcon, 5,266 parts, 251 unique) placed 2, 19 or 75 times on a grid (`apps/demo-site/scripts/build-fleet.ts`). It is a hard case for ldr: dense, detailed ships stay large on screen, so distance LOD can't drop much and the overview still draws ~32M triangles; on two ships ldr only matches stock instancing per frame (it still loads 14× faster). Datsville, the benchmark until Round 60 (a flat town, 392,514 bricks, mostly baseplates), went from 409.6 to 12.5 ms per frame and 24.7 to 1.6 s load.
|
|
194
194
|
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
How much each optimization contributed on Datsville 100k (Rounds 1–20, before the Falcon fleets), in ms per frame: welding 108.1 → 64.6, stud culling → 50.8, underside culling → 41.7, low-detail studs → 31.0, single-sided faces → 30.1. Triangles per frame drop from 142.7M to 59.1M. Distance LOD (Rounds 19–20: simplified and bounding-box levels with a silhouette-coverage error, sub-pixel studs dropped, undersides skipped where they can't be seen) then takes it to 4.4 ms and 4.0M triangles; ≤ 1.5% of pixels differ from full detail (mostly sub-pixel stud moiré).
|
|
196
|
+
|
|
197
|
+
- **Pack size:** the Falcon fleet (251 unique parts) is 24.5 MB raw and **1.65 MB zstd** with LOD meshes, at any number of ships. Decoding a zstd pack in the browser (fzstd) takes about **60 ms**.
|
|
198
|
+
- **Stock `LDrawLoader`:** loading the scene directly crashes the renderer (OOM) on the 50k, 100k and 250k grids (and on Datsville 10k). The 10k grid loads in 6.6 s and draws at 61.5 ms per frame (29,671 draw calls), against 0.15 s and 2.2 ms with ldr + edges.
|
|
197
199
|
- **Original demo app** (retired; rAF frame median at 2880×1800 on the M4 Pro):
|
|
198
200
|
- These comparisons are between demo settings. "Before" has every effect on (shadows, AO, screen-space edges, PBR/IBL); "after" is the demo's big-model defaults, which turn those effects off above 50k bricks.
|
|
199
201
|
- Full Datsville: **1.7 → 9.9 fps**.
|
|
200
202
|
- Datsville 100k: **8 → 43.5 fps**.
|
|
201
|
-
- **Conditional lines** (opt-in `cond` packs) cost **+12–14 %** frame time on Datsville 10k and 100k (M4 Pro), and add 7–14 % to the zstd pack size.
|
|
202
|
-
- **Edges:** with LOD, edges
|
|
203
|
-
- **Build steps:** `setStep` takes
|
|
203
|
+
- **Conditional lines** (opt-in `cond` packs) cost **+12–14 %** frame time on Datsville 10k and 100k (M4 Pro, before Round 60), and add 7–14 % to the zstd pack size.
|
|
204
|
+
- **Edges:** with LOD, edges take the Falcon fleet from 19.8 → 42.2 ms (19 ships) and 29.4 → 56.3 ms (75 ships). Each cluster draws only edge segments at least 0.15 px long (`lodEdgeMinPx`) and none where bricks are sub-pixel (`lodEdgePx`), which saves little on ships that fill the screen. Far views drawn with edges get lighter (≤ 4.7% of pixels on Datsville overviews, 0.27% on the fleet); `lodEdgeMinPx: 0, lodEdgePx: 0` keeps every edge.
|
|
205
|
+
- **Build steps:** `setStep` takes 39 ms on the 19-ship fleet (26,619 steps); on Datsville 100k it went from a full rebuild (752 ms) to 66 ms.
|
|
204
206
|
- **Visual fidelity:** pixel diffs show culling and single-sided faces are lossless (≤ 0.009 % of pixels differ). Low-detail studs only change stud silhouettes.
|
|
205
207
|
|
|
206
208
|
Reproduce: `cd bench && bun run setup && bun run perf` (regression gate) or `bun run bench` (see [`bench/README.md`](https://github.com/EvanBacon/ldr/blob/main/bench/README.md)).
|
|
@@ -221,7 +223,7 @@ Reproduce: `cd bench && bun run setup && bun run perf` (regression gate) or `bun
|
|
|
221
223
|
## Limitations
|
|
222
224
|
|
|
223
225
|
- **Finishes:** `!COLOUR` CHROME / PEARLESCENT / RUBBER / METAL / MATTE_METALLIC map to MeshStandard/Physical PBR (same numbers as three.js `LDrawLoader`). MATERIAL GLITTER / SPECKLE use a procedural grain approximation; FABRIC uses sheen. ALPHA sets opacity; LUMINANCE drives emissive.
|
|
224
|
-
- **Transparency:** transparent colours (`ALPHA < 255`) render with opacity and `depthWrite: false` (one material bucket per finish × opacity class).
|
|
226
|
+
- **Transparency:** transparent colours (`ALPHA < 255`) render with their opacity and `depthWrite: false` (one material bucket per finish × opacity class), from `ldr pack` packs and, since 0.31, from the parts CDN (`loadModel`), whose index now carries the colour materials. Studs and undersides behind a transparent part are never culled. Transparent batches are sorted per batch (InstancedMesh), not per instance or triangle, so overlapping transparent parts can blend in the wrong order.
|
|
225
227
|
- **Opt-in pack features:** conditional lines need packs built with `cond`. Printed parts show their images only from `textures` packs (the embedded PNGs dominate the pack size); default packs draw the FALLBACK geometry.
|
|
226
228
|
- **ROTSTEP** is reported (`stepViews`, `instance.view`), not applied; `planStepViews` takes a `fixed(step)` override if you want to honour it.
|
|
227
229
|
- **Packs are static:** they hold only the parts they were built for. A model that uses parts missing from the pack lists them in `stats.missing`.
|
|
@@ -232,5 +234,5 @@ Reproduce: `cd bench && bun run setup && bun run perf` (regression gate) or `bun
|
|
|
232
234
|
|
|
233
235
|
- **Code:** MIT © Evan Bacon.
|
|
234
236
|
- **LDraw parts:** packs you build contain geometry from the **LDraw.org Parts Library**, which is licensed **CC BY 2.0** (newer files CC BY 4.0, per file header). If you ship packs, credit "LDraw.org Parts Library (CC BY 2.0)" in your app. See <https://www.ldraw.org/legal-info>.
|
|
235
|
-
- **
|
|
237
|
+
- **Millennium Falcon:** the benchmark fleets place the [LDraw OMR model of set 10179](https://library.ldraw.org/omr/sets/320) by Roland Dahl [RolandD] (CC BY 2.0) N times.
|
|
236
238
|
- **Trademarks:** LEGO® is a trademark of the LEGO Group, which does not sponsor, authorize or endorse this project; ldr is not affiliated with the LEGO Group. LDraw™ is a trademark of the Estate of James Jessiman.
|
package/dist/cli.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cli.ts
|
|
4
4
|
import fs4 from "node:fs";
|
|
5
5
|
import zlib from "node:zlib";
|
|
6
6
|
|
|
7
|
-
// ../../../../../../../tmp/ldr-build-
|
|
7
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/build-pack.ts
|
|
8
8
|
import fs3 from "node:fs";
|
|
9
9
|
import path3 from "node:path";
|
|
10
10
|
|
|
11
|
-
// ../../../../../../../tmp/ldr-build-
|
|
11
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/resolver.ts
|
|
12
12
|
import fs from "node:fs";
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
|
|
15
|
-
// ../../../../../../../tmp/ldr-build-
|
|
15
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/spec.ts
|
|
16
16
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
17
17
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
18
18
|
var namedCodes = new Map;
|
|
@@ -723,7 +723,7 @@ function fileStepViews(f) {
|
|
|
723
723
|
return out;
|
|
724
724
|
}
|
|
725
725
|
|
|
726
|
-
// ../../../../../../../tmp/ldr-build-
|
|
726
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/model.ts
|
|
727
727
|
var CALLOUT_END = 999999;
|
|
728
728
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
729
729
|
var defLine = new WeakMap;
|
|
@@ -1138,7 +1138,7 @@ function blendedColourHex(code) {
|
|
|
1138
1138
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1139
1139
|
}
|
|
1140
1140
|
|
|
1141
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1141
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/resolver.ts
|
|
1142
1142
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
1143
1143
|
var UNDER_STUD_RE = /^(stud3|stud3a|stud4.*|stud12|stud16.*|stud18a)\.dat$/i;
|
|
1144
1144
|
var norm2 = (ref) => ref.trim().replace(/\\/g, "/").toLowerCase();
|
|
@@ -1465,11 +1465,11 @@ function collectDeps(lib, refs) {
|
|
|
1465
1465
|
return out;
|
|
1466
1466
|
}
|
|
1467
1467
|
|
|
1468
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1468
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/compile.ts
|
|
1469
1469
|
import fs2 from "node:fs";
|
|
1470
1470
|
import path2 from "node:path";
|
|
1471
1471
|
|
|
1472
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1472
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/lod.ts
|
|
1473
1473
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
1474
1474
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
1475
1475
|
function reorderMesh(P, N, C, I) {
|
|
@@ -1661,7 +1661,7 @@ function lodChain(P, C, I) {
|
|
|
1661
1661
|
return out;
|
|
1662
1662
|
}
|
|
1663
1663
|
|
|
1664
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1664
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/compile.ts
|
|
1665
1665
|
function loadColors(root) {
|
|
1666
1666
|
const map = new Map;
|
|
1667
1667
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -2376,7 +2376,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
2376
2376
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
2377
2377
|
}
|
|
2378
2378
|
|
|
2379
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2379
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/build-pack.ts
|
|
2380
2380
|
function packCompilerOpts(o) {
|
|
2381
2381
|
return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures };
|
|
2382
2382
|
}
|
|
@@ -2449,7 +2449,7 @@ function buildPack(o) {
|
|
|
2449
2449
|
return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
|
|
2450
2450
|
}
|
|
2451
2451
|
|
|
2452
|
-
// ../../../../../../../tmp/ldr-build-
|
|
2452
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cli.ts
|
|
2453
2453
|
var HELP = `ldr pack — build a parts pack for the ldr three.js renderer
|
|
2454
2454
|
|
|
2455
2455
|
Usage:
|
package/dist/cull.d.ts
CHANGED
|
@@ -51,7 +51,8 @@ export type CullResult = {
|
|
|
51
51
|
export declare const STEP_NEVER = 2147483647;
|
|
52
52
|
/** Visit every stud (instance order, then part stud order) with its world matrix `w` (scratch; copy to keep). */
|
|
53
53
|
export declare function forEachStud(insts: Inst[], H: any, fn: (j: number, inst: number, w: Float64Array, kind: string, color: string, stud: number) => void): void;
|
|
54
|
-
/** `steps` (optional, per instance): also compute when each stud / underside becomes hidden as the model is built step by step.
|
|
54
|
+
/** `steps` (optional, per instance): also compute when each stud / underside becomes hidden as the model is built step by step.
|
|
55
|
+
* Transparent instances hide nothing (studs inside their hollow stay visible through them) and keep their own undersides. */
|
|
55
56
|
export declare function cullCore(insts: Inst[], H: any, steps?: ArrayLike<number>): CullResult;
|
|
56
57
|
/** Scene instances and per-instance step ranks as `createLdrObject` builds them (shared with the load worker). */
|
|
57
58
|
export declare function sceneInstances(instances: PartInstance[], H: any, useTex: boolean): {
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
4
4
|
var namedCodes = new Map;
|
|
@@ -707,7 +707,7 @@ function fileStepViews(f) {
|
|
|
707
707
|
viewMemo.set(f, out);
|
|
708
708
|
return out;
|
|
709
709
|
}
|
|
710
|
-
// ../../../../../../../tmp/ldr-build-
|
|
710
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/model.ts
|
|
711
711
|
var CALLOUT_END = 999999;
|
|
712
712
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
713
713
|
var defLine = new WeakMap;
|
|
@@ -1121,7 +1121,7 @@ function blendedColourHex(code) {
|
|
|
1121
1121
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1122
1122
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1123
1123
|
}
|
|
1124
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1124
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/instructions.ts
|
|
1125
1125
|
var MIN_VIS = 0.5;
|
|
1126
1126
|
var REORIENT = 0.35;
|
|
1127
1127
|
var deg = Math.PI / 180;
|
|
@@ -1489,10 +1489,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1489
1489
|
}
|
|
1490
1490
|
};
|
|
1491
1491
|
}
|
|
1492
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1492
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1493
1493
|
import * as THREE from "three";
|
|
1494
1494
|
|
|
1495
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1495
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/pack-io.ts
|
|
1496
1496
|
import { decompress } from "fzstd";
|
|
1497
1497
|
async function decompressPack(data) {
|
|
1498
1498
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1515,7 +1515,7 @@ function decodePack(buf) {
|
|
|
1515
1515
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1516
1516
|
}
|
|
1517
1517
|
|
|
1518
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1518
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cull.ts
|
|
1519
1519
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1520
1520
|
var prepCache = new WeakMap;
|
|
1521
1521
|
function prepPart(H, part) {
|
|
@@ -1655,8 +1655,21 @@ function forEachStud(insts, H, fn) {
|
|
|
1655
1655
|
}
|
|
1656
1656
|
}
|
|
1657
1657
|
}
|
|
1658
|
+
function seeThrough(H, c) {
|
|
1659
|
+
const g = H.colorTable?.[c];
|
|
1660
|
+
if (g)
|
|
1661
|
+
return (g.alpha ?? 255) < 255;
|
|
1662
|
+
return c.charCodeAt(0) === 35 && /\/[^:/]*:a\d/.test(c);
|
|
1663
|
+
}
|
|
1658
1664
|
function cullCore(insts, H, steps) {
|
|
1659
1665
|
const CELL = 40;
|
|
1666
|
+
const clear = new Map;
|
|
1667
|
+
const isClear = (c) => {
|
|
1668
|
+
let v = clear.get(c);
|
|
1669
|
+
if (v === undefined)
|
|
1670
|
+
clear.set(c, v = seeThrough(H, c));
|
|
1671
|
+
return v;
|
|
1672
|
+
};
|
|
1660
1673
|
const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rPrep = [], rBx = [], rBz = [];
|
|
1661
1674
|
const cells = new Int3Table(insts.length * 2);
|
|
1662
1675
|
const nextE = [], rectE = [];
|
|
@@ -1664,7 +1677,7 @@ function cullCore(insts, H, steps) {
|
|
|
1664
1677
|
const it = insts[idx];
|
|
1665
1678
|
const m = it.m;
|
|
1666
1679
|
const p = H.parts[it.part];
|
|
1667
|
-
if (!p || !p.mask || !upright(m))
|
|
1680
|
+
if (!p || !p.mask || !upright(m) || isClear(it.color))
|
|
1668
1681
|
continue;
|
|
1669
1682
|
const b = p.bbox;
|
|
1670
1683
|
let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity;
|
|
@@ -1790,7 +1803,7 @@ function cullCore(insts, H, steps) {
|
|
|
1790
1803
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
1791
1804
|
const it = insts[idx];
|
|
1792
1805
|
const p = H.parts[it.part];
|
|
1793
|
-
if (!p || !p.under || !upright(it.m))
|
|
1806
|
+
if (!p || !p.under || !upright(it.m) || isClear(it.color))
|
|
1794
1807
|
continue;
|
|
1795
1808
|
const b = p.bbox;
|
|
1796
1809
|
const nx = Math.round((b[3] - b[0]) / 20), nz = Math.round((b[5] - b[2]) / 20);
|
|
@@ -1850,7 +1863,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1850
1863
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1851
1864
|
}
|
|
1852
1865
|
|
|
1853
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1866
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1854
1867
|
async function loadPack(url) {
|
|
1855
1868
|
const res = await fetch(url);
|
|
1856
1869
|
if (!res.ok)
|
|
@@ -3704,7 +3717,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3704
3717
|
await new Promise((r) => setTimeout(r, 0));
|
|
3705
3718
|
}
|
|
3706
3719
|
}
|
|
3707
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3720
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/scene.ts
|
|
3708
3721
|
import * as THREE2 from "three";
|
|
3709
3722
|
function ghostMaterial(side, g) {
|
|
3710
3723
|
const m = new THREE2.MeshStandardMaterial({ color: 16777215, roughness: 0.85, metalness: 0, side, transparent: false, depthWrite: true, opacity: g.opacity });
|
|
@@ -4048,10 +4061,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4048
4061
|
return finish();
|
|
4049
4062
|
})();
|
|
4050
4063
|
}
|
|
4051
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4064
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4052
4065
|
import { decompress as decompress2 } from "fzstd";
|
|
4053
4066
|
|
|
4054
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4067
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/embedded.ts
|
|
4055
4068
|
function splitFiles(text, fallback) {
|
|
4056
4069
|
const files = new Map;
|
|
4057
4070
|
let cur = null, saw = false;
|
|
@@ -4123,7 +4136,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
4123
4136
|
return out;
|
|
4124
4137
|
}
|
|
4125
4138
|
|
|
4126
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4139
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4127
4140
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
4128
4141
|
var indexCache = new Map;
|
|
4129
4142
|
var shardCache = new Map;
|
|
@@ -4252,11 +4265,12 @@ async function loadPartsOnce(names, o) {
|
|
|
4252
4265
|
};
|
|
4253
4266
|
await Promise.all(Array.from({ length: Math.min(o.concurrency ?? 24, groups.length) }, worker));
|
|
4254
4267
|
const shards = want.filter((n) => shardCache.has(cdn + n)).map((n) => shardCache.get(cdn + n));
|
|
4255
|
-
const
|
|
4268
|
+
const extra = { colors: idx.colors, ...idx.colorTable ? { colorTable: idx.colorTable } : {} };
|
|
4269
|
+
const pack = shards.length ? mergePacks(shards, extra) : decodePack(emptyPack(extra));
|
|
4256
4270
|
return { pack, missing, requests, bytes };
|
|
4257
4271
|
}
|
|
4258
|
-
function emptyPack(
|
|
4259
|
-
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {},
|
|
4272
|
+
function emptyPack(extra) {
|
|
4273
|
+
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {}, ...extra }));
|
|
4260
4274
|
const pad = (4 - (4 + h.length) % 4) % 4;
|
|
4261
4275
|
const b = new Uint8Array(4 + h.length + pad).fill(32);
|
|
4262
4276
|
new DataView(b.buffer).setUint32(0, h.length + pad, true);
|
|
@@ -4376,10 +4390,10 @@ async function prepareModel(source, o = {}) {
|
|
|
4376
4390
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
4377
4391
|
}
|
|
4378
4392
|
|
|
4379
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4380
|
-
var load_worker_gen_default = 'var St=ArrayBuffer,Y=Uint8Array,ge=Uint16Array,Et=Int16Array;var de=Int32Array,Se=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Pt=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var kt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],J=function(e,t,n){var r=Error(t||kt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,J);if(!n)throw r;return r},Xe=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},It=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Bt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)J(0);var u=6-s,c=i==3?4:i,f=Xe(e,u,c);u+=c;var a=l?1<<l:s,p=Xe(e,u,a)+(l==1&&256),d=p;if(!s){var x=1<<10+(e[5]>>3);d=x+(x>>3)*(e[5]&7)}if(d>2145386496)J(1);var y=new Y((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new de(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return It(e,4)+8;J(0)},se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)J(3);var o=1<<s,i=o,l=-1,u=-1,c=-1,f=o,a=new St(512+(o<<2)),p=new Et(a,0,256),d=new ge(a,0,256),x=new ge(a,512,o),y=512+(o<<1),S=new Y(a,y,o),h=new Y(a,y+o);while(l<255&&i>0){var g=se(i+1),b=r>>3,C=(1<<g+1)-1,R=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&C,M=(1<<g)-1,L=C-i-1,T=R&M;if(T<L)r+=g,R=T;else if(r+=g+1,R>M)R-=L;if(p[++l]=--R,R==-1)i+=R,S[--f]=l;else i-=R;if(!R)do{var k=r>>3;u=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=u}while(u==3)}if(l>255||i)J(0);var m=0,P=(o>>1)+(o>>3)+3,V=o-1;for(var N=0;N<=l;++N){var v=p[N];if(v<1){d[N]=-v;continue}for(c=0;c<v;++c){S[m]=N;do m=m+P&V;while(m>=f)}}if(m)J(0);for(c=0;c<o;++c){var A=d[S[c]]++,I=h[c]=s-se(A);x[c]=(A<<I)-o}return[r+7>>3,{b:s,s:S,n:h,t:x}]},Ft=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),u=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],a=c[1];t+=o;var p=f<<3,d=e[t];if(!d)J(0);var x=0,y=0,S=a.b,h=S,g=(++t<<3)-8+se(d);for(;;){if(g-=S,g<p)break;var b=g>>3;if(x+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=a.s[x],g-=h,g<p)break;b=g>>3,y+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<h)-1,i[++r]=a.s[y],S=a.n[x],x=a.t[x],h=a.n[y],y=a.t[y]}if(++r>255)J(0)}else{r=o-127;for(;n<r;n+=2){var C=e[++t];i[n]=C>>4,i[n+1]=C&15}++t}var R=0;for(n=0;n<r;++n){var M=i[n];if(M>11)J(0);R+=M&&1<<M-1}var L=se(R)+1,T=1<<L,k=T-R;if(k&k-1)J(0);i[r++]=se(k)+1;for(n=0;n<r;++n){var M=i[n];++l[i[n]=M&&L+1-M]}var m=new Y(T<<1),P=m.subarray(0,T),V=m.subarray(T);u[L]=0;for(n=L;n>0;--n){var N=u[n];ce(V,n,N,u[n-1]=N+l[n]*(1<<L-n))}if(u[0]!=T)J(0);for(n=0;n<r;++n){var v=i[n];if(v){var A=u[v];ce(P,n,A,u[v]=A+(1<<L-v))}}return[t,{n:V,b:L,s:P}]},Rt=ue(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Dt=ue(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Ut=ue(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ze=function(e,t){var n=e.length,r=new de(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new Y(new de([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ot=Ze(Ee,0),Pe=new Y(new de([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Nt=Ze(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)J(0);var u=0,c=n.b,f=(r<<3)-8+se(o)-c,a=-1;for(;f>l&&a<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++a]=n.s[u],f-=c=n.n[u]}if(f!=l||a+1!=s)J(0)},zt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},$t=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new Y(l),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=l,n;return Se(e,s,u)}if(i==2){var c=e[s],f=c&3,a=c>>2&3,p=c>>4,d=0,x=0;if(f<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(x=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Y(t.m),S=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),S);else if(f==1)ce(y,e[s++],S);else{var h=t.h;if(f==2){var g=Ft(e,s);d+=s-(s=g[0]),t.h=h=g[1]}else if(!h)J(0);(x?zt:le)(e.subarray(s,s+=d),y.subarray(S),h)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var C=e[s++];if(C&3)J(0);var R=[Dt,Ut,Rt];for(var M=2;M>-1;--M){var L=C>>(M<<1)+2&3;if(L==1){var T=new Y([0,0,e[s++]]);R[M]={s:T.subarray(2,3),n:T.subarray(0,1),t:new ge(T.buffer,0,1),b:0}}else if(L==2)r=ue(e,s,9-(M&1)),s=r[0],R[M]=r[1];else if(L==3){if(!t.t)J(0);R[M]=t.t[M]}}var k=t.t=R,m=k[0],P=k[1],V=k[2],N=e[u-1];if(!N)J(0);var v=(u<<3)-8+se(N)-V.b,A=v>>3,I=0,W=(e[A]|e[A+1]<<8)>>(v&7)&(1<<V.b)-1;A=(v-=P.b)>>3;var B=(e[A]|e[A+1]<<8)>>(v&7)&(1<<P.b)-1;A=(v-=m.b)>>3;var z=(e[A]|e[A+1]<<8)>>(v&7)&(1<<m.b)-1;for(++b;--b;){var _=V.s[W],Z=V.n[W],X=m.s[z],E=m.n[z],w=P.s[B],D=P.n[B];A=(v-=w)>>3;var U=1<<w,O=U+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(v&7)&U-1);A=(v-=Pe[X])>>3;var G=Nt[X]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Pe[X])-1);A=(v-=Ee[_])>>3;var j=Ot[_]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Ee[_])-1);if(A=(v-=Z)>>3,W=V.t[W]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<Z)-1),A=(v-=E)>>3,z=m.t[z]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<E)-1),A=(v-=D)>>3,B=P.t[B]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<D)-1),O>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=O-=3;else{var H=O-(j!=0);if(H){if(O=H==3?t.o[0]-1:t.o[H],H>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=O}else O=t.o[0]}for(var M=0;M<j;++M)y[I+M]=y[S+M];I+=j,S+=j;var K=I-O;if(K<0){var F=-K,q=t.e+K;if(F>G)F=G;for(var M=0;M<F;++M)y[I+M]=t.w[q+M];I+=F,G-=F,K=0}for(var M=0;M<G;++M)y[I+M]=y[K+M];I+=G}if(I!=S)while(S<y.length)y[I++]=y[S++];else I=y.length;if(n)t.y+=I;else y=Se(y,0,I)}else if(n){if(t.y+=p,S)for(var M=0;M<p;++M)y[M]=y[S+M]}else if(S)y=Se(y,S);return t.b=u,y}J(2)},jt=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function be(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Bt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=$t(e,i,t);if(!l)J(5);if(t)i.e=i.y;else n.push(l),o+=l.length,Pt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return jt(n,o)}async function Vt(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(be(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Ye(e){return new TextDecoder().decode(await Vt(e))}var qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Ie=/^[A-Za-z][A-Za-z0-9_]*$/,ke=new Map;function Be(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!ke.has(r))ke.set(r,t);return r}function Fe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Ie.test(e))return Be(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Je=/^~?\\s*moved\\s+to\\s+(.+)$/i,_t=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),it=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Ht=new Set(["model","submodel","configuration"]),Gt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Qe(e){let t=Gt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return it.has(n)||Ht.has(n)?n:void 0}function Wt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Kt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let u=Wt(l);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Xt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Zt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),u=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Fe(o),m:i,file:Q(u)}}function et(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Fe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function at(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,u=null,c=[],f=null,a=()=>{if(!u)return;let g=Xt(u.chunks.join("")),b=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Q(u.name),{name:u.name,bytes:g,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(g)=>{if(a(),o={name:Q(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},x=!1,y=!1,S=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},h=(g,b)=>{if(f){g.tex=f,f=null;return}let C=c[c.length-1];if(!C)return;if(C.fallback){if(!b)g.fallback=!0}else g.tex=C.map};for(let g of e.split(`\n`)){let b=g.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||x)continue;if(!o)d(t);let L=b.slice(2).trimStart(),T=L.search(/\\s/),k={t:b.charCodeAt(0)-48,color:Fe(T<0?L:L.slice(0,T)),p:[],src:b};h(k,!1),o.cmds.push(k),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let L=2;while(b.charCodeAt(L)===32||b.charCodeAt(L)===9)L++;let T=L;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let k=b.slice(L,T);if(!_t.has(k)){if(x||u)continue;if(!o)d(t);let m=b.slice(L),P={t:0,text:m};if(k.charCodeAt(0)===33)P.meta=k;if(f=null,p&&!o.org){let N=Qe(m);if(N)o.org=N}let V=m.match(Je);if(V&&!o.movedTo){let N=V[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(N))N+=".dat";o.movedTo=Q(N)}o.cmds.push(P);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!x){let L=Zt(b);if(L){if(!o)d(t);h(L,!1),o.cmds.push(L),p=!1;continue}}let C=b.split(/\\s+/);if(+C[0]===0){let L=b.slice(1).trim();if(C[1]==="FILE"){S(),x=!1,d(L.slice(5));continue}if(C[1]==="NOFILE"){a(),o=null,x=!0;continue}if(C[1]==="!DATA"){S(),a(),o=null,x=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(x)continue;if(u){if(C[1]==="!:")u.chunks.push(C.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:L};if(C[1]==="STEP")T.step=!0,c=[],f=null;else if(C[1]==="BFC")T.bfc=C.slice(2).join(" ");else if(C[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(C[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let m=(C[5]??"REL").toUpperCase();T.rotstep={x:+C[2]||0,y:+C[3]||0,z:+C[4]||0,mode:["REL","ABS","ADD"].includes(m)?m:"REL"}}else if(C[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let m=(C[2]??"").toUpperCase();T.bufexchg={op:m==="RETRIEVE"?"RETRIEVE":"STORE",buf:C[3]??"A"}}else if(C[1]?.startsWith("!"))T.meta=C[1];if(p&&!o.org){let m=Qe(L);if(m)o.org=m}if(C[1]==="!TEXMAP"){let m=(C[2]??"").toUpperCase();if(f=null,m==="START"||m==="NEXT"){let P=Kt(L.replace(/^!TEXMAP\\s+\\S+/i,""),m==="NEXT");if(T.texmap={op:m,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),m==="START")c.push({map:P,fallback:!1});else f=P}else if(m==="FALLBACK"){T.texmap={op:m};let P=c[c.length-1];if(P)P.fallback=!0}else if(m==="END")T.texmap={op:m},c.pop()}else if(C[1]==="!:"){f=null;let m=et(C.slice(2));if(m)h(m,!0),T.geom=m}else f=null;let k=L.match(Je);if(k&&!o.movedTo){let m=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(m))m+=".dat";o.movedTo=Q(m)}o.cmds.push(T);continue}if(u||x)continue;if(!o)d(t);let M=et(C);if(!M)continue;h(M,!1),o.cmds.push(M),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Mn=Math.PI/180;function lt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ct(e,t){let[n,r,s,o,i,l,u,c,f,a,p,d]=e,[x,y,S,h,g,b,C,R,M,L,T,k]=t;return[o*x+i*y+l*S+n,u*x+c*y+f*S+r,a*x+p*y+d*S+s,o*h+i*C+l*L,o*g+i*R+l*T,o*b+i*M+l*k,u*h+c*C+f*L,u*g+c*R+f*T,u*b+c*M+f*k,a*h+p*C+d*L,a*g+p*R+d*T,a*b+p*M+d*k]}var Re=[0,0,0,1,0,0,0,1,0,0,0,1];var tt=new WeakMap,Yt=/^(s|8|48)\\//;function De(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=tt.get(n);if(r)return r;if(n.org)r=it.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Yt.test(s.file))?"part":"model";return tt.set(n,r),r}var nt=new WeakMap;function ut(e){let t=nt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return nt.set(e,t),t}var rt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?ke.get(e)??String(e):String(e),qt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${rt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${rt(e.color)} ${e.p.join(" ")}`,Ue=(e,t)=>`${Q(e)}#${t}`;function Jt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ue(e.name,t),cmds:n}}function ft(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Jt(e,t).cmds.map(qt)].join(`\n`)+`\n`}function Oe(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function pt(e){let[t,n,r,s,o,i,l,u,c,f,a,p]=e,d=u*p-c*a,x=-(l*p-c*f),y=l*a-u*f,S=s*d+o*x+i*y;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,g=[d*h,-(o*p-i*a)*h,(o*c-i*u)*h,x*h,(s*p-i*f)*h,-(s*c-i*l)*h,y*h,-(s*a-o*f)*h,(s*u-o*l)*h];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Qt=(e)=>String(+e.toFixed(6)||0),st=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function mt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Qt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${st(t.texture)}${t.glossmap?" GLOSSMAP "+st(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${Oe(r)}`,source:r}}var en=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function tn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*u,i,o*u+s*i*c,o*c-s*i*u,-s*l,s*u-o*i*c,s*c+o*i*u,o*l]}var ot=new WeakMap;function ht(e){let t=ot.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=tn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:en(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),ot.set(e,n),n}var gt=999999,yt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",xt=new WeakMap,dt=new WeakMap;function nn(e,t){let n=dt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=xt.get(o)??"",l=i.indexOf("!COLOUR");return l<0?"":"0 "+i.slice(l).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},dt.set(t,n);let r=n.parts.get(e);if(!r){let s=Q(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${Oe(o)}`,source:o},n.parts.set(e,r)}return r}function rn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,u=0,c=(a,p)=>{let d=a.name+"#"+p,x=l.get(d);if(!x){let y;x=Object.assign(()=>y??=ft(a,p),{file:a,step:p}),l.set(d,x)}return x},f=(a,p,d,x,y,S,h,g,b=null,C=[],R=[],M=void 0,L=null)=>{let T=a.files.get(p);if(!T||h>r)return;let k=L,m=0,P=h>0?++u:0,V=i&&P?[...C,P]:C,N=i&&P?[...R,d]:R,v=i&&!b?new Map:null,A=-1,I=0,W=(E,w,D,U,O,G,j)=>{if(A!==m)A=m,I=0;let H=v?.get(m+"|"+w);if(H)return H.n++,f(E,E===a?w:E.main,D,U,y+"/"+w,[...O,gt],h+1,G,[...O,gt],V,N,j,k);let K=[...O,I++],F=n.length;f(E,E===a?w:E.main,D,U,y+"/"+w,K,h+1,G,b,V,N,j,k),v?.set(m+"|"+w,{n:1,from:F,to:n.length})},B=ht(T),z=s?ut(T):[],_=0,Z=(E,w,D,U,O,G,j,H,K)=>{if(b)U=b;let F={part:E,color:w,m:D,step:U[0],steps:U,localStep:O,path:y};if(H)F.colour=H;if(P){if(F.sub=P,i)F.subPath=V,F.subMats=N}if(G)F.embedded=!0;if(j){let ee=mt(E,j);F.texPart=ee.name,F.texSource=ee.source}else if(K){let ee=nn(E,K);F.colPart=ee.name,F.colSource=ee.source}let q=B[O];if(q)F.view=q;return n.push(F),F},X=(E)=>{while(_<z.length&&z[_]<=E){let w=z[_++];Z(Ue(T.name,w),x,d,[...S,w],w,!1,null,M,L).source=c(T,w)}};for(let E of T.cmds){if(E.t===0&&E.step){m++;continue}let w=E;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){X(m);continue}if(w.t===0){if(w.meta==="!COLOUR"){let q=on(w.text);if(q&&q.code!==16&&q.code!==24)xt.set(q,w.text),(k=new Map(k??[])).set(q.code,q);continue}if(o&&w.geom?.t===1)w=w.geom;else continue}if(w.t!==1)continue;if(o&&w.fallback)continue;let D=w.color===16?x:w.color,U=w.color===16?M:k?.get(w.color),O=ct(d,w.m),G=[...S,m],j=o?w.tex??g:null,H=j?pt(w.m):null,K=j&&H?lt(j,H):null;if(a.files.has(w.file)){if(De(a,w.file)==="model"){W(a,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!0,K,U,k);continue}let F=t.resolveModel?.(w.file);if(F){W(F,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!1,K,U,k)}if(X(1/0),v){for(let E of v.values())if(E.n>1)for(let w=E.from;w<E.to;w++)n[w].mult??=E.n}};if(De(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Re],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Re,16,e.main,[],0,null),n}function wt(e,t="main.ldr",n){return rn(at(e,t,{geometryText:!0}),n)}var sn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ne(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function bt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Ne(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function on(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,u=0,c={type:"default"},f=1;while(f<n.length){let a=n[f].toUpperCase(),p=n[f+1];if(a==="CODE")s=p!==void 0&&Ie.test(p)?Be(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(a==="VALUE"){let d=Ne(p);if(d)o=d;f+=2}else if(a==="EDGE")i=Ne(p)??p,f+=2;else if(a==="ALPHA")l=+p,f+=2;else if(a==="LUMINANCE")u=+p,f+=2;else if(a==="CHROME")c={type:"chrome"},f+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(a==="RUBBER")c={type:"rubber"},f+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(a==="METAL")c={type:"metal"},f+=1;else if(a==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:x,next:y}=bt(n,f+2);c={type:"glitter",material:x},f=y}else if(d==="SPECKLE"){let{grain:x,next:y}=bt(n,f+2);c={type:"speckle",material:x},f=y}else if(d==="FABRIC"){let x=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(x)?x.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(sn.has(a))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(u)?u:0,finish:c}}function an(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function ze(e){let t=an(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function ln(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Q(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Q(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var cn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function un(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Mt(e,t,n="main.ldr"){let r=ln(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let a=cn(f);if(a&&r.has(a)&&!l.has(a))l.add(a),u.push(a)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${un(c)}.dat`)}return s}var At=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,vt=new WeakMap;function $e(e,t){let n=vt.get(e);if(!n)vt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],u=[];s.studs.forEach((p,d)=>{l.push(p[0]),u.push(p[1]);for(let x=0;x<12;x++)i[d*12+x]=p[2+x]});let c=null,f=0,a=0;if(s.mask){f=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:u,mask:c,nx:f,nz:a}),r}var ie=1073741824;class je{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function fn(e,t,n){let s=[],o=[],i=[],l=[],u=[],c=[],f=[],a=[],p=new je(e.length*2),d=[],x=[];for(let v=0;v<e.length;v++){let A=e[v],I=A.m,W=t.parts[A.part];if(!W||!W.mask||!At(I))continue;let B=W.bbox,z=1/0,_=-1/0,Z=1/0,X=-1/0;for(let D=0;D<2;D++)for(let U=0;U<2;U++){let O=D?B[3]:B[0],G=U?B[5]:B[2],j=I[0]+I[3]*O+I[5]*G,H=I[2]+I[9]*O+I[11]*G;if(j<z)z=j;if(j>_)_=j;if(H<Z)Z=H;if(H>X)X=H}let E=u.length;s.push(z),o.push(_),i.push(Z),l.push(X),u.push(v),c.push($e(t,A.part)),f.push(B[0]),a.push(B[2]);let w=Math.round((I[1]+B[4])*2);for(let D=Math.floor(z/40);D<=Math.floor(_/40);D++)for(let U=Math.floor(Z/40);U<=Math.floor(X/40);U++){if(!xe(w,D,U))continue;let O=x.length;x.push(E),d.push(p.put(w,D,U,O))}}let y=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,g=NaN,b=NaN,C=-1,R=(v,A,I,W)=>{let B=Math.round(A*2),z=Math.floor(v/40),_=Math.floor(I/40);if(!xe(B,z,_))return fe;let Z=fe;if(B!==h||z!==g||_!==b)h=B,g=z,b=_,C=p.get(B,z,_);for(let X=C;X>=0;X=d[X]){let E=x[X];if(u[E]===W||!(v-6>=s[E]-0.5&&v+6<=o[E]+0.5&&I-6>=i[E]-0.5&&I+6<=l[E]+0.5))continue;let w=e[u[E]].m,D=c[E],U=f[E],O=a[E],G=v-w[0],j=A-w[1],H=I-w[2],K=w[3]*G+w[6]*j+w[9]*H,F=w[5]*G+w[8]*j+w[11]*H,{nx:q,nz:ee,mask:ae}=D,oe=!0;for(let te=0;te<5;te++){let ne=Math.floor((K+y[te]-U)/20),re=Math.floor((F+S[te]-O)/20);if(ne<0||re<0||ne>=q||re>=ee||ae[ne*ee+re]!==1){oe=!1;break}}if(oe){if(!n)return 0;let te=n[u[E]];if(te<Z)Z=te}}return Z},M=0;for(let v of e){let A=$e(t,v.part);if(A)M+=A.nStuds}let L=new Uint8Array(M),T=new Uint8Array(M),k=new je(M),m=0,P=n?new Int32Array(M).fill(fe):void 0;for(let v=0,A=0;v<e.length;v++){let I=e[v],W=$e(t,I.part);if(!W)continue;let B=I.m,z=W.studM,_=B[0],Z=B[1],X=B[2],E=B[3],w=B[4],D=B[5],U=B[6],O=B[7],G=B[8],j=B[9],H=B[10],K=B[11];for(let F=0;F<W.nStuds;F++,A++){let q=F*12,ee=z[q+4],ae=z[q+7],oe=z[q+10];if(!(Math.abs(U*ee+O*ae+G*oe-1)<0.001&&Math.abs(E*ee+w*ae+D*oe)<0.001&&Math.abs(j*ee+H*ae+K*oe)<0.001))continue;T[A]=1;let te=z[q],ne=z[q+1],re=z[q+2],Ve=_+E*te+w*ne+D*re,_e=Z+U*te+O*ne+G*re,He=X+j*te+H*ne+K*re,Ge=R(Ve,_e,He,v);if(Ge!==fe){if(L[A]=1,m++,P)P[A]=Ge}let pe=Math.round(Ve),me=Math.round(_e),he=Math.round(He);if(!xe(pe,me,he))continue;if(!n){k.put(pe,me,he,1);continue}let We=n[v],Ke=k.get(pe,me,he);if(Ke<0||We<Ke)k.put(pe,me,he,We)}}let V=new Uint8Array(e.length),N=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let A=e[v],I=t.parts[A.part];if(!I||!I.under||!At(A.m))continue;let W=I.bbox,B=Math.round((W[3]-W[0])/20),z=Math.round((W[5]-W[2])/20);if(!B||!z||B*z>4096)continue;let _=A.m,Z=!0,X=0;for(let E=0;E<B&&Z;E++)for(let w=0;w<z;w++){let D=W[0]+10+20*E,U=W[2]+10+20*w,O=_[0]+_[3]*D+_[5]*U,G=_[2]+_[9]*D+_[11]*U,j=Math.round(O),H=Math.round(_[1]+W[4]),K=Math.round(G),F=xe(j,H,K)?k.get(j,H,K):-1;if(F<0){Z=!1;break}if(F>X)X=F}if(Z){if(V[v]=1,N)N[v]=X}}return{nStuds:M,studHidden:L,studUp:T,underHidden:V,studsHidden:m,studHideStep:P,underHideStep:N}}function pn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let x=t.colorTable?.[a.color],y=x?.hex??t.colors?.[a.color],S=x?ze({alpha:x.alpha??255,luminance:x.luminance??0,finish:x.finish??{type:"default"}}):"default:op",h=ze(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&S===h?String(a.color):p.hex.toUpperCase()+"/"+h,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=l.map((a)=>yt(a.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:u.map((a)=>f.get(a)),nSteps:c.length,localColours:s}}function we(e,t,n=!0){let r=pn(e,t,n);return fn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,Me=new Map;function ve(e=Te,t=fetch){let n=Ae.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ae.delete(e)),Ae.set(e,n);return n}var mn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Ce=(e,t)=>mn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function hn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let x=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+x),S=r;n.push(y),r+=y.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ce(b,S);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ce(b,S)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+l.length)%4)%4,c=4+l.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+u,!0),f.set(l,4),f.fill(32,4+l.length,c);let a=c;for(let p of n)f.set(p,a),a+=p.byteLength;return ye(f.buffer)}async function gn(e,t={}){e=[...e];try{return await Ct(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await Ct(e,{...t,fetch:o})}catch{throw n}}}async function Ct(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await ve(n,r),i=[...new Set([...e].map(Q))],l=[],u=[];for(let h of i){if(Me.has(n+h))continue;let g=o.parts[h];if(g)u.push({name:h,off:g[0],len:g[1],file:g[2]??0});else l.push(h)}u.sort((h,g)=>h.file-g.file||h.off-g.off);let c=[];for(let h of u){let g=c[c.length-1];if(g&&g.file===h.file&&h.off-g.end<=s)g.end=Math.max(g.end,h.off+h.len),g.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,a=0,p=0,d=new Map,x=async()=>{while(p<c.length){let h=c[p++],g=d.get(h.file);if(g)g=g.subarray(h.start,h.end);else{let b=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(a++,g=new Uint8Array(await b.arrayBuffer()),f+=g.byteLength,b.status===200)d.set(h.file,g),g=g.subarray(h.start,h.end)}for(let b of h.items){let C=be(g.subarray(b.off-h.start,b.off-h.start+b.len)),R=C.buffer.slice(C.byteOffset,C.byteOffset+C.byteLength);Me.set(n+b.name,ye(R))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},x));let y=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:y.length?hn(y,{colors:o.colors}):ye(dn(o.colors)),missing:l,requests:a,bytes:f}}function dn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function bn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Tt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let u=l.embedded?t.get(l.part):Q(l.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Le extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Lt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=ve(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(m)=>{if(!m.ok)throw Error(`ldr: ${m.status} fetching ${e}`);return Ye(await m.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":qe(e)),u=wt(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=Mt(o,new Set(u.filter((m)=>m.embedded).map((m)=>m.part)),l),a=(m,P)=>t.maxBodyTris!=null&&m>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(m)=>new Le({...m,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),x="full";if(p){let m=Tt(u,f,await s);if(a(m.known?m.bodyTris:0,m.packBytes)){if(!t.lowCdn)throw d(m);let P=await ve(t.lowCdn,r).catch(()=>null);if(!P)throw d(m);let V=Tt(u,f,P);if(a(V.known?V.bodyTris:0,V.packBytes))throw d(V);x="low"}}let y=[...u.filter((m)=>!m.embedded).map((m)=>m.part),...f.values()],S=async()=>{let m=await gn(y,x==="low"?{...t,cdn:t.lowCdn}:t);for(let[P,V]of f){let N=m.pack.header.parts[V];if(N)m.pack.header.parts[P]=N}return{...m,packBytes:m.pack.buffer?.byteLength??m.pack.bytes??0,bodyTris:bn(u,m.pack)}},h=await S();if(p&&a(h.bodyTris,h.packBytes)&&x==="full"&&t.lowCdn&&await ve(t.lowCdn,r).then(()=>!0,()=>!1)){x="low";let m=h;h=await S(),h.requests+=m.requests,h.bytes+=m.bytes}if(p&&a(h.bodyTris,h.packBytes))throw d(h);let{pack:g,missing:b,requests:C,bytes:R}=h,M=new Map([...f].map(([m,P])=>[P,m])),L=b.map((m)=>M.get(m)??m),T=performance.now(),k=t.cull?we(u,g.header,t.textures!==!1):void 0;return{insts:u,pack:g,tier:x,missing:L,requests:C,bytes:R,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:T-c,...k?{cull:performance.now()-T}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Lt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:u},c)}catch(s){if(s instanceof Le||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4393
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/load-worker.gen.ts
|
|
4394
|
+
var load_worker_gen_default = 'var Pt=ArrayBuffer,Y=Uint8Array,be=Uint16Array,kt=Int16Array;var ye=Int32Array,Pe=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},fe=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},It=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Rt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Rt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},Ye=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Bt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ft=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)q(0);var f=6-s,c=i==3?4:i,u=Ye(e,f,c);f+=c;var a=l?1<<l:s,p=Ye(e,f,a)+(l==1&&256),d=p;if(!s){var y=1<<10+(e[5]>>3);d=y+(y>>3)*(e[5]&7)}if(d>2145386496)q(1);var b=new Y((t==1?p||d:t?0:d)+12);return b[0]=1,b[4]=4,b[8]=8,{b:f+a,y:0,l:0,d:u,w:t&&t!=1?t:b.subarray(12),e:d,o:new ye(b.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Bt(e,4)+8;q(0)},oe=function(e){var t=0;for(;1<<t<=e;++t);return t-1},pe=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,l=-1,f=-1,c=-1,u=o,a=new Pt(512+(o<<2)),p=new kt(a,0,256),d=new be(a,0,256),y=new be(a,512,o),b=512+(o<<1),C=new Y(a,b,o),v=new Y(a,b+o);while(l<255&&i>0){var m=oe(i+1),g=r>>3,w=(1<<m+1)-1,F=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&w,A=(1<<m)-1,T=w-i-1,M=F&A;if(M<T)r+=m,F=M;else if(r+=m+1,F>A)F-=T;if(p[++l]=--F,F==-1)i+=F,C[--u]=l;else i-=F;if(!F)do{var k=r>>3;f=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=f}while(f==3)}if(l>255||i)q(0);var h=0,S=(o>>1)+(o>>3)+3,_=o-1;for(var j=0;j<=l;++j){var D=p[j];if(D<1){d[j]=-D;continue}for(c=0;c<D;++c){C[h]=j;do h=h+S&_;while(h>=u)}}if(h)q(0);for(c=0;c<o;++c){var E=d[C[c]]++,L=v[c]=s-oe(E);y[c]=(E<<L)-o}return[r+7>>3,{b:s,s:C,n:v,t:y}]},Dt=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),f=new be(s.buffer,268);if(o<128){var c=pe(e,t+1,6),u=c[0],a=c[1];t+=o;var p=u<<3,d=e[t];if(!d)q(0);var y=0,b=0,C=a.b,v=C,m=(++t<<3)-8+oe(d);for(;;){if(m-=C,m<p)break;var g=m>>3;if(y+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<C)-1,i[++r]=a.s[y],m-=v,m<p)break;g=m>>3,b+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<v)-1,i[++r]=a.s[b],C=a.n[y],y=a.t[y],v=a.n[b],b=a.t[b]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)q(0);F+=A&&1<<A-1}var T=oe(F)+1,M=1<<T,k=M-F;if(k&k-1)q(0);i[r++]=oe(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&T+1-A]}var h=new Y(M<<1),S=h.subarray(0,M),_=h.subarray(M);f[T]=0;for(n=T;n>0;--n){var j=f[n];fe(_,n,j,f[n-1]=j+l[n]*(1<<T-n))}if(f[0]!=M)q(0);for(n=0;n<r;++n){var D=i[n];if(D){var E=f[D];fe(S,n,E,f[D]=E+(1<<T-D))}}return[t,{n:_,b:T,s:S}]},Ut=pe(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ot=pe(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Nt=pe(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new ye(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},ke=new Y(new ye([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),zt=qe(ke,0),Ie=new Y(new ye([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),$t=qe(Ie,3),ue=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)q(0);var f=0,c=n.b,u=(r<<3)-8+oe(o)-c,a=-1;for(;u>l&&a<s;){var p=u>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(u&7);f=(f<<c|d)&i,t[++a]=n.s[f],u-=c=n.n[f]}if(u!=l||a+1!=s)q(0)},jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;ue(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),ue(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),ue(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),ue(e.subarray(r),t.subarray(l),n)},Vt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,f=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return fe(n,e[s],t.y,t.y+=l),n;return fe(new Y(l),e[s])}if(f>e.length)return;if(i==0){if(t.b=f,n)return n.set(e.subarray(s,f),t.y),t.y+=l,n;return Pe(e,s,f)}if(i==2){var c=e[s],u=c&3,a=c>>2&3,p=c>>4,d=0,y=0;if(u<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(y=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new Y(t.m),C=b.length-p;if(u==0)b.set(e.subarray(s,s+=p),C);else if(u==1)fe(b,e[s++],C);else{var v=t.h;if(u==2){var m=Dt(e,s);d+=s-(s=m[0]),t.h=v=m[1]}else if(!v)q(0);(y?jt:ue)(e.subarray(s,s+=d),b.subarray(C),v)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var w=e[s++];if(w&3)q(0);var F=[Ot,Nt,Ut];for(var A=2;A>-1;--A){var T=w>>(A<<1)+2&3;if(T==1){var M=new Y([0,0,e[s++]]);F[A]={s:M.subarray(2,3),n:M.subarray(0,1),t:new be(M.buffer,0,1),b:0}}else if(T==2)r=pe(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(T==3){if(!t.t)q(0);F[A]=t.t[A]}}var k=t.t=F,h=k[0],S=k[1],_=k[2],j=e[f-1];if(!j)q(0);var D=(f<<3)-8+oe(j)-_.b,E=D>>3,L=0,O=(e[E]|e[E+1]<<8)>>(D&7)&(1<<_.b)-1;E=(D-=S.b)>>3;var H=(e[E]|e[E+1]<<8)>>(D&7)&(1<<S.b)-1;E=(D-=h.b)>>3;var W=(e[E]|e[E+1]<<8)>>(D&7)&(1<<h.b)-1;for(++g;--g;){var R=_.s[O],G=_.n[O],K=h.s[W],P=h.n[W],x=S.s[H],N=S.n[H];E=(D-=x)>>3;var U=1<<x,I=U+((e[E]|e[E+1]<<8|e[E+2]<<16|e[E+3]<<24)>>>(D&7)&U-1);E=(D-=Ie[K])>>3;var z=$t[K]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<Ie[K])-1);E=(D-=ke[R])>>3;var X=zt[R]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<ke[R])-1);if(E=(D-=G)>>3,O=_.t[O]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<G)-1),E=(D-=P)>>3,W=h.t[W]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<P)-1),E=(D-=N)>>3,H=S.t[H]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<N)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(X!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var A=0;A<X;++A)b[L+A]=b[C+A];L+=X,C+=X;var V=L-I;if(V<0){var B=-V,Q=t.e+V;if(B>z)B=z;for(var A=0;A<B;++A)b[L+A]=t.w[Q+A];L+=B,z-=B,V=0}for(var A=0;A<z;++A)b[L+A]=b[V+A];L+=z}if(L!=C)while(C<b.length)b[L++]=b[C++];else L=b.length;if(n)t.y+=L;else b=Pe(b,0,L)}else if(n){if(t.y+=p,C)for(var A=0;A<p;++A)b[A]=b[C+A]}else if(C)b=Pe(b,C);return t.b=f,b}q(2)},_t=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function xe(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ft(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Vt(e,i,t);if(!l)q(5);if(t)i.e=i.y;else n.push(l),o+=l.length,It(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return _t(n,o)}async function Ht(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(xe(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Je(e){return new TextDecoder().decode(await Ht(e))}var Qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function we(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Be=/^[A-Za-z][A-Za-z0-9_]*$/,Re=new Map;function Fe(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Re.has(r))Re.set(r,t);return r}function De(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Be.test(e))return Fe(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var et=/^~?\\s*moved\\s+to\\s+(.+)$/i,Gt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),lt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Wt=new Set(["model","submodel","configuration"]),Kt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function tt(e){let t=Kt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return lt.has(n)||Wt.has(n)?n:void 0}function Xt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let f=Xt(l);if(!f.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:f[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let u=f.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(u>0&&f[u+1])c.glossmap=f[u+1];if(t)c.next=!0;return c}var Yt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function qt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let u=s();if(u===null)return null;i[c]=+u}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),f=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:De(o),m:i,file:J(f)}}function nt(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=De(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:J(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function ct(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,f=null,c=[],u=null,a=()=>{if(!f)return;let m=Yt(f.chunks.join("")),g=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(l??=new Map).set(J(f.name),{name:f.name,bytes:m,...g?{mime:"image/png"}:{}}),f=null},p=!0,d=(m)=>{if(a(),o={name:J(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],u=null,p=!0},y=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=""},v=(m,g)=>{if(u){m.tex=u,u=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!g)m.fallback=!0}else m.tex=w.map};for(let m of e.split(`\n`)){let g=m.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(f||y)continue;if(!o)d(t);let T=g.slice(2).trimStart(),M=T.search(/\\s/),k={t:g.charCodeAt(0)-48,color:De(M<0?T:T.slice(0,M)),p:[],src:g};v(k,!1),o.cmds.push(k),p=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let T=2;while(g.charCodeAt(T)===32||g.charCodeAt(T)===9)T++;let M=T;while(M<g.length&&g.charCodeAt(M)!==32&&g.charCodeAt(M)!==9)M++;let k=g.slice(T,M);if(!Gt.has(k)){if(y||f)continue;if(!o)d(t);let h=g.slice(T),S={t:0,text:h};if(k.charCodeAt(0)===33)S.meta=k;if(u=null,p&&!o.org){let j=tt(h);if(j)o.org=j}let _=h.match(et);if(_&&!o.movedTo){let j=_[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(j))j+=".dat";o.movedTo=J(j)}o.cmds.push(S);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!f&&!y){let T=qt(g);if(T){if(!o)d(t);v(T,!1),o.cmds.push(T),p=!1;continue}}let w=g.split(/\\s+/);if(+w[0]===0){let T=g.slice(1).trim();if(w[1]==="FILE"){C(),y=!1,d(T.slice(5));continue}if(w[1]==="NOFILE"){a(),o=null,y=!0;continue}if(w[1]==="!DATA"){C(),a(),o=null,y=!1,f={name:T.slice(5).trim(),chunks:[]};continue}if(y)continue;if(f){if(w[1]==="!:")f.chunks.push(w.slice(2).join(""));continue}if(!o)d(t);let M={t:0,text:T};if(w[1]==="STEP")M.step=!0,c=[],u=null;else if(w[1]==="BFC")M.bfc=w.slice(2).join(" ");else if(w[1]==="ROTSTEP")if(M.meta="ROTSTEP",M.step=!0,c=[],u=null,(w[2]??"").toUpperCase()==="END")M.rotstep={x:0,y:0,z:0,mode:"END"};else{let h=(w[5]??"REL").toUpperCase();M.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:["REL","ABS","ADD"].includes(h)?h:"REL"}}else if(w[1]==="BUFEXCHG"){M.meta="BUFEXCHG";let h=(w[2]??"").toUpperCase();M.bufexchg={op:h==="RETRIEVE"?"RETRIEVE":"STORE",buf:w[3]??"A"}}else if(w[1]?.startsWith("!"))M.meta=w[1];if(p&&!o.org){let h=tt(T);if(h)o.org=h}if(w[1]==="!TEXMAP"){let h=(w[2]??"").toUpperCase();if(u=null,h==="START"||h==="NEXT"){let S=Zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),h==="NEXT");if(M.texmap={op:h,...S?{map:S}:{}},S)if((o.texmaps??=[]).push(S),h==="START")c.push({map:S,fallback:!1});else u=S}else if(h==="FALLBACK"){M.texmap={op:h};let S=c[c.length-1];if(S)S.fallback=!0}else if(h==="END")M.texmap={op:h},c.pop()}else if(w[1]==="!:"){u=null;let h=nt(w.slice(2));if(h)v(h,!0),M.geom=h}else u=null;let k=T.match(et);if(k&&!o.movedTo){let h=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(h))h+=".dat";o.movedTo=J(h)}o.cmds.push(M);continue}if(f||y)continue;if(!o)d(t);let A=nt(w);if(!A)continue;v(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Cn=Math.PI/180;function ut(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ft(e,t){let[n,r,s,o,i,l,f,c,u,a,p,d]=e,[y,b,C,v,m,g,w,F,A,T,M,k]=t;return[o*y+i*b+l*C+n,f*y+c*b+u*C+r,a*y+p*b+d*C+s,o*v+i*w+l*T,o*m+i*F+l*M,o*g+i*A+l*k,f*v+c*w+u*T,f*m+c*F+u*M,f*g+c*A+u*k,a*v+p*w+d*T,a*m+p*F+d*M,a*g+p*A+d*k]}var Ue=[0,0,0,1,0,0,0,1,0,0,0,1];var rt=new WeakMap,Jt=/^(s|8|48)\\//;function Oe(e,t){let n=e.files.get(J(t));if(!n)return"part";let r=rt.get(n);if(r)return r;if(n.org)r=lt.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Jt.test(s.file))?"part":"model";return rt.set(n,r),r}var st=new WeakMap;function pt(e){let t=st.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return st.set(e,t),t}var ot=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Re.get(e)??String(e):String(e),Qt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ot(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ot(e.color)} ${e.p.join(" ")}`,Ne=(e,t)=>`${J(e)}#${t}`;function en(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ne(e.name,t),cmds:n}}function mt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...en(e,t).cmds.map(Qt)].join(`\n`)+`\n`}function ze(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ht(e){let[t,n,r,s,o,i,l,f,c,u,a,p]=e,d=f*p-c*a,y=-(l*p-c*u),b=l*a-f*u,C=s*d+o*y+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let v=1/C,m=[d*v,-(o*p-i*a)*v,(o*c-i*f)*v,y*v,(s*p-i*u)*v,-(s*c-i*l)*v,b*v,-(s*a-o*u)*v,(s*f-o*l)*v];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var tn=(e)=>String(+e.toFixed(6)||0),it=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function gt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(tn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${it(t.texture)}${t.glossmap?" GLOSSMAP "+it(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${ze(r)}`,source:r}}var nn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function rn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),f=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*f,i,o*f+s*i*c,o*c-s*i*f,-s*l,s*f-o*i*c,s*c+o*i*f,o*l]}var at=new WeakMap;function dt(e){let t=at.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=rn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:nn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),at.set(e,n),n}var bt=999999,wt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Mt=new WeakMap,yt=new WeakMap;function sn(e,t){let n=yt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Mt.get(o)??"",l=i.indexOf("!COLOUR");return l<0?"":"0 "+i.slice(l).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},yt.set(t,n);let r=n.parts.get(e);if(!r){let s=J(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${ze(o)}`,source:o},n.parts.set(e,r)}return r}function on(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,f=0,c=(a,p)=>{let d=a.name+"#"+p,y=l.get(d);if(!y){let b;y=Object.assign(()=>b??=mt(a,p),{file:a,step:p}),l.set(d,y)}return y},u=(a,p,d,y,b,C,v,m,g=null,w=[],F=[],A=void 0,T=null)=>{let M=a.files.get(p);if(!M||v>r)return;let k=T,h=0,S=v>0?++f:0,_=i&&S?[...w,S]:w,j=i&&S?[...F,d]:F,D=i&&!g?new Map:null,E=-1,L=0,O=(P,x,N,U,I,z,X)=>{if(E!==h)E=h,L=0;let Z=D?.get(h+"|"+x);if(Z)return Z.n++,u(P,P===a?x:P.main,N,U,b+"/"+x,[...I,bt],v+1,z,[...I,bt],_,j,X,k);let V=[...I,L++],B=n.length;u(P,P===a?x:P.main,N,U,b+"/"+x,V,v+1,z,g,_,j,X,k),D?.set(h+"|"+x,{n:1,from:B,to:n.length})},H=dt(M),W=s?pt(M):[],R=0,G=(P,x,N,U,I,z,X,Z,V)=>{if(g)U=g;let B={part:P,color:x,m:N,step:U[0],steps:U,localStep:I,path:b};if(Z)B.colour=Z;if(S){if(B.sub=S,i)B.subPath=_,B.subMats=j}if(z)B.embedded=!0;if(X){let ee=gt(P,X);B.texPart=ee.name,B.texSource=ee.source}else if(V){let ee=sn(P,V);B.colPart=ee.name,B.colSource=ee.source}let Q=H[I];if(Q)B.view=Q;return n.push(B),B},K=(P)=>{while(R<W.length&&W[R]<=P){let x=W[R++];G(Ne(M.name,x),y,d,[...C,x],x,!1,null,A,T).source=c(M,x)}};for(let P of M.cmds){if(P.t===0&&P.step){h++;continue}let x=P;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){K(h);continue}if(x.t===0){if(x.meta==="!COLOUR"){let Q=ln(x.text);if(Q&&Q.code!==16&&Q.code!==24)Mt.set(Q,x.text),(k=new Map(k??[])).set(Q.code,Q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let N=x.color===16?y:x.color,U=x.color===16?A:k?.get(x.color),I=ft(d,x.m),z=[...C,h],X=o?x.tex??m:null,Z=X?ht(x.m):null,V=X&&Z?ut(X,Z):null;if(a.files.has(x.file)){if(Oe(a,x.file)==="model"){O(a,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!0,V,U,k);continue}let B=t.resolveModel?.(x.file);if(B){O(B,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!1,V,U,k)}if(K(1/0),D){for(let P of D.values())if(P.n>1)for(let x=P.from;x<P.to;x++)n[x].mult??=P.n}};if(Oe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ue],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return u(e,e.main,Ue,16,e.main,[],0,null),n}function At(e,t="main.ldr",n){return on(ct(e,t,{geometryText:!0}),n)}var an=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function $e(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function xt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=$e(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function ln(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,f=0,c={type:"default"},u=1;while(u<n.length){let a=n[u].toUpperCase(),p=n[u+1];if(a==="CODE")s=p!==void 0&&Be.test(p)?Fe(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,u+=2;else if(a==="VALUE"){let d=$e(p);if(d)o=d;u+=2}else if(a==="EDGE")i=$e(p)??p,u+=2;else if(a==="ALPHA")l=+p,u+=2;else if(a==="LUMINANCE")f=+p,u+=2;else if(a==="CHROME")c={type:"chrome"},u+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},u+=1;else if(a==="RUBBER")c={type:"rubber"},u+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},u+=1;else if(a==="METAL")c={type:"metal"},u+=1;else if(a==="MATERIAL"){let d=(n[u+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:y,next:b}=xt(n,u+2);c={type:"glitter",material:y},u=b}else if(d==="SPECKLE"){let{grain:y,next:b}=xt(n,u+2);c={type:"speckle",material:y},u=b}else if(d==="FABRIC"){let y=(n[u+2]||"").toUpperCase(),b=["VELVET","CANVAS","STRING","FUR"].includes(y)?y.toLowerCase():void 0;c={type:"fabric",kind:b},u+=b?3:2}else u=n.length}else if(an.has(a))u+=1;else u+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(f)?f:0,finish:c}}function cn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function je(e){let t=cn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function un(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(J(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(J(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var fn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?J(t.slice(14).join(" ")):null};function pn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function vt(e,t,n="main.ldr"){let r=un(e,n),s=new Map;for(let o of t){let i=J(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),f=[i];while(f.length)for(let u of r.get(f.pop())){let a=fn(u);if(a&&r.has(a)&&!l.has(a))l.add(a),f.push(a)}let c=[i,...[...l].filter((u)=>u!==i).sort()].map((u)=>"0 FILE "+(u===i?"":u)+`\n`+r.get(u).join(`\n`)).join(`\n`);s.set(i,`emb/${pn(c)}.dat`)}return s}var Ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Tt=new WeakMap;function Ve(e,t){let n=Tt.get(e);if(!n)Tt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],f=[];s.studs.forEach((p,d)=>{l.push(p[0]),f.push(p[1]);for(let y=0;y<12;y++)i[d*12+y]=p[2+y]});let c=null,u=0,a=0;if(s.mask){u=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:f,mask:c,nx:u,nz:a}),r}var le=1073741824;class _e{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,f=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,f[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&f[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var Me=(e,t,n)=>e>-le&&e<le&&t>-le&&t<le&&n>-le&&n<le,me=2147483647;function mn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function hn(e,t,n){let s=new Map,o=(L)=>{let O=s.get(L);if(O===void 0)s.set(L,O=mn(t,L));return O},i=[],l=[],f=[],c=[],u=[],a=[],p=[],d=[],y=new _e(e.length*2),b=[],C=[];for(let L=0;L<e.length;L++){let O=e[L],H=O.m,W=t.parts[O.part];if(!W||!W.mask||!Ct(H)||o(O.color))continue;let R=W.bbox,G=1/0,K=-1/0,P=1/0,x=-1/0;for(let I=0;I<2;I++)for(let z=0;z<2;z++){let X=I?R[3]:R[0],Z=z?R[5]:R[2],V=H[0]+H[3]*X+H[5]*Z,B=H[2]+H[9]*X+H[11]*Z;if(V<G)G=V;if(V>K)K=V;if(B<P)P=B;if(B>x)x=B}let N=u.length;i.push(G),l.push(K),f.push(P),c.push(x),u.push(L),a.push(Ve(t,O.part)),p.push(R[0]),d.push(R[2]);let U=Math.round((H[1]+R[4])*2);for(let I=Math.floor(G/40);I<=Math.floor(K/40);I++)for(let z=Math.floor(P/40);z<=Math.floor(x/40);z++){if(!Me(U,I,z))continue;let X=C.length;C.push(N),b.push(y.put(U,I,z,X))}}let v=[0,5,-5,5,-5],m=[0,5,5,-5,-5],g=NaN,w=NaN,F=NaN,A=-1,T=(L,O,H,W)=>{let R=Math.round(O*2),G=Math.floor(L/40),K=Math.floor(H/40);if(!Me(R,G,K))return me;let P=me;if(R!==g||G!==w||K!==F)g=R,w=G,F=K,A=y.get(R,G,K);for(let x=A;x>=0;x=b[x]){let N=C[x];if(u[N]===W||!(L-6>=i[N]-0.5&&L+6<=l[N]+0.5&&H-6>=f[N]-0.5&&H+6<=c[N]+0.5))continue;let U=e[u[N]].m,I=a[N],z=p[N],X=d[N],Z=L-U[0],V=O-U[1],B=H-U[2],Q=U[3]*Z+U[6]*V+U[9]*B,ee=U[5]*Z+U[8]*V+U[11]*B,{nx:ne,nz:ie,mask:ce}=I,ae=!0;for(let te=0;te<5;te++){let re=Math.floor((Q+v[te]-z)/20),se=Math.floor((ee+m[te]-X)/20);if(re<0||se<0||re>=ne||se>=ie||ce[re*ie+se]!==1){ae=!1;break}}if(ae){if(!n)return 0;let te=n[u[N]];if(te<P)P=te}}return P},M=0;for(let L of e){let O=Ve(t,L.part);if(O)M+=O.nStuds}let k=new Uint8Array(M),h=new Uint8Array(M),S=new _e(M),_=0,j=n?new Int32Array(M).fill(me):void 0;for(let L=0,O=0;L<e.length;L++){let H=e[L],W=Ve(t,H.part);if(!W)continue;let R=H.m,G=W.studM,K=R[0],P=R[1],x=R[2],N=R[3],U=R[4],I=R[5],z=R[6],X=R[7],Z=R[8],V=R[9],B=R[10],Q=R[11];for(let ee=0;ee<W.nStuds;ee++,O++){let ne=ee*12,ie=G[ne+4],ce=G[ne+7],ae=G[ne+10];if(!(Math.abs(z*ie+X*ce+Z*ae-1)<0.001&&Math.abs(N*ie+U*ce+I*ae)<0.001&&Math.abs(V*ie+B*ce+Q*ae)<0.001))continue;h[O]=1;let te=G[ne],re=G[ne+1],se=G[ne+2],He=K+N*te+U*re+I*se,Ge=P+z*te+X*re+Z*se,We=x+V*te+B*re+Q*se,Ke=T(He,Ge,We,L);if(Ke!==me){if(k[O]=1,_++,j)j[O]=Ke}let he=Math.round(He),ge=Math.round(Ge),de=Math.round(We);if(!Me(he,ge,de))continue;if(!n){S.put(he,ge,de,1);continue}let Xe=n[L],Ze=S.get(he,ge,de);if(Ze<0||Xe<Ze)S.put(he,ge,de,Xe)}}let D=new Uint8Array(e.length),E=n?new Int32Array(e.length).fill(me):void 0;for(let L=0;L<e.length;L++){let O=e[L],H=t.parts[O.part];if(!H||!H.under||!Ct(O.m)||o(O.color))continue;let W=H.bbox,R=Math.round((W[3]-W[0])/20),G=Math.round((W[5]-W[2])/20);if(!R||!G||R*G>4096)continue;let K=O.m,P=!0,x=0;for(let N=0;N<R&&P;N++)for(let U=0;U<G;U++){let I=W[0]+10+20*N,z=W[2]+10+20*U,X=K[0]+K[3]*I+K[5]*z,Z=K[2]+K[9]*I+K[11]*z,V=Math.round(X),B=Math.round(K[1]+W[4]),Q=Math.round(Z),ee=Me(V,B,Q)?S.get(V,B,Q):-1;if(ee<0){P=!1;break}if(ee>x)x=ee}if(P){if(D[L]=1,E)E[L]=x}}return{nStuds:M,studHidden:k,studUp:h,underHidden:D,studsHidden:_,studHideStep:j,underHideStep:E}}function gn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let y=t.colorTable?.[a.color],b=y?.hex??t.colors?.[a.color],C=y?je({alpha:y.alpha??255,luminance:y.luminance??0,finish:y.finish??{type:"default"}}):"default:op",v=je(p);if(d=b&&b.toUpperCase()===p.hex.toUpperCase()&&C===v?String(a.color):p.hex.toUpperCase()+"/"+v,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),f=l.map((a)=>wt(a.steps)),c=[...new Set(f)].sort(),u=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:f.map((a)=>u.get(a)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=gn(e,t,n);return hn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Se="https://ldr-demo.vercel.app/cdn/v1/",Ce=new Map,ve=new Map;function Te(e=Se,t=fetch){let n=Ce.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ce.delete(e)),Ce.set(e,n);return n}var dn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Le=(e,t)=>dn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Le(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Le(r,t)])):e;function bn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let y=new DataView(d).getUint32(0,!0),b=new Uint8Array(d,4+y),C=r;n.push(b),r+=b.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[m,g]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Le(g,C);for(let[m,g]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Le(g,C)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),f=(4-(4+l.length)%4)%4,c=4+l.length+f,u=new Uint8Array(c+r);new DataView(u.buffer).setUint32(0,l.length+f,!0),u.set(l,4),u.fill(32,4+l.length,c);let a=c;for(let p of n)u.set(p,a),a+=p.byteLength;return we(u.buffer)}async function yn(e,t={}){e=[...e];try{return await Lt(e,t)}catch(n){let r=t.cdn??Se,s=t.fetch??fetch;Ce.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await Lt(e,{...t,fetch:o})}catch{throw n}}}async function Lt(e,t){let n=t.cdn??Se,r=t.fetch??fetch,s=t.gap??16384,o=await Te(n,r),i=[...new Set([...e].map(J))],l=[],f=[];for(let m of i){if(ve.has(n+m))continue;let g=o.parts[m];if(g)f.push({name:m,off:g[0],len:g[1],file:g[2]??0});else l.push(m)}f.sort((m,g)=>m.file-g.file||m.off-g.off);let c=[];for(let m of f){let g=c[c.length-1];if(g&&g.file===m.file&&m.off-g.end<=s)g.end=Math.max(g.end,m.off+m.len),g.items.push(m);else c.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let u=0,a=0,p=0,d=new Map,y=async()=>{while(p<c.length){let m=c[p++],g=d.get(m.file);if(g)g=g.subarray(m.start,m.end);else{let w=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(a++,g=new Uint8Array(await w.arrayBuffer()),u+=g.byteLength,w.status===200)d.set(m.file,g),g=g.subarray(m.start,m.end)}for(let w of m.items){let F=xe(g.subarray(w.off-m.start,w.off-m.start+w.len)),A=F.buffer.slice(F.byteOffset,F.byteOffset+F.byteLength);ve.set(n+w.name,we(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},y));let b=i.filter((m)=>ve.has(n+m)).map((m)=>ve.get(n+m)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?bn(b,C):we(xn(C)),missing:l,requests:a,bytes:u}}function xn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function wn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function St(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let f=l.embedded?t.get(l.part):J(l.part),c=f?n.parts[f]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(f))i.add(f),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Ee extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Et(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Te(t.cdn??Se,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return Je(await h.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Qe(e)),f=At(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(f),await s;let u=vt(o,new Set(f.filter((h)=>h.embedded).map((h)=>h.part)),l),a=(h,S)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&S>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(h)=>new Ee({...h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),y="full";if(p){let h=St(f,u,await s);if(a(h.known?h.bodyTris:0,h.packBytes)){if(!t.lowCdn)throw d(h);let S=await Te(t.lowCdn,r).catch(()=>null);if(!S)throw d(h);let _=St(f,u,S);if(a(_.known?_.bodyTris:0,_.packBytes))throw d(_);y="low"}}let b=[...f.filter((h)=>!h.embedded).map((h)=>h.part),...u.values()],C=async()=>{let h=await yn(b,y==="low"?{...t,cdn:t.lowCdn}:t);for(let[S,_]of u){let j=h.pack.header.parts[_];if(j)h.pack.header.parts[S]=j}return{...h,packBytes:h.pack.buffer?.byteLength??h.pack.bytes??0,bodyTris:wn(f,h.pack)}},v=await C();if(p&&a(v.bodyTris,v.packBytes)&&y==="full"&&t.lowCdn&&await Te(t.lowCdn,r).then(()=>!0,()=>!1)){y="low";let h=v;v=await C(),v.requests+=h.requests,v.bytes+=h.bytes}if(p&&a(v.bodyTris,v.packBytes))throw d(v);let{pack:m,missing:g,requests:w,bytes:F}=v,A=new Map([...u].map(([h,S])=>[S,h])),T=g.map((h)=>A.get(h)??h),M=performance.now(),k=t.cull?Ae(f,m.header,t.textures!==!1):void 0;return{insts:f,pack:m,tier:y,missing:T,requests:w,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:M-c,...k?{cull:performance.now()-M}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Et(n,{...r,cull:!1,onParsed:(u)=>self.postMessage({id:t,insts:u})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),f=performance.now()-i,c=[];for(let u of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(u)c.push(u.buffer);self.postMessage({id:t,cull:l,ms:f},c)}catch(s){if(s instanceof Ee||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4381
4395
|
|
|
4382
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4396
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cdn.ts
|
|
4383
4397
|
var worker;
|
|
4384
4398
|
var seq = 0;
|
|
4385
4399
|
var pending = new Map;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "var St=ArrayBuffer,Y=Uint8Array,ge=Uint16Array,Et=Int16Array;var de=Int32Array,Se=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Pt=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var kt=[\"invalid zstd data\",\"window size too large (>2046MB)\",\"invalid block type\",\"FSE accuracy too high\",\"match distance too far back\",\"unexpected EOF\"],J=function(e,t,n){var r=Error(t||kt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,J);if(!n)throw r;return r},Xe=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},It=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Bt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)J(0);var u=6-s,c=i==3?4:i,f=Xe(e,u,c);u+=c;var a=l?1<<l:s,p=Xe(e,u,a)+(l==1&&256),d=p;if(!s){var x=1<<10+(e[5]>>3);d=x+(x>>3)*(e[5]&7)}if(d>2145386496)J(1);var y=new Y((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new de(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return It(e,4)+8;J(0)},se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)J(3);var o=1<<s,i=o,l=-1,u=-1,c=-1,f=o,a=new St(512+(o<<2)),p=new Et(a,0,256),d=new ge(a,0,256),x=new ge(a,512,o),y=512+(o<<1),S=new Y(a,y,o),h=new Y(a,y+o);while(l<255&&i>0){var g=se(i+1),b=r>>3,C=(1<<g+1)-1,R=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&C,M=(1<<g)-1,L=C-i-1,T=R&M;if(T<L)r+=g,R=T;else if(r+=g+1,R>M)R-=L;if(p[++l]=--R,R==-1)i+=R,S[--f]=l;else i-=R;if(!R)do{var k=r>>3;u=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=u}while(u==3)}if(l>255||i)J(0);var m=0,P=(o>>1)+(o>>3)+3,V=o-1;for(var N=0;N<=l;++N){var v=p[N];if(v<1){d[N]=-v;continue}for(c=0;c<v;++c){S[m]=N;do m=m+P&V;while(m>=f)}}if(m)J(0);for(c=0;c<o;++c){var A=d[S[c]]++,I=h[c]=s-se(A);x[c]=(A<<I)-o}return[r+7>>3,{b:s,s:S,n:h,t:x}]},Ft=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),u=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],a=c[1];t+=o;var p=f<<3,d=e[t];if(!d)J(0);var x=0,y=0,S=a.b,h=S,g=(++t<<3)-8+se(d);for(;;){if(g-=S,g<p)break;var b=g>>3;if(x+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=a.s[x],g-=h,g<p)break;b=g>>3,y+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<h)-1,i[++r]=a.s[y],S=a.n[x],x=a.t[x],h=a.n[y],y=a.t[y]}if(++r>255)J(0)}else{r=o-127;for(;n<r;n+=2){var C=e[++t];i[n]=C>>4,i[n+1]=C&15}++t}var R=0;for(n=0;n<r;++n){var M=i[n];if(M>11)J(0);R+=M&&1<<M-1}var L=se(R)+1,T=1<<L,k=T-R;if(k&k-1)J(0);i[r++]=se(k)+1;for(n=0;n<r;++n){var M=i[n];++l[i[n]=M&&L+1-M]}var m=new Y(T<<1),P=m.subarray(0,T),V=m.subarray(T);u[L]=0;for(n=L;n>0;--n){var N=u[n];ce(V,n,N,u[n-1]=N+l[n]*(1<<L-n))}if(u[0]!=T)J(0);for(n=0;n<r;++n){var v=i[n];if(v){var A=u[v];ce(P,n,A,u[v]=A+(1<<L-v))}}return[t,{n:V,b:L,s:P}]},Rt=ue(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Dt=ue(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Ut=ue(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ze=function(e,t){var n=e.length,r=new de(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new Y(new de([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ot=Ze(Ee,0),Pe=new Y(new de([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Nt=Ze(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)J(0);var u=0,c=n.b,f=(r<<3)-8+se(o)-c,a=-1;for(;f>l&&a<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++a]=n.s[u],f-=c=n.n[u]}if(f!=l||a+1!=s)J(0)},zt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},$t=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new Y(l),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=l,n;return Se(e,s,u)}if(i==2){var c=e[s],f=c&3,a=c>>2&3,p=c>>4,d=0,x=0;if(f<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(x=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Y(t.m),S=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),S);else if(f==1)ce(y,e[s++],S);else{var h=t.h;if(f==2){var g=Ft(e,s);d+=s-(s=g[0]),t.h=h=g[1]}else if(!h)J(0);(x?zt:le)(e.subarray(s,s+=d),y.subarray(S),h)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var C=e[s++];if(C&3)J(0);var R=[Dt,Ut,Rt];for(var M=2;M>-1;--M){var L=C>>(M<<1)+2&3;if(L==1){var T=new Y([0,0,e[s++]]);R[M]={s:T.subarray(2,3),n:T.subarray(0,1),t:new ge(T.buffer,0,1),b:0}}else if(L==2)r=ue(e,s,9-(M&1)),s=r[0],R[M]=r[1];else if(L==3){if(!t.t)J(0);R[M]=t.t[M]}}var k=t.t=R,m=k[0],P=k[1],V=k[2],N=e[u-1];if(!N)J(0);var v=(u<<3)-8+se(N)-V.b,A=v>>3,I=0,W=(e[A]|e[A+1]<<8)>>(v&7)&(1<<V.b)-1;A=(v-=P.b)>>3;var B=(e[A]|e[A+1]<<8)>>(v&7)&(1<<P.b)-1;A=(v-=m.b)>>3;var z=(e[A]|e[A+1]<<8)>>(v&7)&(1<<m.b)-1;for(++b;--b;){var _=V.s[W],Z=V.n[W],X=m.s[z],E=m.n[z],w=P.s[B],D=P.n[B];A=(v-=w)>>3;var U=1<<w,O=U+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(v&7)&U-1);A=(v-=Pe[X])>>3;var G=Nt[X]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Pe[X])-1);A=(v-=Ee[_])>>3;var j=Ot[_]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Ee[_])-1);if(A=(v-=Z)>>3,W=V.t[W]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<Z)-1),A=(v-=E)>>3,z=m.t[z]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<E)-1),A=(v-=D)>>3,B=P.t[B]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<D)-1),O>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=O-=3;else{var H=O-(j!=0);if(H){if(O=H==3?t.o[0]-1:t.o[H],H>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=O}else O=t.o[0]}for(var M=0;M<j;++M)y[I+M]=y[S+M];I+=j,S+=j;var K=I-O;if(K<0){var F=-K,q=t.e+K;if(F>G)F=G;for(var M=0;M<F;++M)y[I+M]=t.w[q+M];I+=F,G-=F,K=0}for(var M=0;M<G;++M)y[I+M]=y[K+M];I+=G}if(I!=S)while(S<y.length)y[I++]=y[S++];else I=y.length;if(n)t.y+=I;else y=Se(y,0,I)}else if(n){if(t.y+=p,S)for(var M=0;M<p;++M)y[M]=y[S+M]}else if(S)y=Se(y,S);return t.b=u,y}J(2)},jt=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function be(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Bt(e,r||t);if(typeof i==\"object\"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=$t(e,i,t);if(!l)J(5);if(t)i.e=i.y;else n.push(l),o+=l.length,Pt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return jt(n,o)}async function Vt(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(be(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream(\"gzip\"))).arrayBuffer();return n(t)}async function Ye(e){return new TextDecoder().decode(await Vt(e))}var qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split(\"/\").pop()||\"main.ldr\").replace(/\\.(zst|gz)$/i,\"\")||\"main.ldr\";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]===\"f32\"?new Float32Array(e,r+o[0],o[1]):o[2]===\"u16\"?new Uint16Array(e,r+o[0],o[1]):o[2]===\"u8\"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,\"/\").replace(/\\/+/g,\"/\"),Ie=/^[A-Za-z][A-Za-z0-9_]*$/,ke=new Map;function Be(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!ke.has(r))ke.set(r,t);return r}function Fe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Ie.test(e))return Be(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Je=/^~?\\s*moved\\s+to\\s+(.+)$/i,_t=new Set([\"FILE\",\"NOFILE\",\"!DATA\",\"!:\",\"STEP\",\"BFC\",\"ROTSTEP\",\"BUFEXCHG\",\"!TEXMAP\"]),it=new Set([\"part\",\"subpart\",\"primitive\",\"8_primitive\",\"48_primitive\",\"shortcut\",\"helper\"]),Ht=new Set([\"model\",\"submodel\",\"configuration\"]),Gt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Qe(e){let t=Gt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,\"\");return it.has(n)||Ht.has(n)?n:void 0}function Wt(e){let t=[],n=0;while(n<e.length){while(e[n]===\" \"||e[n]===\"\\t\")n++;if(n>=e.length)break;if(e[n]==='\"'){let r=\"\";n++;while(n<e.length&&e[n]!=='\"'){if(e[n]===\"\\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==\" \"&&e[r]!==\"\\t\")r++;t.push(e.slice(n,r)),n=r}}return t}function Kt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r===\"PLANAR\"?9:r===\"CYLINDRICAL\"?10:r===\"SPHERICAL\"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,\"\");let u=Wt(l);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((a,p)=>p>0&&a.toUpperCase()===\"GLOSSMAP\");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Xt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,\"\"),n=t+\"=\".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Zt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),u=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(\" \"):l;return{t:1,color:Fe(o),m:i,file:Q(u)}}function et(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Fe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(e.slice(14).join(\" \"))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function at(e,t=\"main.ldr\",n={}){let r=!!n.geometryText,s=new Map,o=null,i=\"\",l,u=null,c=[],f=null,a=()=>{if(!u)return;let g=Xt(u.chunks.join(\"\")),b=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Q(u.name),{name:u.name,bytes:g,...b?{mime:\"image/png\"}:{}}),u=null},p=!0,d=(g)=>{if(a(),o={name:Q(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},x=!1,y=!1,S=()=>{if(y)return;y=!0,s.clear(),o=null,i=\"\"},h=(g,b)=>{if(f){g.tex=f,f=null;return}let C=c[c.length-1];if(!C)return;if(C.fallback){if(!b)g.fallback=!0}else g.tex=C.map};for(let g of e.split(`\n`)){let b=g.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||x)continue;if(!o)d(t);let L=b.slice(2).trimStart(),T=L.search(/\\s/),k={t:b.charCodeAt(0)-48,color:Fe(T<0?L:L.slice(0,T)),p:[],src:b};h(k,!1),o.cmds.push(k),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let L=2;while(b.charCodeAt(L)===32||b.charCodeAt(L)===9)L++;let T=L;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let k=b.slice(L,T);if(!_t.has(k)){if(x||u)continue;if(!o)d(t);let m=b.slice(L),P={t:0,text:m};if(k.charCodeAt(0)===33)P.meta=k;if(f=null,p&&!o.org){let N=Qe(m);if(N)o.org=N}let V=m.match(Je);if(V&&!o.movedTo){let N=V[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(N))N+=\".dat\";o.movedTo=Q(N)}o.cmds.push(P);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!x){let L=Zt(b);if(L){if(!o)d(t);h(L,!1),o.cmds.push(L),p=!1;continue}}let C=b.split(/\\s+/);if(+C[0]===0){let L=b.slice(1).trim();if(C[1]===\"FILE\"){S(),x=!1,d(L.slice(5));continue}if(C[1]===\"NOFILE\"){a(),o=null,x=!0;continue}if(C[1]===\"!DATA\"){S(),a(),o=null,x=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(x)continue;if(u){if(C[1]===\"!:\")u.chunks.push(C.slice(2).join(\"\"));continue}if(!o)d(t);let T={t:0,text:L};if(C[1]===\"STEP\")T.step=!0,c=[],f=null;else if(C[1]===\"BFC\")T.bfc=C.slice(2).join(\" \");else if(C[1]===\"ROTSTEP\")if(T.meta=\"ROTSTEP\",T.step=!0,c=[],f=null,(C[2]??\"\").toUpperCase()===\"END\")T.rotstep={x:0,y:0,z:0,mode:\"END\"};else{let m=(C[5]??\"REL\").toUpperCase();T.rotstep={x:+C[2]||0,y:+C[3]||0,z:+C[4]||0,mode:[\"REL\",\"ABS\",\"ADD\"].includes(m)?m:\"REL\"}}else if(C[1]===\"BUFEXCHG\"){T.meta=\"BUFEXCHG\";let m=(C[2]??\"\").toUpperCase();T.bufexchg={op:m===\"RETRIEVE\"?\"RETRIEVE\":\"STORE\",buf:C[3]??\"A\"}}else if(C[1]?.startsWith(\"!\"))T.meta=C[1];if(p&&!o.org){let m=Qe(L);if(m)o.org=m}if(C[1]===\"!TEXMAP\"){let m=(C[2]??\"\").toUpperCase();if(f=null,m===\"START\"||m===\"NEXT\"){let P=Kt(L.replace(/^!TEXMAP\\s+\\S+/i,\"\"),m===\"NEXT\");if(T.texmap={op:m,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),m===\"START\")c.push({map:P,fallback:!1});else f=P}else if(m===\"FALLBACK\"){T.texmap={op:m};let P=c[c.length-1];if(P)P.fallback=!0}else if(m===\"END\")T.texmap={op:m},c.pop()}else if(C[1]===\"!:\"){f=null;let m=et(C.slice(2));if(m)h(m,!0),T.geom=m}else f=null;let k=L.match(Je);if(k&&!o.movedTo){let m=k[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(m))m+=\".dat\";o.movedTo=Q(m)}o.cmds.push(T);continue}if(u||x)continue;if(!o)d(t);let M=et(C);if(!M)continue;h(M,!1),o.cmds.push(M),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Mn=Math.PI/180;function lt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ct(e,t){let[n,r,s,o,i,l,u,c,f,a,p,d]=e,[x,y,S,h,g,b,C,R,M,L,T,k]=t;return[o*x+i*y+l*S+n,u*x+c*y+f*S+r,a*x+p*y+d*S+s,o*h+i*C+l*L,o*g+i*R+l*T,o*b+i*M+l*k,u*h+c*C+f*L,u*g+c*R+f*T,u*b+c*M+f*k,a*h+p*C+d*L,a*g+p*R+d*T,a*b+p*M+d*k]}var Re=[0,0,0,1,0,0,0,1,0,0,0,1];var tt=new WeakMap,Yt=/^(s|8|48)\\//;function De(e,t){let n=e.files.get(Q(t));if(!n)return\"part\";let r=tt.get(n);if(r)return r;if(n.org)r=it.has(n.org)?\"part\":\"model\";else if(n.name===e.main)r=\"model\";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Yt.test(s.file))?\"part\":\"model\";return tt.set(n,r),r}var nt=new WeakMap;function ut(e){let t=nt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return nt.set(e,t),t}var rt=(e)=>e>16777215?\"0x\"+e.toString(16).toUpperCase():e<0?ke.get(e)??String(e):String(e),qt=(e)=>e.t===0?\"0 \"+e.text:e.t===1?`1 ${rt(e.color)} ${e.m.join(\" \")} ${e.file}`:e.src?e.src:`${e.t} ${rt(e.color)} ${e.p.join(\" \")}`,Ue=(e,t)=>`${Q(e)}#${t}`;function Jt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op===\"NEXT\";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta===\"!COLOUR\"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ue(e.name,t),cmds:n}}function ft(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Jt(e,t).cmds.map(qt)].join(`\n`)+`\n`}function Oe(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,\"0\")}function pt(e){let[t,n,r,s,o,i,l,u,c,f,a,p]=e,d=u*p-c*a,x=-(l*p-c*f),y=l*a-u*f,S=s*d+o*x+i*y;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,g=[d*h,-(o*p-i*a)*h,(o*c-i*u)*h,x*h,(s*p-i*f)*h,-(s*c-i*l)*h,y*h,-(s*a-o*f)*h,(s*u-o*l)*h];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Qt=(e)=>String(+e.toFixed(6)||0),st=(e)=>'\"'+e.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,\"\\\\\\\"\")+'\"';function mt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!==\"PLANAR\"?[t.a??360]:[],...t.method===\"SPHERICAL\"?[t.b??180]:[]].map(Qt).join(\" \"),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${st(t.texture)}${t.glossmap?\" GLOSSMAP \"+st(t.glossmap):\"\"}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${Oe(r)}`,source:r}}var en=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function tn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*u,i,o*u+s*i*c,o*c-s*i*u,-s*l,s*u-o*i*c,s*c+o*i*u,o*l]}var ot=new WeakMap;function ht(e){let t=ot.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode===\"END\")r=null;else{let i=tn(o.x,o.y,o.z);r=o.mode===\"ABS\"?{abs:!0,m:i,rotstep:o}:o.mode===\"ADD\"&&r?{abs:r.abs,m:en(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),ot.set(e,n),n}var gt=999999,yt=(e)=>e.map((t)=>String(t).padStart(6,\"0\")).join(\".\")+\"~\",xt=new WeakMap,dt=new WeakMap;function nn(e,t){let n=dt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=xt.get(o)??\"\",l=i.indexOf(\"!COLOUR\");return l<0?\"\":\"0 \"+i.slice(l).trim().replace(/\\s+/g,\" \")}).filter(Boolean).join(`\n`),parts:new Map},dt.set(t,n);let r=n.parts.get(e);if(!r){let s=Q(e),o=`0 ldr: ${s} placed in a model's !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${Oe(o)}`,source:o},n.parts.set(e,r)}return r}function rn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,u=0,c=(a,p)=>{let d=a.name+\"#\"+p,x=l.get(d);if(!x){let y;x=Object.assign(()=>y??=ft(a,p),{file:a,step:p}),l.set(d,x)}return x},f=(a,p,d,x,y,S,h,g,b=null,C=[],R=[],M=void 0,L=null)=>{let T=a.files.get(p);if(!T||h>r)return;let k=L,m=0,P=h>0?++u:0,V=i&&P?[...C,P]:C,N=i&&P?[...R,d]:R,v=i&&!b?new Map:null,A=-1,I=0,W=(E,w,D,U,O,G,j)=>{if(A!==m)A=m,I=0;let H=v?.get(m+\"|\"+w);if(H)return H.n++,f(E,E===a?w:E.main,D,U,y+\"/\"+w,[...O,gt],h+1,G,[...O,gt],V,N,j,k);let K=[...O,I++],F=n.length;f(E,E===a?w:E.main,D,U,y+\"/\"+w,K,h+1,G,b,V,N,j,k),v?.set(m+\"|\"+w,{n:1,from:F,to:n.length})},B=ht(T),z=s?ut(T):[],_=0,Z=(E,w,D,U,O,G,j,H,K)=>{if(b)U=b;let F={part:E,color:w,m:D,step:U[0],steps:U,localStep:O,path:y};if(H)F.colour=H;if(P){if(F.sub=P,i)F.subPath=V,F.subMats=N}if(G)F.embedded=!0;if(j){let ee=mt(E,j);F.texPart=ee.name,F.texSource=ee.source}else if(K){let ee=nn(E,K);F.colPart=ee.name,F.colSource=ee.source}let q=B[O];if(q)F.view=q;return n.push(F),F},X=(E)=>{while(_<z.length&&z[_]<=E){let w=z[_++];Z(Ue(T.name,w),x,d,[...S,w],w,!1,null,M,L).source=c(T,w)}};for(let E of T.cmds){if(E.t===0&&E.step){m++;continue}let w=E;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){X(m);continue}if(w.t===0){if(w.meta===\"!COLOUR\"){let q=on(w.text);if(q&&q.code!==16&&q.code!==24)xt.set(q,w.text),(k=new Map(k??[])).set(q.code,q);continue}if(o&&w.geom?.t===1)w=w.geom;else continue}if(w.t!==1)continue;if(o&&w.fallback)continue;let D=w.color===16?x:w.color,U=w.color===16?M:k?.get(w.color),O=ct(d,w.m),G=[...S,m],j=o?w.tex??g:null,H=j?pt(w.m):null,K=j&&H?lt(j,H):null;if(a.files.has(w.file)){if(De(a,w.file)===\"model\"){W(a,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!0,K,U,k);continue}let F=t.resolveModel?.(w.file);if(F){W(F,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!1,K,U,k)}if(X(1/0),v){for(let E of v.values())if(E.n>1)for(let w=E.from;w<E.to;w++)n[w].mult??=E.n}};if(De(e,e.main)===\"part\"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Re],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Re,16,e.main,[],0,null),n}function wt(e,t=\"main.ldr\",n){return rn(at(e,t,{geometryText:!0}),n)}var sn=new Set([\"CHROME\",\"PEARLESCENT\",\"RUBBER\",\"MATTE_METALLIC\",\"METAL\",\"MATERIAL\"]);function Ne(e){if(!e)return null;if(e.startsWith(\"#\")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return(\"#\"+e.slice(2)).toUpperCase();return null}function bt(e,t){let n={value:\"#FFFFFF\",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r===\"VALUE\"){let o=Ne(s);if(o)n.value=o;t+=2}else if(r===\"ALPHA\")n.alpha=+s,t+=2;else if(r===\"LUMINANCE\")n.luminance=+s,t+=2;else if(r===\"FRACTION\")n.fraction=+s,t+=2;else if(r===\"VFRACTION\")n.vfraction=+s,t+=2;else if(r===\"SIZE\")n.size=+s,t+=2;else if(r===\"MINSIZE\")n.minsize=+s,t+=2;else if(r===\"MAXSIZE\")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function on(e){let t=e.indexOf(\"!COLOUR\");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o=\"#FF00FF\",i=\"#333333\",l=255,u=0,c={type:\"default\"},f=1;while(f<n.length){let a=n[f].toUpperCase(),p=n[f+1];if(a===\"CODE\")s=p!==void 0&&Ie.test(p)?Be(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(a===\"VALUE\"){let d=Ne(p);if(d)o=d;f+=2}else if(a===\"EDGE\")i=Ne(p)??p,f+=2;else if(a===\"ALPHA\")l=+p,f+=2;else if(a===\"LUMINANCE\")u=+p,f+=2;else if(a===\"CHROME\")c={type:\"chrome\"},f+=1;else if(a===\"PEARLESCENT\")c={type:\"pearlescent\"},f+=1;else if(a===\"RUBBER\")c={type:\"rubber\"},f+=1;else if(a===\"MATTE_METALLIC\")c={type:\"matte_metallic\"},f+=1;else if(a===\"METAL\")c={type:\"metal\"},f+=1;else if(a===\"MATERIAL\"){let d=(n[f+1]||\"\").toUpperCase();if(d===\"GLITTER\"){let{grain:x,next:y}=bt(n,f+2);c={type:\"glitter\",material:x},f=y}else if(d===\"SPECKLE\"){let{grain:x,next:y}=bt(n,f+2);c={type:\"speckle\",material:x},f=y}else if(d===\"FABRIC\"){let x=(n[f+2]||\"\").toUpperCase(),y=[\"VELVET\",\"CANVAS\",\"STRING\",\"FUR\"].includes(x)?x.toLowerCase():void 0;c={type:\"fabric\",kind:y},f+=y?3:2}else f=n.length}else if(sn.has(a))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(u)?u:0,finish:c}}function an(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??\"default\"){case\"chrome\":return{...s,metalness:1,roughness:0,finish:\"chrome\"};case\"pearlescent\":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:\"pearlescent\"};case\"rubber\":return{...s,metalness:0,roughness:0.9,finish:\"rubber\"};case\"matte_metallic\":return{...s,metalness:0.4,roughness:0.8,finish:\"matte_metallic\"};case\"metal\":return{...s,metalness:0.85,roughness:0.2,finish:\"metal\"};case\"glitter\":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:\"glitter\"}}case\"speckle\":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:\"speckle\"}}case\"fabric\":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:\"fabric\"};default:return{...s,metalness:0,roughness:0.45,finish:\"default\"}}}function ze(e){let t=an(e),n=!t.transparent?\"op\":t.opacity>=0.75?\"a200\":t.opacity>=0.4?\"a128\":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:\"\",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function ln(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Q(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Q(t),r)}let l=o.trim().replace(/\\s+/g,\" \");if(l)r.push(l)}return n}var cn=(e)=>{if(!e.startsWith(\"1 \"))return null;let t=e.split(\" \");return t.length>=15?Q(t.slice(14).join(\" \")):null};function un(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,\"0\")+(n>>>0).toString(16).padStart(8,\"0\")}function Mt(e,t,n=\"main.ldr\"){let r=ln(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let a=cn(f);if(a&&r.has(a)&&!l.has(a))l.add(a),u.push(a)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>\"0 FILE \"+(f===i?\"\":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${un(c)}.dat`)}return s}var At=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,vt=new WeakMap;function $e(e,t){let n=vt.get(e);if(!n)vt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],u=[];s.studs.forEach((p,d)=>{l.push(p[0]),u.push(p[1]);for(let x=0;x<12;x++)i[d*12+x]=p[2+x]});let c=null,f=0,a=0;if(s.mask){f=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:u,mask:c,nx:f,nz:a}),r}var ie=1073741824;class je{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function fn(e,t,n){let s=[],o=[],i=[],l=[],u=[],c=[],f=[],a=[],p=new je(e.length*2),d=[],x=[];for(let v=0;v<e.length;v++){let A=e[v],I=A.m,W=t.parts[A.part];if(!W||!W.mask||!At(I))continue;let B=W.bbox,z=1/0,_=-1/0,Z=1/0,X=-1/0;for(let D=0;D<2;D++)for(let U=0;U<2;U++){let O=D?B[3]:B[0],G=U?B[5]:B[2],j=I[0]+I[3]*O+I[5]*G,H=I[2]+I[9]*O+I[11]*G;if(j<z)z=j;if(j>_)_=j;if(H<Z)Z=H;if(H>X)X=H}let E=u.length;s.push(z),o.push(_),i.push(Z),l.push(X),u.push(v),c.push($e(t,A.part)),f.push(B[0]),a.push(B[2]);let w=Math.round((I[1]+B[4])*2);for(let D=Math.floor(z/40);D<=Math.floor(_/40);D++)for(let U=Math.floor(Z/40);U<=Math.floor(X/40);U++){if(!xe(w,D,U))continue;let O=x.length;x.push(E),d.push(p.put(w,D,U,O))}}let y=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,g=NaN,b=NaN,C=-1,R=(v,A,I,W)=>{let B=Math.round(A*2),z=Math.floor(v/40),_=Math.floor(I/40);if(!xe(B,z,_))return fe;let Z=fe;if(B!==h||z!==g||_!==b)h=B,g=z,b=_,C=p.get(B,z,_);for(let X=C;X>=0;X=d[X]){let E=x[X];if(u[E]===W||!(v-6>=s[E]-0.5&&v+6<=o[E]+0.5&&I-6>=i[E]-0.5&&I+6<=l[E]+0.5))continue;let w=e[u[E]].m,D=c[E],U=f[E],O=a[E],G=v-w[0],j=A-w[1],H=I-w[2],K=w[3]*G+w[6]*j+w[9]*H,F=w[5]*G+w[8]*j+w[11]*H,{nx:q,nz:ee,mask:ae}=D,oe=!0;for(let te=0;te<5;te++){let ne=Math.floor((K+y[te]-U)/20),re=Math.floor((F+S[te]-O)/20);if(ne<0||re<0||ne>=q||re>=ee||ae[ne*ee+re]!==1){oe=!1;break}}if(oe){if(!n)return 0;let te=n[u[E]];if(te<Z)Z=te}}return Z},M=0;for(let v of e){let A=$e(t,v.part);if(A)M+=A.nStuds}let L=new Uint8Array(M),T=new Uint8Array(M),k=new je(M),m=0,P=n?new Int32Array(M).fill(fe):void 0;for(let v=0,A=0;v<e.length;v++){let I=e[v],W=$e(t,I.part);if(!W)continue;let B=I.m,z=W.studM,_=B[0],Z=B[1],X=B[2],E=B[3],w=B[4],D=B[5],U=B[6],O=B[7],G=B[8],j=B[9],H=B[10],K=B[11];for(let F=0;F<W.nStuds;F++,A++){let q=F*12,ee=z[q+4],ae=z[q+7],oe=z[q+10];if(!(Math.abs(U*ee+O*ae+G*oe-1)<0.001&&Math.abs(E*ee+w*ae+D*oe)<0.001&&Math.abs(j*ee+H*ae+K*oe)<0.001))continue;T[A]=1;let te=z[q],ne=z[q+1],re=z[q+2],Ve=_+E*te+w*ne+D*re,_e=Z+U*te+O*ne+G*re,He=X+j*te+H*ne+K*re,Ge=R(Ve,_e,He,v);if(Ge!==fe){if(L[A]=1,m++,P)P[A]=Ge}let pe=Math.round(Ve),me=Math.round(_e),he=Math.round(He);if(!xe(pe,me,he))continue;if(!n){k.put(pe,me,he,1);continue}let We=n[v],Ke=k.get(pe,me,he);if(Ke<0||We<Ke)k.put(pe,me,he,We)}}let V=new Uint8Array(e.length),N=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let A=e[v],I=t.parts[A.part];if(!I||!I.under||!At(A.m))continue;let W=I.bbox,B=Math.round((W[3]-W[0])/20),z=Math.round((W[5]-W[2])/20);if(!B||!z||B*z>4096)continue;let _=A.m,Z=!0,X=0;for(let E=0;E<B&&Z;E++)for(let w=0;w<z;w++){let D=W[0]+10+20*E,U=W[2]+10+20*w,O=_[0]+_[3]*D+_[5]*U,G=_[2]+_[9]*D+_[11]*U,j=Math.round(O),H=Math.round(_[1]+W[4]),K=Math.round(G),F=xe(j,H,K)?k.get(j,H,K):-1;if(F<0){Z=!1;break}if(F>X)X=F}if(Z){if(V[v]=1,N)N[v]=X}}return{nStuds:M,studHidden:L,studUp:T,underHidden:V,studsHidden:m,studHideStep:P,underHideStep:N}}function pn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let x=t.colorTable?.[a.color],y=x?.hex??t.colors?.[a.color],S=x?ze({alpha:x.alpha??255,luminance:x.luminance??0,finish:x.finish??{type:\"default\"}}):\"default:op\",h=ze(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&S===h?String(a.color):p.hex.toUpperCase()+\"/\"+h,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=l.map((a)=>yt(a.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:u.map((a)=>f.get(a)),nSteps:c.length,localColours:s}}function we(e,t,n=!0){let r=pn(e,t,n);return fn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te=\"https://ldr-demo.vercel.app/cdn/v1/\",Ae=new Map,Me=new Map;function ve(e=Te,t=fetch){let n=Ae.get(e);if(!n)n=t(e+\"parts.json\").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ae.delete(e)),Ae.set(e,n);return n}var mn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]===\"number\"&&typeof e[1]===\"number\"&&(e[2]===\"f32\"||e[2]===\"u16\"||e[2]===\"u8\"||e[2]===\"u32\"),Ce=(e,t)=>mn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e===\"object\"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function hn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error(\"ldr: mergePacks needs packs from decodePack/loadPack\");let x=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+x),S=r;n.push(y),r+=y.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ce(b,S);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ce(b,S)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+l.length)%4)%4,c=4+l.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+u,!0),f.set(l,4),f.fill(32,4+l.length,c);let a=c;for(let p of n)f.set(p,a),a+=p.byteLength;return ye(f.buffer)}async function gn(e,t={}){e=[...e];try{return await Ct(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:\"reload\"});try{return await Ct(e,{...t,fetch:o})}catch{throw n}}}async function Ct(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await ve(n,r),i=[...new Set([...e].map(Q))],l=[],u=[];for(let h of i){if(Me.has(n+h))continue;let g=o.parts[h];if(g)u.push({name:h,off:g[0],len:g[1],file:g[2]??0});else l.push(h)}u.sort((h,g)=>h.file-g.file||h.off-g.off);let c=[];for(let h of u){let g=c[c.length-1];if(g&&g.file===h.file&&h.off-g.end<=s)g.end=Math.max(g.end,h.off+h.len),g.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,a=0,p=0,d=new Map,x=async()=>{while(p<c.length){let h=c[p++],g=d.get(h.file);if(g)g=g.subarray(h.start,h.end);else{let b=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,\"Accept-Encoding\":\"identity\"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(a++,g=new Uint8Array(await b.arrayBuffer()),f+=g.byteLength,b.status===200)d.set(h.file,g),g=g.subarray(h.start,h.end)}for(let b of h.items){let C=be(g.subarray(b.off-h.start,b.off-h.start+b.len)),R=C.buffer.slice(C.byteOffset,C.byteOffset+C.byteLength);Me.set(n+b.name,ye(R))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},x));let y=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:y.length?hn(y,{colors:o.colors}):ye(dn(o.colors)),missing:l,requests:a,bytes:f}}function dn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function bn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Tt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let u=l.embedded?t.get(l.part):Q(l.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Le extends Error{code=\"ldr-budget\";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:\"\",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:\"\"].filter(Boolean).join(\", \");super(`ldr: model exceeds device budget: ${t}`);this.name=\"BudgetError\",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Lt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=ve(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(m)=>{if(!m.ok)throw Error(`ldr: ${m.status} fetching ${e}`);return Ye(await m.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?\"main.ldr\":qe(e)),u=wt(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=Mt(o,new Set(u.filter((m)=>m.embedded).map((m)=>m.part)),l),a=(m,P)=>t.maxBodyTris!=null&&m>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(m)=>new Le({...m,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),x=\"full\";if(p){let m=Tt(u,f,await s);if(a(m.known?m.bodyTris:0,m.packBytes)){if(!t.lowCdn)throw d(m);let P=await ve(t.lowCdn,r).catch(()=>null);if(!P)throw d(m);let V=Tt(u,f,P);if(a(V.known?V.bodyTris:0,V.packBytes))throw d(V);x=\"low\"}}let y=[...u.filter((m)=>!m.embedded).map((m)=>m.part),...f.values()],S=async()=>{let m=await gn(y,x===\"low\"?{...t,cdn:t.lowCdn}:t);for(let[P,V]of f){let N=m.pack.header.parts[V];if(N)m.pack.header.parts[P]=N}return{...m,packBytes:m.pack.buffer?.byteLength??m.pack.bytes??0,bodyTris:bn(u,m.pack)}},h=await S();if(p&&a(h.bodyTris,h.packBytes)&&x===\"full\"&&t.lowCdn&&await ve(t.lowCdn,r).then(()=>!0,()=>!1)){x=\"low\";let m=h;h=await S(),h.requests+=m.requests,h.bytes+=m.bytes}if(p&&a(h.bodyTris,h.packBytes))throw d(h);let{pack:g,missing:b,requests:C,bytes:R}=h,M=new Map([...f].map(([m,P])=>[P,m])),L=b.map((m)=>M.get(m)??m),T=performance.now(),k=t.cull?we(u,g.header,t.textures!==!1):void 0;return{insts:u,pack:g,tier:x,missing:L,requests:C,bytes:R,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:T-c,...k?{cull:performance.now()-T}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Lt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:u},c)}catch(s){if(s instanceof Le||s?.code===\"ldr-budget\")self.postMessage({id:t,phase:\"error\",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:\"error\",error:String(s?.message??s)})}};\n";
|
|
1
|
+
declare const _default: "var Pt=ArrayBuffer,Y=Uint8Array,be=Uint16Array,kt=Int16Array;var ye=Int32Array,Pe=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},fe=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},It=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Rt=[\"invalid zstd data\",\"window size too large (>2046MB)\",\"invalid block type\",\"FSE accuracy too high\",\"match distance too far back\",\"unexpected EOF\"],q=function(e,t,n){var r=Error(t||Rt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},Ye=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Bt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ft=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)q(0);var f=6-s,c=i==3?4:i,u=Ye(e,f,c);f+=c;var a=l?1<<l:s,p=Ye(e,f,a)+(l==1&&256),d=p;if(!s){var y=1<<10+(e[5]>>3);d=y+(y>>3)*(e[5]&7)}if(d>2145386496)q(1);var b=new Y((t==1?p||d:t?0:d)+12);return b[0]=1,b[4]=4,b[8]=8,{b:f+a,y:0,l:0,d:u,w:t&&t!=1?t:b.subarray(12),e:d,o:new ye(b.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Bt(e,4)+8;q(0)},oe=function(e){var t=0;for(;1<<t<=e;++t);return t-1},pe=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,l=-1,f=-1,c=-1,u=o,a=new Pt(512+(o<<2)),p=new kt(a,0,256),d=new be(a,0,256),y=new be(a,512,o),b=512+(o<<1),C=new Y(a,b,o),v=new Y(a,b+o);while(l<255&&i>0){var m=oe(i+1),g=r>>3,w=(1<<m+1)-1,F=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&w,A=(1<<m)-1,T=w-i-1,M=F&A;if(M<T)r+=m,F=M;else if(r+=m+1,F>A)F-=T;if(p[++l]=--F,F==-1)i+=F,C[--u]=l;else i-=F;if(!F)do{var k=r>>3;f=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=f}while(f==3)}if(l>255||i)q(0);var h=0,S=(o>>1)+(o>>3)+3,_=o-1;for(var j=0;j<=l;++j){var D=p[j];if(D<1){d[j]=-D;continue}for(c=0;c<D;++c){C[h]=j;do h=h+S&_;while(h>=u)}}if(h)q(0);for(c=0;c<o;++c){var E=d[C[c]]++,L=v[c]=s-oe(E);y[c]=(E<<L)-o}return[r+7>>3,{b:s,s:C,n:v,t:y}]},Dt=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),f=new be(s.buffer,268);if(o<128){var c=pe(e,t+1,6),u=c[0],a=c[1];t+=o;var p=u<<3,d=e[t];if(!d)q(0);var y=0,b=0,C=a.b,v=C,m=(++t<<3)-8+oe(d);for(;;){if(m-=C,m<p)break;var g=m>>3;if(y+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<C)-1,i[++r]=a.s[y],m-=v,m<p)break;g=m>>3,b+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<v)-1,i[++r]=a.s[b],C=a.n[y],y=a.t[y],v=a.n[b],b=a.t[b]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)q(0);F+=A&&1<<A-1}var T=oe(F)+1,M=1<<T,k=M-F;if(k&k-1)q(0);i[r++]=oe(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&T+1-A]}var h=new Y(M<<1),S=h.subarray(0,M),_=h.subarray(M);f[T]=0;for(n=T;n>0;--n){var j=f[n];fe(_,n,j,f[n-1]=j+l[n]*(1<<T-n))}if(f[0]!=M)q(0);for(n=0;n<r;++n){var D=i[n];if(D){var E=f[D];fe(S,n,E,f[D]=E+(1<<T-D))}}return[t,{n:_,b:T,s:S}]},Ut=pe(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ot=pe(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Nt=pe(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new ye(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},ke=new Y(new ye([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),zt=qe(ke,0),Ie=new Y(new ye([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),$t=qe(Ie,3),ue=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)q(0);var f=0,c=n.b,u=(r<<3)-8+oe(o)-c,a=-1;for(;u>l&&a<s;){var p=u>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(u&7);f=(f<<c|d)&i,t[++a]=n.s[f],u-=c=n.n[f]}if(u!=l||a+1!=s)q(0)},jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;ue(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),ue(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),ue(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),ue(e.subarray(r),t.subarray(l),n)},Vt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,f=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return fe(n,e[s],t.y,t.y+=l),n;return fe(new Y(l),e[s])}if(f>e.length)return;if(i==0){if(t.b=f,n)return n.set(e.subarray(s,f),t.y),t.y+=l,n;return Pe(e,s,f)}if(i==2){var c=e[s],u=c&3,a=c>>2&3,p=c>>4,d=0,y=0;if(u<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(y=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new Y(t.m),C=b.length-p;if(u==0)b.set(e.subarray(s,s+=p),C);else if(u==1)fe(b,e[s++],C);else{var v=t.h;if(u==2){var m=Dt(e,s);d+=s-(s=m[0]),t.h=v=m[1]}else if(!v)q(0);(y?jt:ue)(e.subarray(s,s+=d),b.subarray(C),v)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var w=e[s++];if(w&3)q(0);var F=[Ot,Nt,Ut];for(var A=2;A>-1;--A){var T=w>>(A<<1)+2&3;if(T==1){var M=new Y([0,0,e[s++]]);F[A]={s:M.subarray(2,3),n:M.subarray(0,1),t:new be(M.buffer,0,1),b:0}}else if(T==2)r=pe(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(T==3){if(!t.t)q(0);F[A]=t.t[A]}}var k=t.t=F,h=k[0],S=k[1],_=k[2],j=e[f-1];if(!j)q(0);var D=(f<<3)-8+oe(j)-_.b,E=D>>3,L=0,O=(e[E]|e[E+1]<<8)>>(D&7)&(1<<_.b)-1;E=(D-=S.b)>>3;var H=(e[E]|e[E+1]<<8)>>(D&7)&(1<<S.b)-1;E=(D-=h.b)>>3;var W=(e[E]|e[E+1]<<8)>>(D&7)&(1<<h.b)-1;for(++g;--g;){var R=_.s[O],G=_.n[O],K=h.s[W],P=h.n[W],x=S.s[H],N=S.n[H];E=(D-=x)>>3;var U=1<<x,I=U+((e[E]|e[E+1]<<8|e[E+2]<<16|e[E+3]<<24)>>>(D&7)&U-1);E=(D-=Ie[K])>>3;var z=$t[K]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<Ie[K])-1);E=(D-=ke[R])>>3;var X=zt[R]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<ke[R])-1);if(E=(D-=G)>>3,O=_.t[O]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<G)-1),E=(D-=P)>>3,W=h.t[W]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<P)-1),E=(D-=N)>>3,H=S.t[H]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<N)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(X!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var A=0;A<X;++A)b[L+A]=b[C+A];L+=X,C+=X;var V=L-I;if(V<0){var B=-V,Q=t.e+V;if(B>z)B=z;for(var A=0;A<B;++A)b[L+A]=t.w[Q+A];L+=B,z-=B,V=0}for(var A=0;A<z;++A)b[L+A]=b[V+A];L+=z}if(L!=C)while(C<b.length)b[L++]=b[C++];else L=b.length;if(n)t.y+=L;else b=Pe(b,0,L)}else if(n){if(t.y+=p,C)for(var A=0;A<p;++A)b[A]=b[C+A]}else if(C)b=Pe(b,C);return t.b=f,b}q(2)},_t=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function xe(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ft(e,r||t);if(typeof i==\"object\"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Vt(e,i,t);if(!l)q(5);if(t)i.e=i.y;else n.push(l),o+=l.length,It(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return _t(n,o)}async function Ht(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(xe(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream(\"gzip\"))).arrayBuffer();return n(t)}async function Je(e){return new TextDecoder().decode(await Ht(e))}var Qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split(\"/\").pop()||\"main.ldr\").replace(/\\.(zst|gz)$/i,\"\")||\"main.ldr\";function we(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]===\"f32\"?new Float32Array(e,r+o[0],o[1]):o[2]===\"u16\"?new Uint16Array(e,r+o[0],o[1]):o[2]===\"u8\"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,\"/\").replace(/\\/+/g,\"/\"),Be=/^[A-Za-z][A-Za-z0-9_]*$/,Re=new Map;function Fe(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Re.has(r))Re.set(r,t);return r}function De(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Be.test(e))return Fe(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var et=/^~?\\s*moved\\s+to\\s+(.+)$/i,Gt=new Set([\"FILE\",\"NOFILE\",\"!DATA\",\"!:\",\"STEP\",\"BFC\",\"ROTSTEP\",\"BUFEXCHG\",\"!TEXMAP\"]),lt=new Set([\"part\",\"subpart\",\"primitive\",\"8_primitive\",\"48_primitive\",\"shortcut\",\"helper\"]),Wt=new Set([\"model\",\"submodel\",\"configuration\"]),Kt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function tt(e){let t=Kt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,\"\");return lt.has(n)||Wt.has(n)?n:void 0}function Xt(e){let t=[],n=0;while(n<e.length){while(e[n]===\" \"||e[n]===\"\\t\")n++;if(n>=e.length)break;if(e[n]==='\"'){let r=\"\";n++;while(n<e.length&&e[n]!=='\"'){if(e[n]===\"\\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==\" \"&&e[r]!==\"\\t\")r++;t.push(e.slice(n,r)),n=r}}return t}function Zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r===\"PLANAR\"?9:r===\"CYLINDRICAL\"?10:r===\"SPHERICAL\"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,\"\");let f=Xt(l);if(!f.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:f[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let u=f.findIndex((a,p)=>p>0&&a.toUpperCase()===\"GLOSSMAP\");if(u>0&&f[u+1])c.glossmap=f[u+1];if(t)c.next=!0;return c}var Yt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,\"\"),n=t+\"=\".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function qt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let u=s();if(u===null)return null;i[c]=+u}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),f=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(\" \"):l;return{t:1,color:De(o),m:i,file:J(f)}}function nt(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=De(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:J(e.slice(14).join(\" \"))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function ct(e,t=\"main.ldr\",n={}){let r=!!n.geometryText,s=new Map,o=null,i=\"\",l,f=null,c=[],u=null,a=()=>{if(!f)return;let m=Yt(f.chunks.join(\"\")),g=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(l??=new Map).set(J(f.name),{name:f.name,bytes:m,...g?{mime:\"image/png\"}:{}}),f=null},p=!0,d=(m)=>{if(a(),o={name:J(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],u=null,p=!0},y=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=\"\"},v=(m,g)=>{if(u){m.tex=u,u=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!g)m.fallback=!0}else m.tex=w.map};for(let m of e.split(`\n`)){let g=m.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(f||y)continue;if(!o)d(t);let T=g.slice(2).trimStart(),M=T.search(/\\s/),k={t:g.charCodeAt(0)-48,color:De(M<0?T:T.slice(0,M)),p:[],src:g};v(k,!1),o.cmds.push(k),p=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let T=2;while(g.charCodeAt(T)===32||g.charCodeAt(T)===9)T++;let M=T;while(M<g.length&&g.charCodeAt(M)!==32&&g.charCodeAt(M)!==9)M++;let k=g.slice(T,M);if(!Gt.has(k)){if(y||f)continue;if(!o)d(t);let h=g.slice(T),S={t:0,text:h};if(k.charCodeAt(0)===33)S.meta=k;if(u=null,p&&!o.org){let j=tt(h);if(j)o.org=j}let _=h.match(et);if(_&&!o.movedTo){let j=_[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(j))j+=\".dat\";o.movedTo=J(j)}o.cmds.push(S);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!f&&!y){let T=qt(g);if(T){if(!o)d(t);v(T,!1),o.cmds.push(T),p=!1;continue}}let w=g.split(/\\s+/);if(+w[0]===0){let T=g.slice(1).trim();if(w[1]===\"FILE\"){C(),y=!1,d(T.slice(5));continue}if(w[1]===\"NOFILE\"){a(),o=null,y=!0;continue}if(w[1]===\"!DATA\"){C(),a(),o=null,y=!1,f={name:T.slice(5).trim(),chunks:[]};continue}if(y)continue;if(f){if(w[1]===\"!:\")f.chunks.push(w.slice(2).join(\"\"));continue}if(!o)d(t);let M={t:0,text:T};if(w[1]===\"STEP\")M.step=!0,c=[],u=null;else if(w[1]===\"BFC\")M.bfc=w.slice(2).join(\" \");else if(w[1]===\"ROTSTEP\")if(M.meta=\"ROTSTEP\",M.step=!0,c=[],u=null,(w[2]??\"\").toUpperCase()===\"END\")M.rotstep={x:0,y:0,z:0,mode:\"END\"};else{let h=(w[5]??\"REL\").toUpperCase();M.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:[\"REL\",\"ABS\",\"ADD\"].includes(h)?h:\"REL\"}}else if(w[1]===\"BUFEXCHG\"){M.meta=\"BUFEXCHG\";let h=(w[2]??\"\").toUpperCase();M.bufexchg={op:h===\"RETRIEVE\"?\"RETRIEVE\":\"STORE\",buf:w[3]??\"A\"}}else if(w[1]?.startsWith(\"!\"))M.meta=w[1];if(p&&!o.org){let h=tt(T);if(h)o.org=h}if(w[1]===\"!TEXMAP\"){let h=(w[2]??\"\").toUpperCase();if(u=null,h===\"START\"||h===\"NEXT\"){let S=Zt(T.replace(/^!TEXMAP\\s+\\S+/i,\"\"),h===\"NEXT\");if(M.texmap={op:h,...S?{map:S}:{}},S)if((o.texmaps??=[]).push(S),h===\"START\")c.push({map:S,fallback:!1});else u=S}else if(h===\"FALLBACK\"){M.texmap={op:h};let S=c[c.length-1];if(S)S.fallback=!0}else if(h===\"END\")M.texmap={op:h},c.pop()}else if(w[1]===\"!:\"){u=null;let h=nt(w.slice(2));if(h)v(h,!0),M.geom=h}else u=null;let k=T.match(et);if(k&&!o.movedTo){let h=k[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(h))h+=\".dat\";o.movedTo=J(h)}o.cmds.push(M);continue}if(f||y)continue;if(!o)d(t);let A=nt(w);if(!A)continue;v(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Cn=Math.PI/180;function ut(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ft(e,t){let[n,r,s,o,i,l,f,c,u,a,p,d]=e,[y,b,C,v,m,g,w,F,A,T,M,k]=t;return[o*y+i*b+l*C+n,f*y+c*b+u*C+r,a*y+p*b+d*C+s,o*v+i*w+l*T,o*m+i*F+l*M,o*g+i*A+l*k,f*v+c*w+u*T,f*m+c*F+u*M,f*g+c*A+u*k,a*v+p*w+d*T,a*m+p*F+d*M,a*g+p*A+d*k]}var Ue=[0,0,0,1,0,0,0,1,0,0,0,1];var rt=new WeakMap,Jt=/^(s|8|48)\\//;function Oe(e,t){let n=e.files.get(J(t));if(!n)return\"part\";let r=rt.get(n);if(r)return r;if(n.org)r=lt.has(n.org)?\"part\":\"model\";else if(n.name===e.main)r=\"model\";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Jt.test(s.file))?\"part\":\"model\";return rt.set(n,r),r}var st=new WeakMap;function pt(e){let t=st.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return st.set(e,t),t}var ot=(e)=>e>16777215?\"0x\"+e.toString(16).toUpperCase():e<0?Re.get(e)??String(e):String(e),Qt=(e)=>e.t===0?\"0 \"+e.text:e.t===1?`1 ${ot(e.color)} ${e.m.join(\" \")} ${e.file}`:e.src?e.src:`${e.t} ${ot(e.color)} ${e.p.join(\" \")}`,Ne=(e,t)=>`${J(e)}#${t}`;function en(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op===\"NEXT\";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta===\"!COLOUR\"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ne(e.name,t),cmds:n}}function mt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...en(e,t).cmds.map(Qt)].join(`\n`)+`\n`}function ze(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,\"0\")}function ht(e){let[t,n,r,s,o,i,l,f,c,u,a,p]=e,d=f*p-c*a,y=-(l*p-c*u),b=l*a-f*u,C=s*d+o*y+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let v=1/C,m=[d*v,-(o*p-i*a)*v,(o*c-i*f)*v,y*v,(s*p-i*u)*v,-(s*c-i*l)*v,b*v,-(s*a-o*u)*v,(s*f-o*l)*v];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var tn=(e)=>String(+e.toFixed(6)||0),it=(e)=>'\"'+e.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,\"\\\\\\\"\")+'\"';function gt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!==\"PLANAR\"?[t.a??360]:[],...t.method===\"SPHERICAL\"?[t.b??180]:[]].map(tn).join(\" \"),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${it(t.texture)}${t.glossmap?\" GLOSSMAP \"+it(t.glossmap):\"\"}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${ze(r)}`,source:r}}var nn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function rn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),f=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*f,i,o*f+s*i*c,o*c-s*i*f,-s*l,s*f-o*i*c,s*c+o*i*f,o*l]}var at=new WeakMap;function dt(e){let t=at.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode===\"END\")r=null;else{let i=rn(o.x,o.y,o.z);r=o.mode===\"ABS\"?{abs:!0,m:i,rotstep:o}:o.mode===\"ADD\"&&r?{abs:r.abs,m:nn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),at.set(e,n),n}var bt=999999,wt=(e)=>e.map((t)=>String(t).padStart(6,\"0\")).join(\".\")+\"~\",Mt=new WeakMap,yt=new WeakMap;function sn(e,t){let n=yt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Mt.get(o)??\"\",l=i.indexOf(\"!COLOUR\");return l<0?\"\":\"0 \"+i.slice(l).trim().replace(/\\s+/g,\" \")}).filter(Boolean).join(`\n`),parts:new Map},yt.set(t,n);let r=n.parts.get(e);if(!r){let s=J(e),o=`0 ldr: ${s} placed in a model's !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${ze(o)}`,source:o},n.parts.set(e,r)}return r}function on(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,f=0,c=(a,p)=>{let d=a.name+\"#\"+p,y=l.get(d);if(!y){let b;y=Object.assign(()=>b??=mt(a,p),{file:a,step:p}),l.set(d,y)}return y},u=(a,p,d,y,b,C,v,m,g=null,w=[],F=[],A=void 0,T=null)=>{let M=a.files.get(p);if(!M||v>r)return;let k=T,h=0,S=v>0?++f:0,_=i&&S?[...w,S]:w,j=i&&S?[...F,d]:F,D=i&&!g?new Map:null,E=-1,L=0,O=(P,x,N,U,I,z,X)=>{if(E!==h)E=h,L=0;let Z=D?.get(h+\"|\"+x);if(Z)return Z.n++,u(P,P===a?x:P.main,N,U,b+\"/\"+x,[...I,bt],v+1,z,[...I,bt],_,j,X,k);let V=[...I,L++],B=n.length;u(P,P===a?x:P.main,N,U,b+\"/\"+x,V,v+1,z,g,_,j,X,k),D?.set(h+\"|\"+x,{n:1,from:B,to:n.length})},H=dt(M),W=s?pt(M):[],R=0,G=(P,x,N,U,I,z,X,Z,V)=>{if(g)U=g;let B={part:P,color:x,m:N,step:U[0],steps:U,localStep:I,path:b};if(Z)B.colour=Z;if(S){if(B.sub=S,i)B.subPath=_,B.subMats=j}if(z)B.embedded=!0;if(X){let ee=gt(P,X);B.texPart=ee.name,B.texSource=ee.source}else if(V){let ee=sn(P,V);B.colPart=ee.name,B.colSource=ee.source}let Q=H[I];if(Q)B.view=Q;return n.push(B),B},K=(P)=>{while(R<W.length&&W[R]<=P){let x=W[R++];G(Ne(M.name,x),y,d,[...C,x],x,!1,null,A,T).source=c(M,x)}};for(let P of M.cmds){if(P.t===0&&P.step){h++;continue}let x=P;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){K(h);continue}if(x.t===0){if(x.meta===\"!COLOUR\"){let Q=ln(x.text);if(Q&&Q.code!==16&&Q.code!==24)Mt.set(Q,x.text),(k=new Map(k??[])).set(Q.code,Q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let N=x.color===16?y:x.color,U=x.color===16?A:k?.get(x.color),I=ft(d,x.m),z=[...C,h],X=o?x.tex??m:null,Z=X?ht(x.m):null,V=X&&Z?ut(X,Z):null;if(a.files.has(x.file)){if(Oe(a,x.file)===\"model\"){O(a,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!0,V,U,k);continue}let B=t.resolveModel?.(x.file);if(B){O(B,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!1,V,U,k)}if(K(1/0),D){for(let P of D.values())if(P.n>1)for(let x=P.from;x<P.to;x++)n[x].mult??=P.n}};if(Oe(e,e.main)===\"part\"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ue],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return u(e,e.main,Ue,16,e.main,[],0,null),n}function At(e,t=\"main.ldr\",n){return on(ct(e,t,{geometryText:!0}),n)}var an=new Set([\"CHROME\",\"PEARLESCENT\",\"RUBBER\",\"MATTE_METALLIC\",\"METAL\",\"MATERIAL\"]);function $e(e){if(!e)return null;if(e.startsWith(\"#\")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return(\"#\"+e.slice(2)).toUpperCase();return null}function xt(e,t){let n={value:\"#FFFFFF\",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r===\"VALUE\"){let o=$e(s);if(o)n.value=o;t+=2}else if(r===\"ALPHA\")n.alpha=+s,t+=2;else if(r===\"LUMINANCE\")n.luminance=+s,t+=2;else if(r===\"FRACTION\")n.fraction=+s,t+=2;else if(r===\"VFRACTION\")n.vfraction=+s,t+=2;else if(r===\"SIZE\")n.size=+s,t+=2;else if(r===\"MINSIZE\")n.minsize=+s,t+=2;else if(r===\"MAXSIZE\")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function ln(e){let t=e.indexOf(\"!COLOUR\");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o=\"#FF00FF\",i=\"#333333\",l=255,f=0,c={type:\"default\"},u=1;while(u<n.length){let a=n[u].toUpperCase(),p=n[u+1];if(a===\"CODE\")s=p!==void 0&&Be.test(p)?Fe(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,u+=2;else if(a===\"VALUE\"){let d=$e(p);if(d)o=d;u+=2}else if(a===\"EDGE\")i=$e(p)??p,u+=2;else if(a===\"ALPHA\")l=+p,u+=2;else if(a===\"LUMINANCE\")f=+p,u+=2;else if(a===\"CHROME\")c={type:\"chrome\"},u+=1;else if(a===\"PEARLESCENT\")c={type:\"pearlescent\"},u+=1;else if(a===\"RUBBER\")c={type:\"rubber\"},u+=1;else if(a===\"MATTE_METALLIC\")c={type:\"matte_metallic\"},u+=1;else if(a===\"METAL\")c={type:\"metal\"},u+=1;else if(a===\"MATERIAL\"){let d=(n[u+1]||\"\").toUpperCase();if(d===\"GLITTER\"){let{grain:y,next:b}=xt(n,u+2);c={type:\"glitter\",material:y},u=b}else if(d===\"SPECKLE\"){let{grain:y,next:b}=xt(n,u+2);c={type:\"speckle\",material:y},u=b}else if(d===\"FABRIC\"){let y=(n[u+2]||\"\").toUpperCase(),b=[\"VELVET\",\"CANVAS\",\"STRING\",\"FUR\"].includes(y)?y.toLowerCase():void 0;c={type:\"fabric\",kind:b},u+=b?3:2}else u=n.length}else if(an.has(a))u+=1;else u+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(f)?f:0,finish:c}}function cn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??\"default\"){case\"chrome\":return{...s,metalness:1,roughness:0,finish:\"chrome\"};case\"pearlescent\":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:\"pearlescent\"};case\"rubber\":return{...s,metalness:0,roughness:0.9,finish:\"rubber\"};case\"matte_metallic\":return{...s,metalness:0.4,roughness:0.8,finish:\"matte_metallic\"};case\"metal\":return{...s,metalness:0.85,roughness:0.2,finish:\"metal\"};case\"glitter\":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:\"glitter\"}}case\"speckle\":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:\"speckle\"}}case\"fabric\":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:\"fabric\"};default:return{...s,metalness:0,roughness:0.45,finish:\"default\"}}}function je(e){let t=cn(e),n=!t.transparent?\"op\":t.opacity>=0.75?\"a200\":t.opacity>=0.4?\"a128\":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:\"\",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function un(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(J(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(J(t),r)}let l=o.trim().replace(/\\s+/g,\" \");if(l)r.push(l)}return n}var fn=(e)=>{if(!e.startsWith(\"1 \"))return null;let t=e.split(\" \");return t.length>=15?J(t.slice(14).join(\" \")):null};function pn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,\"0\")+(n>>>0).toString(16).padStart(8,\"0\")}function vt(e,t,n=\"main.ldr\"){let r=un(e,n),s=new Map;for(let o of t){let i=J(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),f=[i];while(f.length)for(let u of r.get(f.pop())){let a=fn(u);if(a&&r.has(a)&&!l.has(a))l.add(a),f.push(a)}let c=[i,...[...l].filter((u)=>u!==i).sort()].map((u)=>\"0 FILE \"+(u===i?\"\":u)+`\n`+r.get(u).join(`\n`)).join(`\n`);s.set(i,`emb/${pn(c)}.dat`)}return s}var Ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Tt=new WeakMap;function Ve(e,t){let n=Tt.get(e);if(!n)Tt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],f=[];s.studs.forEach((p,d)=>{l.push(p[0]),f.push(p[1]);for(let y=0;y<12;y++)i[d*12+y]=p[2+y]});let c=null,u=0,a=0;if(s.mask){u=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:f,mask:c,nx:u,nz:a}),r}var le=1073741824;class _e{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,f=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,f[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&f[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var Me=(e,t,n)=>e>-le&&e<le&&t>-le&&t<le&&n>-le&&n<le,me=2147483647;function mn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function hn(e,t,n){let s=new Map,o=(L)=>{let O=s.get(L);if(O===void 0)s.set(L,O=mn(t,L));return O},i=[],l=[],f=[],c=[],u=[],a=[],p=[],d=[],y=new _e(e.length*2),b=[],C=[];for(let L=0;L<e.length;L++){let O=e[L],H=O.m,W=t.parts[O.part];if(!W||!W.mask||!Ct(H)||o(O.color))continue;let R=W.bbox,G=1/0,K=-1/0,P=1/0,x=-1/0;for(let I=0;I<2;I++)for(let z=0;z<2;z++){let X=I?R[3]:R[0],Z=z?R[5]:R[2],V=H[0]+H[3]*X+H[5]*Z,B=H[2]+H[9]*X+H[11]*Z;if(V<G)G=V;if(V>K)K=V;if(B<P)P=B;if(B>x)x=B}let N=u.length;i.push(G),l.push(K),f.push(P),c.push(x),u.push(L),a.push(Ve(t,O.part)),p.push(R[0]),d.push(R[2]);let U=Math.round((H[1]+R[4])*2);for(let I=Math.floor(G/40);I<=Math.floor(K/40);I++)for(let z=Math.floor(P/40);z<=Math.floor(x/40);z++){if(!Me(U,I,z))continue;let X=C.length;C.push(N),b.push(y.put(U,I,z,X))}}let v=[0,5,-5,5,-5],m=[0,5,5,-5,-5],g=NaN,w=NaN,F=NaN,A=-1,T=(L,O,H,W)=>{let R=Math.round(O*2),G=Math.floor(L/40),K=Math.floor(H/40);if(!Me(R,G,K))return me;let P=me;if(R!==g||G!==w||K!==F)g=R,w=G,F=K,A=y.get(R,G,K);for(let x=A;x>=0;x=b[x]){let N=C[x];if(u[N]===W||!(L-6>=i[N]-0.5&&L+6<=l[N]+0.5&&H-6>=f[N]-0.5&&H+6<=c[N]+0.5))continue;let U=e[u[N]].m,I=a[N],z=p[N],X=d[N],Z=L-U[0],V=O-U[1],B=H-U[2],Q=U[3]*Z+U[6]*V+U[9]*B,ee=U[5]*Z+U[8]*V+U[11]*B,{nx:ne,nz:ie,mask:ce}=I,ae=!0;for(let te=0;te<5;te++){let re=Math.floor((Q+v[te]-z)/20),se=Math.floor((ee+m[te]-X)/20);if(re<0||se<0||re>=ne||se>=ie||ce[re*ie+se]!==1){ae=!1;break}}if(ae){if(!n)return 0;let te=n[u[N]];if(te<P)P=te}}return P},M=0;for(let L of e){let O=Ve(t,L.part);if(O)M+=O.nStuds}let k=new Uint8Array(M),h=new Uint8Array(M),S=new _e(M),_=0,j=n?new Int32Array(M).fill(me):void 0;for(let L=0,O=0;L<e.length;L++){let H=e[L],W=Ve(t,H.part);if(!W)continue;let R=H.m,G=W.studM,K=R[0],P=R[1],x=R[2],N=R[3],U=R[4],I=R[5],z=R[6],X=R[7],Z=R[8],V=R[9],B=R[10],Q=R[11];for(let ee=0;ee<W.nStuds;ee++,O++){let ne=ee*12,ie=G[ne+4],ce=G[ne+7],ae=G[ne+10];if(!(Math.abs(z*ie+X*ce+Z*ae-1)<0.001&&Math.abs(N*ie+U*ce+I*ae)<0.001&&Math.abs(V*ie+B*ce+Q*ae)<0.001))continue;h[O]=1;let te=G[ne],re=G[ne+1],se=G[ne+2],He=K+N*te+U*re+I*se,Ge=P+z*te+X*re+Z*se,We=x+V*te+B*re+Q*se,Ke=T(He,Ge,We,L);if(Ke!==me){if(k[O]=1,_++,j)j[O]=Ke}let he=Math.round(He),ge=Math.round(Ge),de=Math.round(We);if(!Me(he,ge,de))continue;if(!n){S.put(he,ge,de,1);continue}let Xe=n[L],Ze=S.get(he,ge,de);if(Ze<0||Xe<Ze)S.put(he,ge,de,Xe)}}let D=new Uint8Array(e.length),E=n?new Int32Array(e.length).fill(me):void 0;for(let L=0;L<e.length;L++){let O=e[L],H=t.parts[O.part];if(!H||!H.under||!Ct(O.m)||o(O.color))continue;let W=H.bbox,R=Math.round((W[3]-W[0])/20),G=Math.round((W[5]-W[2])/20);if(!R||!G||R*G>4096)continue;let K=O.m,P=!0,x=0;for(let N=0;N<R&&P;N++)for(let U=0;U<G;U++){let I=W[0]+10+20*N,z=W[2]+10+20*U,X=K[0]+K[3]*I+K[5]*z,Z=K[2]+K[9]*I+K[11]*z,V=Math.round(X),B=Math.round(K[1]+W[4]),Q=Math.round(Z),ee=Me(V,B,Q)?S.get(V,B,Q):-1;if(ee<0){P=!1;break}if(ee>x)x=ee}if(P){if(D[L]=1,E)E[L]=x}}return{nStuds:M,studHidden:k,studUp:h,underHidden:D,studsHidden:_,studHideStep:j,underHideStep:E}}function gn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let y=t.colorTable?.[a.color],b=y?.hex??t.colors?.[a.color],C=y?je({alpha:y.alpha??255,luminance:y.luminance??0,finish:y.finish??{type:\"default\"}}):\"default:op\",v=je(p);if(d=b&&b.toUpperCase()===p.hex.toUpperCase()&&C===v?String(a.color):p.hex.toUpperCase()+\"/\"+v,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),f=l.map((a)=>wt(a.steps)),c=[...new Set(f)].sort(),u=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:f.map((a)=>u.get(a)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=gn(e,t,n);return hn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Se=\"https://ldr-demo.vercel.app/cdn/v1/\",Ce=new Map,ve=new Map;function Te(e=Se,t=fetch){let n=Ce.get(e);if(!n)n=t(e+\"parts.json\").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ce.delete(e)),Ce.set(e,n);return n}var dn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]===\"number\"&&typeof e[1]===\"number\"&&(e[2]===\"f32\"||e[2]===\"u16\"||e[2]===\"u8\"||e[2]===\"u32\"),Le=(e,t)=>dn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Le(n,t)):e&&typeof e===\"object\"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Le(r,t)])):e;function bn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error(\"ldr: mergePacks needs packs from decodePack/loadPack\");let y=new DataView(d).getUint32(0,!0),b=new Uint8Array(d,4+y),C=r;n.push(b),r+=b.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[m,g]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Le(g,C);for(let[m,g]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Le(g,C)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),f=(4-(4+l.length)%4)%4,c=4+l.length+f,u=new Uint8Array(c+r);new DataView(u.buffer).setUint32(0,l.length+f,!0),u.set(l,4),u.fill(32,4+l.length,c);let a=c;for(let p of n)u.set(p,a),a+=p.byteLength;return we(u.buffer)}async function yn(e,t={}){e=[...e];try{return await Lt(e,t)}catch(n){let r=t.cdn??Se,s=t.fetch??fetch;Ce.delete(r);let o=(i,l)=>s(i,{...l,cache:\"reload\"});try{return await Lt(e,{...t,fetch:o})}catch{throw n}}}async function Lt(e,t){let n=t.cdn??Se,r=t.fetch??fetch,s=t.gap??16384,o=await Te(n,r),i=[...new Set([...e].map(J))],l=[],f=[];for(let m of i){if(ve.has(n+m))continue;let g=o.parts[m];if(g)f.push({name:m,off:g[0],len:g[1],file:g[2]??0});else l.push(m)}f.sort((m,g)=>m.file-g.file||m.off-g.off);let c=[];for(let m of f){let g=c[c.length-1];if(g&&g.file===m.file&&m.off-g.end<=s)g.end=Math.max(g.end,m.off+m.len),g.items.push(m);else c.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let u=0,a=0,p=0,d=new Map,y=async()=>{while(p<c.length){let m=c[p++],g=d.get(m.file);if(g)g=g.subarray(m.start,m.end);else{let w=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,\"Accept-Encoding\":\"identity\"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(a++,g=new Uint8Array(await w.arrayBuffer()),u+=g.byteLength,w.status===200)d.set(m.file,g),g=g.subarray(m.start,m.end)}for(let w of m.items){let F=xe(g.subarray(w.off-m.start,w.off-m.start+w.len)),A=F.buffer.slice(F.byteOffset,F.byteOffset+F.byteLength);ve.set(n+w.name,we(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},y));let b=i.filter((m)=>ve.has(n+m)).map((m)=>ve.get(n+m)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?bn(b,C):we(xn(C)),missing:l,requests:a,bytes:u}}function xn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function wn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function St(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let f=l.embedded?t.get(l.part):J(l.part),c=f?n.parts[f]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(f))i.add(f),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Ee extends Error{code=\"ldr-budget\";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:\"\",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:\"\"].filter(Boolean).join(\", \");super(`ldr: model exceeds device budget: ${t}`);this.name=\"BudgetError\",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Et(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Te(t.cdn??Se,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return Je(await h.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?\"main.ldr\":Qe(e)),f=At(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(f),await s;let u=vt(o,new Set(f.filter((h)=>h.embedded).map((h)=>h.part)),l),a=(h,S)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&S>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(h)=>new Ee({...h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),y=\"full\";if(p){let h=St(f,u,await s);if(a(h.known?h.bodyTris:0,h.packBytes)){if(!t.lowCdn)throw d(h);let S=await Te(t.lowCdn,r).catch(()=>null);if(!S)throw d(h);let _=St(f,u,S);if(a(_.known?_.bodyTris:0,_.packBytes))throw d(_);y=\"low\"}}let b=[...f.filter((h)=>!h.embedded).map((h)=>h.part),...u.values()],C=async()=>{let h=await yn(b,y===\"low\"?{...t,cdn:t.lowCdn}:t);for(let[S,_]of u){let j=h.pack.header.parts[_];if(j)h.pack.header.parts[S]=j}return{...h,packBytes:h.pack.buffer?.byteLength??h.pack.bytes??0,bodyTris:wn(f,h.pack)}},v=await C();if(p&&a(v.bodyTris,v.packBytes)&&y===\"full\"&&t.lowCdn&&await Te(t.lowCdn,r).then(()=>!0,()=>!1)){y=\"low\";let h=v;v=await C(),v.requests+=h.requests,v.bytes+=h.bytes}if(p&&a(v.bodyTris,v.packBytes))throw d(v);let{pack:m,missing:g,requests:w,bytes:F}=v,A=new Map([...u].map(([h,S])=>[S,h])),T=g.map((h)=>A.get(h)??h),M=performance.now(),k=t.cull?Ae(f,m.header,t.textures!==!1):void 0;return{insts:f,pack:m,tier:y,missing:T,requests:w,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:M-c,...k?{cull:performance.now()-M}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Et(n,{...r,cull:!1,onParsed:(u)=>self.postMessage({id:t,insts:u})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),f=performance.now()-i,c=[];for(let u of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(u)c.push(u.buffer);self.postMessage({id:t,cull:l,ms:f},c)}catch(s){if(s instanceof Ee||s?.code===\"ldr-budget\")self.postMessage({id:t,phase:\"error\",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:\"error\",error:String(s?.message??s)})}};\n";
|
|
2
2
|
export default _default;
|
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
4
4
|
var namedCodes = new Map;
|
|
@@ -708,7 +708,7 @@ function fileStepViews(f) {
|
|
|
708
708
|
viewMemo.set(f, out);
|
|
709
709
|
return out;
|
|
710
710
|
}
|
|
711
|
-
// ../../../../../../../tmp/ldr-build-
|
|
711
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/model.ts
|
|
712
712
|
var CALLOUT_END = 999999;
|
|
713
713
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
714
714
|
var defLine = new WeakMap;
|
|
@@ -1122,7 +1122,7 @@ function blendedColourHex(code) {
|
|
|
1122
1122
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1123
1123
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1124
1124
|
}
|
|
1125
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1125
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/instructions.ts
|
|
1126
1126
|
var MIN_VIS = 0.5;
|
|
1127
1127
|
var REORIENT = 0.35;
|
|
1128
1128
|
var deg = Math.PI / 180;
|
|
@@ -1490,10 +1490,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1490
1490
|
}
|
|
1491
1491
|
};
|
|
1492
1492
|
}
|
|
1493
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1493
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1494
1494
|
import * as THREE from "three";
|
|
1495
1495
|
|
|
1496
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1496
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/pack-io.ts
|
|
1497
1497
|
import { decompress } from "fzstd";
|
|
1498
1498
|
async function decompressPack(data) {
|
|
1499
1499
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1516,7 +1516,7 @@ function decodePack(buf) {
|
|
|
1516
1516
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1517
1517
|
}
|
|
1518
1518
|
|
|
1519
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1519
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cull.ts
|
|
1520
1520
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1521
1521
|
var prepCache = new WeakMap;
|
|
1522
1522
|
function prepPart(H, part) {
|
|
@@ -1656,8 +1656,21 @@ function forEachStud(insts, H, fn) {
|
|
|
1656
1656
|
}
|
|
1657
1657
|
}
|
|
1658
1658
|
}
|
|
1659
|
+
function seeThrough(H, c) {
|
|
1660
|
+
const g = H.colorTable?.[c];
|
|
1661
|
+
if (g)
|
|
1662
|
+
return (g.alpha ?? 255) < 255;
|
|
1663
|
+
return c.charCodeAt(0) === 35 && /\/[^:/]*:a\d/.test(c);
|
|
1664
|
+
}
|
|
1659
1665
|
function cullCore(insts, H, steps) {
|
|
1660
1666
|
const CELL = 40;
|
|
1667
|
+
const clear = new Map;
|
|
1668
|
+
const isClear = (c) => {
|
|
1669
|
+
let v = clear.get(c);
|
|
1670
|
+
if (v === undefined)
|
|
1671
|
+
clear.set(c, v = seeThrough(H, c));
|
|
1672
|
+
return v;
|
|
1673
|
+
};
|
|
1661
1674
|
const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rPrep = [], rBx = [], rBz = [];
|
|
1662
1675
|
const cells = new Int3Table(insts.length * 2);
|
|
1663
1676
|
const nextE = [], rectE = [];
|
|
@@ -1665,7 +1678,7 @@ function cullCore(insts, H, steps) {
|
|
|
1665
1678
|
const it = insts[idx];
|
|
1666
1679
|
const m = it.m;
|
|
1667
1680
|
const p = H.parts[it.part];
|
|
1668
|
-
if (!p || !p.mask || !upright(m))
|
|
1681
|
+
if (!p || !p.mask || !upright(m) || isClear(it.color))
|
|
1669
1682
|
continue;
|
|
1670
1683
|
const b = p.bbox;
|
|
1671
1684
|
let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity;
|
|
@@ -1791,7 +1804,7 @@ function cullCore(insts, H, steps) {
|
|
|
1791
1804
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
1792
1805
|
const it = insts[idx];
|
|
1793
1806
|
const p = H.parts[it.part];
|
|
1794
|
-
if (!p || !p.under || !upright(it.m))
|
|
1807
|
+
if (!p || !p.under || !upright(it.m) || isClear(it.color))
|
|
1795
1808
|
continue;
|
|
1796
1809
|
const b = p.bbox;
|
|
1797
1810
|
const nx = Math.round((b[3] - b[0]) / 20), nz = Math.round((b[5] - b[2]) / 20);
|
|
@@ -1851,7 +1864,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1851
1864
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1852
1865
|
}
|
|
1853
1866
|
|
|
1854
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1867
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1855
1868
|
async function loadPack(url) {
|
|
1856
1869
|
const res = await fetch(url);
|
|
1857
1870
|
if (!res.ok)
|
|
@@ -3705,7 +3718,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3705
3718
|
await new Promise((r) => setTimeout(r, 0));
|
|
3706
3719
|
}
|
|
3707
3720
|
}
|
|
3708
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3721
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/scene.ts
|
|
3709
3722
|
import * as THREE2 from "three";
|
|
3710
3723
|
function ghostMaterial(side, g) {
|
|
3711
3724
|
const m = new THREE2.MeshStandardMaterial({ color: 16777215, roughness: 0.85, metalness: 0, side, transparent: false, depthWrite: true, opacity: g.opacity });
|
|
@@ -4049,10 +4062,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4049
4062
|
return finish();
|
|
4050
4063
|
})();
|
|
4051
4064
|
}
|
|
4052
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4065
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4053
4066
|
import { decompress as decompress2 } from "fzstd";
|
|
4054
4067
|
|
|
4055
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4068
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/embedded.ts
|
|
4056
4069
|
function splitFiles(text, fallback) {
|
|
4057
4070
|
const files = new Map;
|
|
4058
4071
|
let cur = null, saw = false;
|
|
@@ -4124,7 +4137,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
4124
4137
|
return out;
|
|
4125
4138
|
}
|
|
4126
4139
|
|
|
4127
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4140
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4128
4141
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
4129
4142
|
var indexCache = new Map;
|
|
4130
4143
|
var shardCache = new Map;
|
|
@@ -4253,11 +4266,12 @@ async function loadPartsOnce(names, o) {
|
|
|
4253
4266
|
};
|
|
4254
4267
|
await Promise.all(Array.from({ length: Math.min(o.concurrency ?? 24, groups.length) }, worker));
|
|
4255
4268
|
const shards = want.filter((n) => shardCache.has(cdn + n)).map((n) => shardCache.get(cdn + n));
|
|
4256
|
-
const
|
|
4269
|
+
const extra = { colors: idx.colors, ...idx.colorTable ? { colorTable: idx.colorTable } : {} };
|
|
4270
|
+
const pack = shards.length ? mergePacks(shards, extra) : decodePack(emptyPack(extra));
|
|
4257
4271
|
return { pack, missing, requests, bytes };
|
|
4258
4272
|
}
|
|
4259
|
-
function emptyPack(
|
|
4260
|
-
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {},
|
|
4273
|
+
function emptyPack(extra) {
|
|
4274
|
+
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {}, ...extra }));
|
|
4261
4275
|
const pad = (4 - (4 + h.length) % 4) % 4;
|
|
4262
4276
|
const b = new Uint8Array(4 + h.length + pad).fill(32);
|
|
4263
4277
|
new DataView(b.buffer).setUint32(0, h.length + pad, true);
|
|
@@ -4377,10 +4391,10 @@ async function prepareModel(source, o = {}) {
|
|
|
4377
4391
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
4378
4392
|
}
|
|
4379
4393
|
|
|
4380
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4381
|
-
var load_worker_gen_default = 'var St=ArrayBuffer,Y=Uint8Array,ge=Uint16Array,Et=Int16Array;var de=Int32Array,Se=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Pt=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var kt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],J=function(e,t,n){var r=Error(t||kt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,J);if(!n)throw r;return r},Xe=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},It=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Bt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)J(0);var u=6-s,c=i==3?4:i,f=Xe(e,u,c);u+=c;var a=l?1<<l:s,p=Xe(e,u,a)+(l==1&&256),d=p;if(!s){var x=1<<10+(e[5]>>3);d=x+(x>>3)*(e[5]&7)}if(d>2145386496)J(1);var y=new Y((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new de(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return It(e,4)+8;J(0)},se=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)J(3);var o=1<<s,i=o,l=-1,u=-1,c=-1,f=o,a=new St(512+(o<<2)),p=new Et(a,0,256),d=new ge(a,0,256),x=new ge(a,512,o),y=512+(o<<1),S=new Y(a,y,o),h=new Y(a,y+o);while(l<255&&i>0){var g=se(i+1),b=r>>3,C=(1<<g+1)-1,R=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&C,M=(1<<g)-1,L=C-i-1,T=R&M;if(T<L)r+=g,R=T;else if(r+=g+1,R>M)R-=L;if(p[++l]=--R,R==-1)i+=R,S[--f]=l;else i-=R;if(!R)do{var k=r>>3;u=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=u}while(u==3)}if(l>255||i)J(0);var m=0,P=(o>>1)+(o>>3)+3,V=o-1;for(var N=0;N<=l;++N){var v=p[N];if(v<1){d[N]=-v;continue}for(c=0;c<v;++c){S[m]=N;do m=m+P&V;while(m>=f)}}if(m)J(0);for(c=0;c<o;++c){var A=d[S[c]]++,I=h[c]=s-se(A);x[c]=(A<<I)-o}return[r+7>>3,{b:s,s:S,n:h,t:x}]},Ft=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),u=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],a=c[1];t+=o;var p=f<<3,d=e[t];if(!d)J(0);var x=0,y=0,S=a.b,h=S,g=(++t<<3)-8+se(d);for(;;){if(g-=S,g<p)break;var b=g>>3;if(x+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<S)-1,i[++r]=a.s[x],g-=h,g<p)break;b=g>>3,y+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<h)-1,i[++r]=a.s[y],S=a.n[x],x=a.t[x],h=a.n[y],y=a.t[y]}if(++r>255)J(0)}else{r=o-127;for(;n<r;n+=2){var C=e[++t];i[n]=C>>4,i[n+1]=C&15}++t}var R=0;for(n=0;n<r;++n){var M=i[n];if(M>11)J(0);R+=M&&1<<M-1}var L=se(R)+1,T=1<<L,k=T-R;if(k&k-1)J(0);i[r++]=se(k)+1;for(n=0;n<r;++n){var M=i[n];++l[i[n]=M&&L+1-M]}var m=new Y(T<<1),P=m.subarray(0,T),V=m.subarray(T);u[L]=0;for(n=L;n>0;--n){var N=u[n];ce(V,n,N,u[n-1]=N+l[n]*(1<<L-n))}if(u[0]!=T)J(0);for(n=0;n<r;++n){var v=i[n];if(v){var A=u[v];ce(P,n,A,u[v]=A+(1<<L-v))}}return[t,{n:V,b:L,s:P}]},Rt=ue(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Dt=ue(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Ut=ue(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ze=function(e,t){var n=e.length,r=new de(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ee=new Y(new de([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Ot=Ze(Ee,0),Pe=new Y(new de([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Nt=Ze(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)J(0);var u=0,c=n.b,f=(r<<3)-8+se(o)-c,a=-1;for(;f>l&&a<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++a]=n.s[u],f-=c=n.n[u]}if(f!=l||a+1!=s)J(0)},zt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},$t=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new Y(l),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=l,n;return Se(e,s,u)}if(i==2){var c=e[s],f=c&3,a=c>>2&3,p=c>>4,d=0,x=0;if(f<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(x=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Y(t.m),S=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),S);else if(f==1)ce(y,e[s++],S);else{var h=t.h;if(f==2){var g=Ft(e,s);d+=s-(s=g[0]),t.h=h=g[1]}else if(!h)J(0);(x?zt:le)(e.subarray(s,s+=d),y.subarray(S),h)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var C=e[s++];if(C&3)J(0);var R=[Dt,Ut,Rt];for(var M=2;M>-1;--M){var L=C>>(M<<1)+2&3;if(L==1){var T=new Y([0,0,e[s++]]);R[M]={s:T.subarray(2,3),n:T.subarray(0,1),t:new ge(T.buffer,0,1),b:0}}else if(L==2)r=ue(e,s,9-(M&1)),s=r[0],R[M]=r[1];else if(L==3){if(!t.t)J(0);R[M]=t.t[M]}}var k=t.t=R,m=k[0],P=k[1],V=k[2],N=e[u-1];if(!N)J(0);var v=(u<<3)-8+se(N)-V.b,A=v>>3,I=0,W=(e[A]|e[A+1]<<8)>>(v&7)&(1<<V.b)-1;A=(v-=P.b)>>3;var B=(e[A]|e[A+1]<<8)>>(v&7)&(1<<P.b)-1;A=(v-=m.b)>>3;var z=(e[A]|e[A+1]<<8)>>(v&7)&(1<<m.b)-1;for(++b;--b;){var _=V.s[W],Z=V.n[W],X=m.s[z],E=m.n[z],w=P.s[B],D=P.n[B];A=(v-=w)>>3;var U=1<<w,O=U+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(v&7)&U-1);A=(v-=Pe[X])>>3;var G=Nt[X]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Pe[X])-1);A=(v-=Ee[_])>>3;var j=Ot[_]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(v&7)&(1<<Ee[_])-1);if(A=(v-=Z)>>3,W=V.t[W]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<Z)-1),A=(v-=E)>>3,z=m.t[z]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<E)-1),A=(v-=D)>>3,B=P.t[B]+((e[A]|e[A+1]<<8)>>(v&7)&(1<<D)-1),O>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=O-=3;else{var H=O-(j!=0);if(H){if(O=H==3?t.o[0]-1:t.o[H],H>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=O}else O=t.o[0]}for(var M=0;M<j;++M)y[I+M]=y[S+M];I+=j,S+=j;var K=I-O;if(K<0){var F=-K,q=t.e+K;if(F>G)F=G;for(var M=0;M<F;++M)y[I+M]=t.w[q+M];I+=F,G-=F,K=0}for(var M=0;M<G;++M)y[I+M]=y[K+M];I+=G}if(I!=S)while(S<y.length)y[I++]=y[S++];else I=y.length;if(n)t.y+=I;else y=Se(y,0,I)}else if(n){if(t.y+=p,S)for(var M=0;M<p;++M)y[M]=y[S+M]}else if(S)y=Se(y,S);return t.b=u,y}J(2)},jt=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function be(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Bt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=$t(e,i,t);if(!l)J(5);if(t)i.e=i.y;else n.push(l),o+=l.length,Pt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return jt(n,o)}async function Vt(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(be(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Ye(e){return new TextDecoder().decode(await Vt(e))}var qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Ie=/^[A-Za-z][A-Za-z0-9_]*$/,ke=new Map;function Be(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!ke.has(r))ke.set(r,t);return r}function Fe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Ie.test(e))return Be(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Je=/^~?\\s*moved\\s+to\\s+(.+)$/i,_t=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),it=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Ht=new Set(["model","submodel","configuration"]),Gt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Qe(e){let t=Gt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return it.has(n)||Ht.has(n)?n:void 0}function Wt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Kt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let u=Wt(l);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Xt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Zt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),u=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Fe(o),m:i,file:Q(u)}}function et(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Fe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function at(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,u=null,c=[],f=null,a=()=>{if(!u)return;let g=Xt(u.chunks.join("")),b=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Q(u.name),{name:u.name,bytes:g,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(g)=>{if(a(),o={name:Q(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},x=!1,y=!1,S=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},h=(g,b)=>{if(f){g.tex=f,f=null;return}let C=c[c.length-1];if(!C)return;if(C.fallback){if(!b)g.fallback=!0}else g.tex=C.map};for(let g of e.split(`\n`)){let b=g.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||x)continue;if(!o)d(t);let L=b.slice(2).trimStart(),T=L.search(/\\s/),k={t:b.charCodeAt(0)-48,color:Fe(T<0?L:L.slice(0,T)),p:[],src:b};h(k,!1),o.cmds.push(k),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let L=2;while(b.charCodeAt(L)===32||b.charCodeAt(L)===9)L++;let T=L;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let k=b.slice(L,T);if(!_t.has(k)){if(x||u)continue;if(!o)d(t);let m=b.slice(L),P={t:0,text:m};if(k.charCodeAt(0)===33)P.meta=k;if(f=null,p&&!o.org){let N=Qe(m);if(N)o.org=N}let V=m.match(Je);if(V&&!o.movedTo){let N=V[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(N))N+=".dat";o.movedTo=Q(N)}o.cmds.push(P);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!x){let L=Zt(b);if(L){if(!o)d(t);h(L,!1),o.cmds.push(L),p=!1;continue}}let C=b.split(/\\s+/);if(+C[0]===0){let L=b.slice(1).trim();if(C[1]==="FILE"){S(),x=!1,d(L.slice(5));continue}if(C[1]==="NOFILE"){a(),o=null,x=!0;continue}if(C[1]==="!DATA"){S(),a(),o=null,x=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(x)continue;if(u){if(C[1]==="!:")u.chunks.push(C.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:L};if(C[1]==="STEP")T.step=!0,c=[],f=null;else if(C[1]==="BFC")T.bfc=C.slice(2).join(" ");else if(C[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(C[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let m=(C[5]??"REL").toUpperCase();T.rotstep={x:+C[2]||0,y:+C[3]||0,z:+C[4]||0,mode:["REL","ABS","ADD"].includes(m)?m:"REL"}}else if(C[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let m=(C[2]??"").toUpperCase();T.bufexchg={op:m==="RETRIEVE"?"RETRIEVE":"STORE",buf:C[3]??"A"}}else if(C[1]?.startsWith("!"))T.meta=C[1];if(p&&!o.org){let m=Qe(L);if(m)o.org=m}if(C[1]==="!TEXMAP"){let m=(C[2]??"").toUpperCase();if(f=null,m==="START"||m==="NEXT"){let P=Kt(L.replace(/^!TEXMAP\\s+\\S+/i,""),m==="NEXT");if(T.texmap={op:m,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),m==="START")c.push({map:P,fallback:!1});else f=P}else if(m==="FALLBACK"){T.texmap={op:m};let P=c[c.length-1];if(P)P.fallback=!0}else if(m==="END")T.texmap={op:m},c.pop()}else if(C[1]==="!:"){f=null;let m=et(C.slice(2));if(m)h(m,!0),T.geom=m}else f=null;let k=L.match(Je);if(k&&!o.movedTo){let m=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(m))m+=".dat";o.movedTo=Q(m)}o.cmds.push(T);continue}if(u||x)continue;if(!o)d(t);let M=et(C);if(!M)continue;h(M,!1),o.cmds.push(M),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Mn=Math.PI/180;function lt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ct(e,t){let[n,r,s,o,i,l,u,c,f,a,p,d]=e,[x,y,S,h,g,b,C,R,M,L,T,k]=t;return[o*x+i*y+l*S+n,u*x+c*y+f*S+r,a*x+p*y+d*S+s,o*h+i*C+l*L,o*g+i*R+l*T,o*b+i*M+l*k,u*h+c*C+f*L,u*g+c*R+f*T,u*b+c*M+f*k,a*h+p*C+d*L,a*g+p*R+d*T,a*b+p*M+d*k]}var Re=[0,0,0,1,0,0,0,1,0,0,0,1];var tt=new WeakMap,Yt=/^(s|8|48)\\//;function De(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=tt.get(n);if(r)return r;if(n.org)r=it.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Yt.test(s.file))?"part":"model";return tt.set(n,r),r}var nt=new WeakMap;function ut(e){let t=nt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return nt.set(e,t),t}var rt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?ke.get(e)??String(e):String(e),qt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${rt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${rt(e.color)} ${e.p.join(" ")}`,Ue=(e,t)=>`${Q(e)}#${t}`;function Jt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ue(e.name,t),cmds:n}}function ft(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Jt(e,t).cmds.map(qt)].join(`\n`)+`\n`}function Oe(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function pt(e){let[t,n,r,s,o,i,l,u,c,f,a,p]=e,d=u*p-c*a,x=-(l*p-c*f),y=l*a-u*f,S=s*d+o*x+i*y;if(!Number.isFinite(S)||Math.abs(S)<0.000000000001)return null;let h=1/S,g=[d*h,-(o*p-i*a)*h,(o*c-i*u)*h,x*h,(s*p-i*f)*h,-(s*c-i*l)*h,y*h,-(s*a-o*f)*h,(s*u-o*l)*h];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Qt=(e)=>String(+e.toFixed(6)||0),st=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function mt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Qt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${st(t.texture)}${t.glossmap?" GLOSSMAP "+st(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${Oe(r)}`,source:r}}var en=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function tn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*u,i,o*u+s*i*c,o*c-s*i*u,-s*l,s*u-o*i*c,s*c+o*i*u,o*l]}var ot=new WeakMap;function ht(e){let t=ot.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=tn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:en(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),ot.set(e,n),n}var gt=999999,yt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",xt=new WeakMap,dt=new WeakMap;function nn(e,t){let n=dt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=xt.get(o)??"",l=i.indexOf("!COLOUR");return l<0?"":"0 "+i.slice(l).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},dt.set(t,n);let r=n.parts.get(e);if(!r){let s=Q(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${Oe(o)}`,source:o},n.parts.set(e,r)}return r}function rn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,u=0,c=(a,p)=>{let d=a.name+"#"+p,x=l.get(d);if(!x){let y;x=Object.assign(()=>y??=ft(a,p),{file:a,step:p}),l.set(d,x)}return x},f=(a,p,d,x,y,S,h,g,b=null,C=[],R=[],M=void 0,L=null)=>{let T=a.files.get(p);if(!T||h>r)return;let k=L,m=0,P=h>0?++u:0,V=i&&P?[...C,P]:C,N=i&&P?[...R,d]:R,v=i&&!b?new Map:null,A=-1,I=0,W=(E,w,D,U,O,G,j)=>{if(A!==m)A=m,I=0;let H=v?.get(m+"|"+w);if(H)return H.n++,f(E,E===a?w:E.main,D,U,y+"/"+w,[...O,gt],h+1,G,[...O,gt],V,N,j,k);let K=[...O,I++],F=n.length;f(E,E===a?w:E.main,D,U,y+"/"+w,K,h+1,G,b,V,N,j,k),v?.set(m+"|"+w,{n:1,from:F,to:n.length})},B=ht(T),z=s?ut(T):[],_=0,Z=(E,w,D,U,O,G,j,H,K)=>{if(b)U=b;let F={part:E,color:w,m:D,step:U[0],steps:U,localStep:O,path:y};if(H)F.colour=H;if(P){if(F.sub=P,i)F.subPath=V,F.subMats=N}if(G)F.embedded=!0;if(j){let ee=mt(E,j);F.texPart=ee.name,F.texSource=ee.source}else if(K){let ee=nn(E,K);F.colPart=ee.name,F.colSource=ee.source}let q=B[O];if(q)F.view=q;return n.push(F),F},X=(E)=>{while(_<z.length&&z[_]<=E){let w=z[_++];Z(Ue(T.name,w),x,d,[...S,w],w,!1,null,M,L).source=c(T,w)}};for(let E of T.cmds){if(E.t===0&&E.step){m++;continue}let w=E;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){X(m);continue}if(w.t===0){if(w.meta==="!COLOUR"){let q=on(w.text);if(q&&q.code!==16&&q.code!==24)xt.set(q,w.text),(k=new Map(k??[])).set(q.code,q);continue}if(o&&w.geom?.t===1)w=w.geom;else continue}if(w.t!==1)continue;if(o&&w.fallback)continue;let D=w.color===16?x:w.color,U=w.color===16?M:k?.get(w.color),O=ct(d,w.m),G=[...S,m],j=o?w.tex??g:null,H=j?pt(w.m):null,K=j&&H?lt(j,H):null;if(a.files.has(w.file)){if(De(a,w.file)==="model"){W(a,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!0,K,U,k);continue}let F=t.resolveModel?.(w.file);if(F){W(F,w.file,O,D,G,K,U);continue}Z(w.file,D,O,G,m,!1,K,U,k)}if(X(1/0),v){for(let E of v.values())if(E.n>1)for(let w=E.from;w<E.to;w++)n[w].mult??=E.n}};if(De(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Re],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Re,16,e.main,[],0,null),n}function wt(e,t="main.ldr",n){return rn(at(e,t,{geometryText:!0}),n)}var sn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ne(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function bt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Ne(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function on(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,u=0,c={type:"default"},f=1;while(f<n.length){let a=n[f].toUpperCase(),p=n[f+1];if(a==="CODE")s=p!==void 0&&Ie.test(p)?Be(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(a==="VALUE"){let d=Ne(p);if(d)o=d;f+=2}else if(a==="EDGE")i=Ne(p)??p,f+=2;else if(a==="ALPHA")l=+p,f+=2;else if(a==="LUMINANCE")u=+p,f+=2;else if(a==="CHROME")c={type:"chrome"},f+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(a==="RUBBER")c={type:"rubber"},f+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(a==="METAL")c={type:"metal"},f+=1;else if(a==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:x,next:y}=bt(n,f+2);c={type:"glitter",material:x},f=y}else if(d==="SPECKLE"){let{grain:x,next:y}=bt(n,f+2);c={type:"speckle",material:x},f=y}else if(d==="FABRIC"){let x=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(x)?x.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(sn.has(a))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(u)?u:0,finish:c}}function an(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function ze(e){let t=an(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function ln(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Q(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Q(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var cn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function un(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function Mt(e,t,n="main.ldr"){let r=ln(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let a=cn(f);if(a&&r.has(a)&&!l.has(a))l.add(a),u.push(a)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${un(c)}.dat`)}return s}var At=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,vt=new WeakMap;function $e(e,t){let n=vt.get(e);if(!n)vt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],u=[];s.studs.forEach((p,d)=>{l.push(p[0]),u.push(p[1]);for(let x=0;x<12;x++)i[d*12+x]=p[2+x]});let c=null,f=0,a=0;if(s.mask){f=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:u,mask:c,nx:f,nz:a}),r}var ie=1073741824;class je{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function fn(e,t,n){let s=[],o=[],i=[],l=[],u=[],c=[],f=[],a=[],p=new je(e.length*2),d=[],x=[];for(let v=0;v<e.length;v++){let A=e[v],I=A.m,W=t.parts[A.part];if(!W||!W.mask||!At(I))continue;let B=W.bbox,z=1/0,_=-1/0,Z=1/0,X=-1/0;for(let D=0;D<2;D++)for(let U=0;U<2;U++){let O=D?B[3]:B[0],G=U?B[5]:B[2],j=I[0]+I[3]*O+I[5]*G,H=I[2]+I[9]*O+I[11]*G;if(j<z)z=j;if(j>_)_=j;if(H<Z)Z=H;if(H>X)X=H}let E=u.length;s.push(z),o.push(_),i.push(Z),l.push(X),u.push(v),c.push($e(t,A.part)),f.push(B[0]),a.push(B[2]);let w=Math.round((I[1]+B[4])*2);for(let D=Math.floor(z/40);D<=Math.floor(_/40);D++)for(let U=Math.floor(Z/40);U<=Math.floor(X/40);U++){if(!xe(w,D,U))continue;let O=x.length;x.push(E),d.push(p.put(w,D,U,O))}}let y=[0,5,-5,5,-5],S=[0,5,5,-5,-5],h=NaN,g=NaN,b=NaN,C=-1,R=(v,A,I,W)=>{let B=Math.round(A*2),z=Math.floor(v/40),_=Math.floor(I/40);if(!xe(B,z,_))return fe;let Z=fe;if(B!==h||z!==g||_!==b)h=B,g=z,b=_,C=p.get(B,z,_);for(let X=C;X>=0;X=d[X]){let E=x[X];if(u[E]===W||!(v-6>=s[E]-0.5&&v+6<=o[E]+0.5&&I-6>=i[E]-0.5&&I+6<=l[E]+0.5))continue;let w=e[u[E]].m,D=c[E],U=f[E],O=a[E],G=v-w[0],j=A-w[1],H=I-w[2],K=w[3]*G+w[6]*j+w[9]*H,F=w[5]*G+w[8]*j+w[11]*H,{nx:q,nz:ee,mask:ae}=D,oe=!0;for(let te=0;te<5;te++){let ne=Math.floor((K+y[te]-U)/20),re=Math.floor((F+S[te]-O)/20);if(ne<0||re<0||ne>=q||re>=ee||ae[ne*ee+re]!==1){oe=!1;break}}if(oe){if(!n)return 0;let te=n[u[E]];if(te<Z)Z=te}}return Z},M=0;for(let v of e){let A=$e(t,v.part);if(A)M+=A.nStuds}let L=new Uint8Array(M),T=new Uint8Array(M),k=new je(M),m=0,P=n?new Int32Array(M).fill(fe):void 0;for(let v=0,A=0;v<e.length;v++){let I=e[v],W=$e(t,I.part);if(!W)continue;let B=I.m,z=W.studM,_=B[0],Z=B[1],X=B[2],E=B[3],w=B[4],D=B[5],U=B[6],O=B[7],G=B[8],j=B[9],H=B[10],K=B[11];for(let F=0;F<W.nStuds;F++,A++){let q=F*12,ee=z[q+4],ae=z[q+7],oe=z[q+10];if(!(Math.abs(U*ee+O*ae+G*oe-1)<0.001&&Math.abs(E*ee+w*ae+D*oe)<0.001&&Math.abs(j*ee+H*ae+K*oe)<0.001))continue;T[A]=1;let te=z[q],ne=z[q+1],re=z[q+2],Ve=_+E*te+w*ne+D*re,_e=Z+U*te+O*ne+G*re,He=X+j*te+H*ne+K*re,Ge=R(Ve,_e,He,v);if(Ge!==fe){if(L[A]=1,m++,P)P[A]=Ge}let pe=Math.round(Ve),me=Math.round(_e),he=Math.round(He);if(!xe(pe,me,he))continue;if(!n){k.put(pe,me,he,1);continue}let We=n[v],Ke=k.get(pe,me,he);if(Ke<0||We<Ke)k.put(pe,me,he,We)}}let V=new Uint8Array(e.length),N=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let A=e[v],I=t.parts[A.part];if(!I||!I.under||!At(A.m))continue;let W=I.bbox,B=Math.round((W[3]-W[0])/20),z=Math.round((W[5]-W[2])/20);if(!B||!z||B*z>4096)continue;let _=A.m,Z=!0,X=0;for(let E=0;E<B&&Z;E++)for(let w=0;w<z;w++){let D=W[0]+10+20*E,U=W[2]+10+20*w,O=_[0]+_[3]*D+_[5]*U,G=_[2]+_[9]*D+_[11]*U,j=Math.round(O),H=Math.round(_[1]+W[4]),K=Math.round(G),F=xe(j,H,K)?k.get(j,H,K):-1;if(F<0){Z=!1;break}if(F>X)X=F}if(Z){if(V[v]=1,N)N[v]=X}}return{nStuds:M,studHidden:L,studUp:T,underHidden:V,studsHidden:m,studHideStep:P,underHideStep:N}}function pn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let x=t.colorTable?.[a.color],y=x?.hex??t.colors?.[a.color],S=x?ze({alpha:x.alpha??255,luminance:x.luminance??0,finish:x.finish??{type:"default"}}):"default:op",h=ze(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&S===h?String(a.color):p.hex.toUpperCase()+"/"+h,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=l.map((a)=>yt(a.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:u.map((a)=>f.get(a)),nSteps:c.length,localColours:s}}function we(e,t,n=!0){let r=pn(e,t,n);return fn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Ae=new Map,Me=new Map;function ve(e=Te,t=fetch){let n=Ae.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ae.delete(e)),Ae.set(e,n);return n}var mn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Ce=(e,t)=>mn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function hn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let x=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+x),S=r;n.push(y),r+=y.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ce(b,S);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ce(b,S)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+l.length)%4)%4,c=4+l.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+u,!0),f.set(l,4),f.fill(32,4+l.length,c);let a=c;for(let p of n)f.set(p,a),a+=p.byteLength;return ye(f.buffer)}async function gn(e,t={}){e=[...e];try{return await Ct(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Ae.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await Ct(e,{...t,fetch:o})}catch{throw n}}}async function Ct(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await ve(n,r),i=[...new Set([...e].map(Q))],l=[],u=[];for(let h of i){if(Me.has(n+h))continue;let g=o.parts[h];if(g)u.push({name:h,off:g[0],len:g[1],file:g[2]??0});else l.push(h)}u.sort((h,g)=>h.file-g.file||h.off-g.off);let c=[];for(let h of u){let g=c[c.length-1];if(g&&g.file===h.file&&h.off-g.end<=s)g.end=Math.max(g.end,h.off+h.len),g.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,a=0,p=0,d=new Map,x=async()=>{while(p<c.length){let h=c[p++],g=d.get(h.file);if(g)g=g.subarray(h.start,h.end);else{let b=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(a++,g=new Uint8Array(await b.arrayBuffer()),f+=g.byteLength,b.status===200)d.set(h.file,g),g=g.subarray(h.start,h.end)}for(let b of h.items){let C=be(g.subarray(b.off-h.start,b.off-h.start+b.len)),R=C.buffer.slice(C.byteOffset,C.byteOffset+C.byteLength);Me.set(n+b.name,ye(R))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},x));let y=i.filter((h)=>Me.has(n+h)).map((h)=>Me.get(n+h));return{pack:y.length?hn(y,{colors:o.colors}):ye(dn(o.colors)),missing:l,requests:a,bytes:f}}function dn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function bn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Tt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let u=l.embedded?t.get(l.part):Q(l.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Le extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Lt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=ve(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(m)=>{if(!m.ok)throw Error(`ldr: ${m.status} fetching ${e}`);return Ye(await m.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":qe(e)),u=wt(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=Mt(o,new Set(u.filter((m)=>m.embedded).map((m)=>m.part)),l),a=(m,P)=>t.maxBodyTris!=null&&m>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(m)=>new Le({...m,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),x="full";if(p){let m=Tt(u,f,await s);if(a(m.known?m.bodyTris:0,m.packBytes)){if(!t.lowCdn)throw d(m);let P=await ve(t.lowCdn,r).catch(()=>null);if(!P)throw d(m);let V=Tt(u,f,P);if(a(V.known?V.bodyTris:0,V.packBytes))throw d(V);x="low"}}let y=[...u.filter((m)=>!m.embedded).map((m)=>m.part),...f.values()],S=async()=>{let m=await gn(y,x==="low"?{...t,cdn:t.lowCdn}:t);for(let[P,V]of f){let N=m.pack.header.parts[V];if(N)m.pack.header.parts[P]=N}return{...m,packBytes:m.pack.buffer?.byteLength??m.pack.bytes??0,bodyTris:bn(u,m.pack)}},h=await S();if(p&&a(h.bodyTris,h.packBytes)&&x==="full"&&t.lowCdn&&await ve(t.lowCdn,r).then(()=>!0,()=>!1)){x="low";let m=h;h=await S(),h.requests+=m.requests,h.bytes+=m.bytes}if(p&&a(h.bodyTris,h.packBytes))throw d(h);let{pack:g,missing:b,requests:C,bytes:R}=h,M=new Map([...f].map(([m,P])=>[P,m])),L=b.map((m)=>M.get(m)??m),T=performance.now(),k=t.cull?we(u,g.header,t.textures!==!1):void 0;return{insts:u,pack:g,tier:x,missing:L,requests:C,bytes:R,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:T-c,...k?{cull:performance.now()-T}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Lt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:u},c)}catch(s){if(s instanceof Le||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4394
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/load-worker.gen.ts
|
|
4395
|
+
var load_worker_gen_default = 'var Pt=ArrayBuffer,Y=Uint8Array,be=Uint16Array,kt=Int16Array;var ye=Int32Array,Pe=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},fe=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},It=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Rt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Rt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},Ye=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Bt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ft=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)q(0);var f=6-s,c=i==3?4:i,u=Ye(e,f,c);f+=c;var a=l?1<<l:s,p=Ye(e,f,a)+(l==1&&256),d=p;if(!s){var y=1<<10+(e[5]>>3);d=y+(y>>3)*(e[5]&7)}if(d>2145386496)q(1);var b=new Y((t==1?p||d:t?0:d)+12);return b[0]=1,b[4]=4,b[8]=8,{b:f+a,y:0,l:0,d:u,w:t&&t!=1?t:b.subarray(12),e:d,o:new ye(b.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Bt(e,4)+8;q(0)},oe=function(e){var t=0;for(;1<<t<=e;++t);return t-1},pe=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,l=-1,f=-1,c=-1,u=o,a=new Pt(512+(o<<2)),p=new kt(a,0,256),d=new be(a,0,256),y=new be(a,512,o),b=512+(o<<1),C=new Y(a,b,o),v=new Y(a,b+o);while(l<255&&i>0){var m=oe(i+1),g=r>>3,w=(1<<m+1)-1,F=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&w,A=(1<<m)-1,T=w-i-1,M=F&A;if(M<T)r+=m,F=M;else if(r+=m+1,F>A)F-=T;if(p[++l]=--F,F==-1)i+=F,C[--u]=l;else i-=F;if(!F)do{var k=r>>3;f=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=f}while(f==3)}if(l>255||i)q(0);var h=0,S=(o>>1)+(o>>3)+3,_=o-1;for(var j=0;j<=l;++j){var D=p[j];if(D<1){d[j]=-D;continue}for(c=0;c<D;++c){C[h]=j;do h=h+S&_;while(h>=u)}}if(h)q(0);for(c=0;c<o;++c){var E=d[C[c]]++,L=v[c]=s-oe(E);y[c]=(E<<L)-o}return[r+7>>3,{b:s,s:C,n:v,t:y}]},Dt=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),f=new be(s.buffer,268);if(o<128){var c=pe(e,t+1,6),u=c[0],a=c[1];t+=o;var p=u<<3,d=e[t];if(!d)q(0);var y=0,b=0,C=a.b,v=C,m=(++t<<3)-8+oe(d);for(;;){if(m-=C,m<p)break;var g=m>>3;if(y+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<C)-1,i[++r]=a.s[y],m-=v,m<p)break;g=m>>3,b+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<v)-1,i[++r]=a.s[b],C=a.n[y],y=a.t[y],v=a.n[b],b=a.t[b]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)q(0);F+=A&&1<<A-1}var T=oe(F)+1,M=1<<T,k=M-F;if(k&k-1)q(0);i[r++]=oe(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&T+1-A]}var h=new Y(M<<1),S=h.subarray(0,M),_=h.subarray(M);f[T]=0;for(n=T;n>0;--n){var j=f[n];fe(_,n,j,f[n-1]=j+l[n]*(1<<T-n))}if(f[0]!=M)q(0);for(n=0;n<r;++n){var D=i[n];if(D){var E=f[D];fe(S,n,E,f[D]=E+(1<<T-D))}}return[t,{n:_,b:T,s:S}]},Ut=pe(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ot=pe(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Nt=pe(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new ye(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},ke=new Y(new ye([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),zt=qe(ke,0),Ie=new Y(new ye([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),$t=qe(Ie,3),ue=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)q(0);var f=0,c=n.b,u=(r<<3)-8+oe(o)-c,a=-1;for(;u>l&&a<s;){var p=u>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(u&7);f=(f<<c|d)&i,t[++a]=n.s[f],u-=c=n.n[f]}if(u!=l||a+1!=s)q(0)},jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;ue(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),ue(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),ue(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),ue(e.subarray(r),t.subarray(l),n)},Vt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,f=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return fe(n,e[s],t.y,t.y+=l),n;return fe(new Y(l),e[s])}if(f>e.length)return;if(i==0){if(t.b=f,n)return n.set(e.subarray(s,f),t.y),t.y+=l,n;return Pe(e,s,f)}if(i==2){var c=e[s],u=c&3,a=c>>2&3,p=c>>4,d=0,y=0;if(u<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(y=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new Y(t.m),C=b.length-p;if(u==0)b.set(e.subarray(s,s+=p),C);else if(u==1)fe(b,e[s++],C);else{var v=t.h;if(u==2){var m=Dt(e,s);d+=s-(s=m[0]),t.h=v=m[1]}else if(!v)q(0);(y?jt:ue)(e.subarray(s,s+=d),b.subarray(C),v)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var w=e[s++];if(w&3)q(0);var F=[Ot,Nt,Ut];for(var A=2;A>-1;--A){var T=w>>(A<<1)+2&3;if(T==1){var M=new Y([0,0,e[s++]]);F[A]={s:M.subarray(2,3),n:M.subarray(0,1),t:new be(M.buffer,0,1),b:0}}else if(T==2)r=pe(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(T==3){if(!t.t)q(0);F[A]=t.t[A]}}var k=t.t=F,h=k[0],S=k[1],_=k[2],j=e[f-1];if(!j)q(0);var D=(f<<3)-8+oe(j)-_.b,E=D>>3,L=0,O=(e[E]|e[E+1]<<8)>>(D&7)&(1<<_.b)-1;E=(D-=S.b)>>3;var H=(e[E]|e[E+1]<<8)>>(D&7)&(1<<S.b)-1;E=(D-=h.b)>>3;var W=(e[E]|e[E+1]<<8)>>(D&7)&(1<<h.b)-1;for(++g;--g;){var R=_.s[O],G=_.n[O],K=h.s[W],P=h.n[W],x=S.s[H],N=S.n[H];E=(D-=x)>>3;var U=1<<x,I=U+((e[E]|e[E+1]<<8|e[E+2]<<16|e[E+3]<<24)>>>(D&7)&U-1);E=(D-=Ie[K])>>3;var z=$t[K]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<Ie[K])-1);E=(D-=ke[R])>>3;var X=zt[R]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<ke[R])-1);if(E=(D-=G)>>3,O=_.t[O]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<G)-1),E=(D-=P)>>3,W=h.t[W]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<P)-1),E=(D-=N)>>3,H=S.t[H]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<N)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(X!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var A=0;A<X;++A)b[L+A]=b[C+A];L+=X,C+=X;var V=L-I;if(V<0){var B=-V,Q=t.e+V;if(B>z)B=z;for(var A=0;A<B;++A)b[L+A]=t.w[Q+A];L+=B,z-=B,V=0}for(var A=0;A<z;++A)b[L+A]=b[V+A];L+=z}if(L!=C)while(C<b.length)b[L++]=b[C++];else L=b.length;if(n)t.y+=L;else b=Pe(b,0,L)}else if(n){if(t.y+=p,C)for(var A=0;A<p;++A)b[A]=b[C+A]}else if(C)b=Pe(b,C);return t.b=f,b}q(2)},_t=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function xe(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ft(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Vt(e,i,t);if(!l)q(5);if(t)i.e=i.y;else n.push(l),o+=l.length,It(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return _t(n,o)}async function Ht(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(xe(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Je(e){return new TextDecoder().decode(await Ht(e))}var Qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function we(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Be=/^[A-Za-z][A-Za-z0-9_]*$/,Re=new Map;function Fe(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Re.has(r))Re.set(r,t);return r}function De(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Be.test(e))return Fe(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var et=/^~?\\s*moved\\s+to\\s+(.+)$/i,Gt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),lt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Wt=new Set(["model","submodel","configuration"]),Kt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function tt(e){let t=Kt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return lt.has(n)||Wt.has(n)?n:void 0}function Xt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let f=Xt(l);if(!f.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:f[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let u=f.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(u>0&&f[u+1])c.glossmap=f[u+1];if(t)c.next=!0;return c}var Yt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function qt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let u=s();if(u===null)return null;i[c]=+u}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),f=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:De(o),m:i,file:J(f)}}function nt(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=De(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:J(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function ct(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,f=null,c=[],u=null,a=()=>{if(!f)return;let m=Yt(f.chunks.join("")),g=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(l??=new Map).set(J(f.name),{name:f.name,bytes:m,...g?{mime:"image/png"}:{}}),f=null},p=!0,d=(m)=>{if(a(),o={name:J(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],u=null,p=!0},y=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=""},v=(m,g)=>{if(u){m.tex=u,u=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!g)m.fallback=!0}else m.tex=w.map};for(let m of e.split(`\n`)){let g=m.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(f||y)continue;if(!o)d(t);let T=g.slice(2).trimStart(),M=T.search(/\\s/),k={t:g.charCodeAt(0)-48,color:De(M<0?T:T.slice(0,M)),p:[],src:g};v(k,!1),o.cmds.push(k),p=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let T=2;while(g.charCodeAt(T)===32||g.charCodeAt(T)===9)T++;let M=T;while(M<g.length&&g.charCodeAt(M)!==32&&g.charCodeAt(M)!==9)M++;let k=g.slice(T,M);if(!Gt.has(k)){if(y||f)continue;if(!o)d(t);let h=g.slice(T),S={t:0,text:h};if(k.charCodeAt(0)===33)S.meta=k;if(u=null,p&&!o.org){let j=tt(h);if(j)o.org=j}let _=h.match(et);if(_&&!o.movedTo){let j=_[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(j))j+=".dat";o.movedTo=J(j)}o.cmds.push(S);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!f&&!y){let T=qt(g);if(T){if(!o)d(t);v(T,!1),o.cmds.push(T),p=!1;continue}}let w=g.split(/\\s+/);if(+w[0]===0){let T=g.slice(1).trim();if(w[1]==="FILE"){C(),y=!1,d(T.slice(5));continue}if(w[1]==="NOFILE"){a(),o=null,y=!0;continue}if(w[1]==="!DATA"){C(),a(),o=null,y=!1,f={name:T.slice(5).trim(),chunks:[]};continue}if(y)continue;if(f){if(w[1]==="!:")f.chunks.push(w.slice(2).join(""));continue}if(!o)d(t);let M={t:0,text:T};if(w[1]==="STEP")M.step=!0,c=[],u=null;else if(w[1]==="BFC")M.bfc=w.slice(2).join(" ");else if(w[1]==="ROTSTEP")if(M.meta="ROTSTEP",M.step=!0,c=[],u=null,(w[2]??"").toUpperCase()==="END")M.rotstep={x:0,y:0,z:0,mode:"END"};else{let h=(w[5]??"REL").toUpperCase();M.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:["REL","ABS","ADD"].includes(h)?h:"REL"}}else if(w[1]==="BUFEXCHG"){M.meta="BUFEXCHG";let h=(w[2]??"").toUpperCase();M.bufexchg={op:h==="RETRIEVE"?"RETRIEVE":"STORE",buf:w[3]??"A"}}else if(w[1]?.startsWith("!"))M.meta=w[1];if(p&&!o.org){let h=tt(T);if(h)o.org=h}if(w[1]==="!TEXMAP"){let h=(w[2]??"").toUpperCase();if(u=null,h==="START"||h==="NEXT"){let S=Zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),h==="NEXT");if(M.texmap={op:h,...S?{map:S}:{}},S)if((o.texmaps??=[]).push(S),h==="START")c.push({map:S,fallback:!1});else u=S}else if(h==="FALLBACK"){M.texmap={op:h};let S=c[c.length-1];if(S)S.fallback=!0}else if(h==="END")M.texmap={op:h},c.pop()}else if(w[1]==="!:"){u=null;let h=nt(w.slice(2));if(h)v(h,!0),M.geom=h}else u=null;let k=T.match(et);if(k&&!o.movedTo){let h=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(h))h+=".dat";o.movedTo=J(h)}o.cmds.push(M);continue}if(f||y)continue;if(!o)d(t);let A=nt(w);if(!A)continue;v(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Cn=Math.PI/180;function ut(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ft(e,t){let[n,r,s,o,i,l,f,c,u,a,p,d]=e,[y,b,C,v,m,g,w,F,A,T,M,k]=t;return[o*y+i*b+l*C+n,f*y+c*b+u*C+r,a*y+p*b+d*C+s,o*v+i*w+l*T,o*m+i*F+l*M,o*g+i*A+l*k,f*v+c*w+u*T,f*m+c*F+u*M,f*g+c*A+u*k,a*v+p*w+d*T,a*m+p*F+d*M,a*g+p*A+d*k]}var Ue=[0,0,0,1,0,0,0,1,0,0,0,1];var rt=new WeakMap,Jt=/^(s|8|48)\\//;function Oe(e,t){let n=e.files.get(J(t));if(!n)return"part";let r=rt.get(n);if(r)return r;if(n.org)r=lt.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Jt.test(s.file))?"part":"model";return rt.set(n,r),r}var st=new WeakMap;function pt(e){let t=st.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return st.set(e,t),t}var ot=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Re.get(e)??String(e):String(e),Qt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ot(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ot(e.color)} ${e.p.join(" ")}`,Ne=(e,t)=>`${J(e)}#${t}`;function en(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ne(e.name,t),cmds:n}}function mt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...en(e,t).cmds.map(Qt)].join(`\n`)+`\n`}function ze(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ht(e){let[t,n,r,s,o,i,l,f,c,u,a,p]=e,d=f*p-c*a,y=-(l*p-c*u),b=l*a-f*u,C=s*d+o*y+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let v=1/C,m=[d*v,-(o*p-i*a)*v,(o*c-i*f)*v,y*v,(s*p-i*u)*v,-(s*c-i*l)*v,b*v,-(s*a-o*u)*v,(s*f-o*l)*v];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var tn=(e)=>String(+e.toFixed(6)||0),it=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function gt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(tn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${it(t.texture)}${t.glossmap?" GLOSSMAP "+it(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${ze(r)}`,source:r}}var nn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function rn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),f=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*f,i,o*f+s*i*c,o*c-s*i*f,-s*l,s*f-o*i*c,s*c+o*i*f,o*l]}var at=new WeakMap;function dt(e){let t=at.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=rn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:nn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),at.set(e,n),n}var bt=999999,wt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Mt=new WeakMap,yt=new WeakMap;function sn(e,t){let n=yt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Mt.get(o)??"",l=i.indexOf("!COLOUR");return l<0?"":"0 "+i.slice(l).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},yt.set(t,n);let r=n.parts.get(e);if(!r){let s=J(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${ze(o)}`,source:o},n.parts.set(e,r)}return r}function on(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,f=0,c=(a,p)=>{let d=a.name+"#"+p,y=l.get(d);if(!y){let b;y=Object.assign(()=>b??=mt(a,p),{file:a,step:p}),l.set(d,y)}return y},u=(a,p,d,y,b,C,v,m,g=null,w=[],F=[],A=void 0,T=null)=>{let M=a.files.get(p);if(!M||v>r)return;let k=T,h=0,S=v>0?++f:0,_=i&&S?[...w,S]:w,j=i&&S?[...F,d]:F,D=i&&!g?new Map:null,E=-1,L=0,O=(P,x,N,U,I,z,X)=>{if(E!==h)E=h,L=0;let Z=D?.get(h+"|"+x);if(Z)return Z.n++,u(P,P===a?x:P.main,N,U,b+"/"+x,[...I,bt],v+1,z,[...I,bt],_,j,X,k);let V=[...I,L++],B=n.length;u(P,P===a?x:P.main,N,U,b+"/"+x,V,v+1,z,g,_,j,X,k),D?.set(h+"|"+x,{n:1,from:B,to:n.length})},H=dt(M),W=s?pt(M):[],R=0,G=(P,x,N,U,I,z,X,Z,V)=>{if(g)U=g;let B={part:P,color:x,m:N,step:U[0],steps:U,localStep:I,path:b};if(Z)B.colour=Z;if(S){if(B.sub=S,i)B.subPath=_,B.subMats=j}if(z)B.embedded=!0;if(X){let ee=gt(P,X);B.texPart=ee.name,B.texSource=ee.source}else if(V){let ee=sn(P,V);B.colPart=ee.name,B.colSource=ee.source}let Q=H[I];if(Q)B.view=Q;return n.push(B),B},K=(P)=>{while(R<W.length&&W[R]<=P){let x=W[R++];G(Ne(M.name,x),y,d,[...C,x],x,!1,null,A,T).source=c(M,x)}};for(let P of M.cmds){if(P.t===0&&P.step){h++;continue}let x=P;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){K(h);continue}if(x.t===0){if(x.meta==="!COLOUR"){let Q=ln(x.text);if(Q&&Q.code!==16&&Q.code!==24)Mt.set(Q,x.text),(k=new Map(k??[])).set(Q.code,Q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let N=x.color===16?y:x.color,U=x.color===16?A:k?.get(x.color),I=ft(d,x.m),z=[...C,h],X=o?x.tex??m:null,Z=X?ht(x.m):null,V=X&&Z?ut(X,Z):null;if(a.files.has(x.file)){if(Oe(a,x.file)==="model"){O(a,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!0,V,U,k);continue}let B=t.resolveModel?.(x.file);if(B){O(B,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!1,V,U,k)}if(K(1/0),D){for(let P of D.values())if(P.n>1)for(let x=P.from;x<P.to;x++)n[x].mult??=P.n}};if(Oe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ue],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return u(e,e.main,Ue,16,e.main,[],0,null),n}function At(e,t="main.ldr",n){return on(ct(e,t,{geometryText:!0}),n)}var an=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function $e(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function xt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=$e(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function ln(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,f=0,c={type:"default"},u=1;while(u<n.length){let a=n[u].toUpperCase(),p=n[u+1];if(a==="CODE")s=p!==void 0&&Be.test(p)?Fe(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,u+=2;else if(a==="VALUE"){let d=$e(p);if(d)o=d;u+=2}else if(a==="EDGE")i=$e(p)??p,u+=2;else if(a==="ALPHA")l=+p,u+=2;else if(a==="LUMINANCE")f=+p,u+=2;else if(a==="CHROME")c={type:"chrome"},u+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},u+=1;else if(a==="RUBBER")c={type:"rubber"},u+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},u+=1;else if(a==="METAL")c={type:"metal"},u+=1;else if(a==="MATERIAL"){let d=(n[u+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:y,next:b}=xt(n,u+2);c={type:"glitter",material:y},u=b}else if(d==="SPECKLE"){let{grain:y,next:b}=xt(n,u+2);c={type:"speckle",material:y},u=b}else if(d==="FABRIC"){let y=(n[u+2]||"").toUpperCase(),b=["VELVET","CANVAS","STRING","FUR"].includes(y)?y.toLowerCase():void 0;c={type:"fabric",kind:b},u+=b?3:2}else u=n.length}else if(an.has(a))u+=1;else u+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(f)?f:0,finish:c}}function cn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function je(e){let t=cn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function un(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(J(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(J(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var fn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?J(t.slice(14).join(" ")):null};function pn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function vt(e,t,n="main.ldr"){let r=un(e,n),s=new Map;for(let o of t){let i=J(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),f=[i];while(f.length)for(let u of r.get(f.pop())){let a=fn(u);if(a&&r.has(a)&&!l.has(a))l.add(a),f.push(a)}let c=[i,...[...l].filter((u)=>u!==i).sort()].map((u)=>"0 FILE "+(u===i?"":u)+`\n`+r.get(u).join(`\n`)).join(`\n`);s.set(i,`emb/${pn(c)}.dat`)}return s}var Ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Tt=new WeakMap;function Ve(e,t){let n=Tt.get(e);if(!n)Tt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],f=[];s.studs.forEach((p,d)=>{l.push(p[0]),f.push(p[1]);for(let y=0;y<12;y++)i[d*12+y]=p[2+y]});let c=null,u=0,a=0;if(s.mask){u=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:f,mask:c,nx:u,nz:a}),r}var le=1073741824;class _e{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,f=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,f[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&f[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var Me=(e,t,n)=>e>-le&&e<le&&t>-le&&t<le&&n>-le&&n<le,me=2147483647;function mn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function hn(e,t,n){let s=new Map,o=(L)=>{let O=s.get(L);if(O===void 0)s.set(L,O=mn(t,L));return O},i=[],l=[],f=[],c=[],u=[],a=[],p=[],d=[],y=new _e(e.length*2),b=[],C=[];for(let L=0;L<e.length;L++){let O=e[L],H=O.m,W=t.parts[O.part];if(!W||!W.mask||!Ct(H)||o(O.color))continue;let R=W.bbox,G=1/0,K=-1/0,P=1/0,x=-1/0;for(let I=0;I<2;I++)for(let z=0;z<2;z++){let X=I?R[3]:R[0],Z=z?R[5]:R[2],V=H[0]+H[3]*X+H[5]*Z,B=H[2]+H[9]*X+H[11]*Z;if(V<G)G=V;if(V>K)K=V;if(B<P)P=B;if(B>x)x=B}let N=u.length;i.push(G),l.push(K),f.push(P),c.push(x),u.push(L),a.push(Ve(t,O.part)),p.push(R[0]),d.push(R[2]);let U=Math.round((H[1]+R[4])*2);for(let I=Math.floor(G/40);I<=Math.floor(K/40);I++)for(let z=Math.floor(P/40);z<=Math.floor(x/40);z++){if(!Me(U,I,z))continue;let X=C.length;C.push(N),b.push(y.put(U,I,z,X))}}let v=[0,5,-5,5,-5],m=[0,5,5,-5,-5],g=NaN,w=NaN,F=NaN,A=-1,T=(L,O,H,W)=>{let R=Math.round(O*2),G=Math.floor(L/40),K=Math.floor(H/40);if(!Me(R,G,K))return me;let P=me;if(R!==g||G!==w||K!==F)g=R,w=G,F=K,A=y.get(R,G,K);for(let x=A;x>=0;x=b[x]){let N=C[x];if(u[N]===W||!(L-6>=i[N]-0.5&&L+6<=l[N]+0.5&&H-6>=f[N]-0.5&&H+6<=c[N]+0.5))continue;let U=e[u[N]].m,I=a[N],z=p[N],X=d[N],Z=L-U[0],V=O-U[1],B=H-U[2],Q=U[3]*Z+U[6]*V+U[9]*B,ee=U[5]*Z+U[8]*V+U[11]*B,{nx:ne,nz:ie,mask:ce}=I,ae=!0;for(let te=0;te<5;te++){let re=Math.floor((Q+v[te]-z)/20),se=Math.floor((ee+m[te]-X)/20);if(re<0||se<0||re>=ne||se>=ie||ce[re*ie+se]!==1){ae=!1;break}}if(ae){if(!n)return 0;let te=n[u[N]];if(te<P)P=te}}return P},M=0;for(let L of e){let O=Ve(t,L.part);if(O)M+=O.nStuds}let k=new Uint8Array(M),h=new Uint8Array(M),S=new _e(M),_=0,j=n?new Int32Array(M).fill(me):void 0;for(let L=0,O=0;L<e.length;L++){let H=e[L],W=Ve(t,H.part);if(!W)continue;let R=H.m,G=W.studM,K=R[0],P=R[1],x=R[2],N=R[3],U=R[4],I=R[5],z=R[6],X=R[7],Z=R[8],V=R[9],B=R[10],Q=R[11];for(let ee=0;ee<W.nStuds;ee++,O++){let ne=ee*12,ie=G[ne+4],ce=G[ne+7],ae=G[ne+10];if(!(Math.abs(z*ie+X*ce+Z*ae-1)<0.001&&Math.abs(N*ie+U*ce+I*ae)<0.001&&Math.abs(V*ie+B*ce+Q*ae)<0.001))continue;h[O]=1;let te=G[ne],re=G[ne+1],se=G[ne+2],He=K+N*te+U*re+I*se,Ge=P+z*te+X*re+Z*se,We=x+V*te+B*re+Q*se,Ke=T(He,Ge,We,L);if(Ke!==me){if(k[O]=1,_++,j)j[O]=Ke}let he=Math.round(He),ge=Math.round(Ge),de=Math.round(We);if(!Me(he,ge,de))continue;if(!n){S.put(he,ge,de,1);continue}let Xe=n[L],Ze=S.get(he,ge,de);if(Ze<0||Xe<Ze)S.put(he,ge,de,Xe)}}let D=new Uint8Array(e.length),E=n?new Int32Array(e.length).fill(me):void 0;for(let L=0;L<e.length;L++){let O=e[L],H=t.parts[O.part];if(!H||!H.under||!Ct(O.m)||o(O.color))continue;let W=H.bbox,R=Math.round((W[3]-W[0])/20),G=Math.round((W[5]-W[2])/20);if(!R||!G||R*G>4096)continue;let K=O.m,P=!0,x=0;for(let N=0;N<R&&P;N++)for(let U=0;U<G;U++){let I=W[0]+10+20*N,z=W[2]+10+20*U,X=K[0]+K[3]*I+K[5]*z,Z=K[2]+K[9]*I+K[11]*z,V=Math.round(X),B=Math.round(K[1]+W[4]),Q=Math.round(Z),ee=Me(V,B,Q)?S.get(V,B,Q):-1;if(ee<0){P=!1;break}if(ee>x)x=ee}if(P){if(D[L]=1,E)E[L]=x}}return{nStuds:M,studHidden:k,studUp:h,underHidden:D,studsHidden:_,studHideStep:j,underHideStep:E}}function gn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let y=t.colorTable?.[a.color],b=y?.hex??t.colors?.[a.color],C=y?je({alpha:y.alpha??255,luminance:y.luminance??0,finish:y.finish??{type:"default"}}):"default:op",v=je(p);if(d=b&&b.toUpperCase()===p.hex.toUpperCase()&&C===v?String(a.color):p.hex.toUpperCase()+"/"+v,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),f=l.map((a)=>wt(a.steps)),c=[...new Set(f)].sort(),u=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:f.map((a)=>u.get(a)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=gn(e,t,n);return hn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Se="https://ldr-demo.vercel.app/cdn/v1/",Ce=new Map,ve=new Map;function Te(e=Se,t=fetch){let n=Ce.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ce.delete(e)),Ce.set(e,n);return n}var dn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Le=(e,t)=>dn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Le(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Le(r,t)])):e;function bn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let y=new DataView(d).getUint32(0,!0),b=new Uint8Array(d,4+y),C=r;n.push(b),r+=b.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[m,g]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Le(g,C);for(let[m,g]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Le(g,C)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),f=(4-(4+l.length)%4)%4,c=4+l.length+f,u=new Uint8Array(c+r);new DataView(u.buffer).setUint32(0,l.length+f,!0),u.set(l,4),u.fill(32,4+l.length,c);let a=c;for(let p of n)u.set(p,a),a+=p.byteLength;return we(u.buffer)}async function yn(e,t={}){e=[...e];try{return await Lt(e,t)}catch(n){let r=t.cdn??Se,s=t.fetch??fetch;Ce.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await Lt(e,{...t,fetch:o})}catch{throw n}}}async function Lt(e,t){let n=t.cdn??Se,r=t.fetch??fetch,s=t.gap??16384,o=await Te(n,r),i=[...new Set([...e].map(J))],l=[],f=[];for(let m of i){if(ve.has(n+m))continue;let g=o.parts[m];if(g)f.push({name:m,off:g[0],len:g[1],file:g[2]??0});else l.push(m)}f.sort((m,g)=>m.file-g.file||m.off-g.off);let c=[];for(let m of f){let g=c[c.length-1];if(g&&g.file===m.file&&m.off-g.end<=s)g.end=Math.max(g.end,m.off+m.len),g.items.push(m);else c.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let u=0,a=0,p=0,d=new Map,y=async()=>{while(p<c.length){let m=c[p++],g=d.get(m.file);if(g)g=g.subarray(m.start,m.end);else{let w=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(a++,g=new Uint8Array(await w.arrayBuffer()),u+=g.byteLength,w.status===200)d.set(m.file,g),g=g.subarray(m.start,m.end)}for(let w of m.items){let F=xe(g.subarray(w.off-m.start,w.off-m.start+w.len)),A=F.buffer.slice(F.byteOffset,F.byteOffset+F.byteLength);ve.set(n+w.name,we(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},y));let b=i.filter((m)=>ve.has(n+m)).map((m)=>ve.get(n+m)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?bn(b,C):we(xn(C)),missing:l,requests:a,bytes:u}}function xn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function wn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function St(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let f=l.embedded?t.get(l.part):J(l.part),c=f?n.parts[f]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(f))i.add(f),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Ee extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Et(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Te(t.cdn??Se,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return Je(await h.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Qe(e)),f=At(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(f),await s;let u=vt(o,new Set(f.filter((h)=>h.embedded).map((h)=>h.part)),l),a=(h,S)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&S>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(h)=>new Ee({...h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),y="full";if(p){let h=St(f,u,await s);if(a(h.known?h.bodyTris:0,h.packBytes)){if(!t.lowCdn)throw d(h);let S=await Te(t.lowCdn,r).catch(()=>null);if(!S)throw d(h);let _=St(f,u,S);if(a(_.known?_.bodyTris:0,_.packBytes))throw d(_);y="low"}}let b=[...f.filter((h)=>!h.embedded).map((h)=>h.part),...u.values()],C=async()=>{let h=await yn(b,y==="low"?{...t,cdn:t.lowCdn}:t);for(let[S,_]of u){let j=h.pack.header.parts[_];if(j)h.pack.header.parts[S]=j}return{...h,packBytes:h.pack.buffer?.byteLength??h.pack.bytes??0,bodyTris:wn(f,h.pack)}},v=await C();if(p&&a(v.bodyTris,v.packBytes)&&y==="full"&&t.lowCdn&&await Te(t.lowCdn,r).then(()=>!0,()=>!1)){y="low";let h=v;v=await C(),v.requests+=h.requests,v.bytes+=h.bytes}if(p&&a(v.bodyTris,v.packBytes))throw d(v);let{pack:m,missing:g,requests:w,bytes:F}=v,A=new Map([...u].map(([h,S])=>[S,h])),T=g.map((h)=>A.get(h)??h),M=performance.now(),k=t.cull?Ae(f,m.header,t.textures!==!1):void 0;return{insts:f,pack:m,tier:y,missing:T,requests:w,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:M-c,...k?{cull:performance.now()-M}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Et(n,{...r,cull:!1,onParsed:(u)=>self.postMessage({id:t,insts:u})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),f=performance.now()-i,c=[];for(let u of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(u)c.push(u.buffer);self.postMessage({id:t,cull:l,ms:f},c)}catch(s){if(s instanceof Ee||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4382
4396
|
|
|
4383
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4397
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cdn.ts
|
|
4384
4398
|
var worker;
|
|
4385
4399
|
var seq = 0;
|
|
4386
4400
|
var pending = new Map;
|
|
@@ -4494,7 +4508,7 @@ async function loadModel(source, o = {}) {
|
|
|
4494
4508
|
timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
|
|
4495
4509
|
});
|
|
4496
4510
|
}
|
|
4497
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4511
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/library.ts
|
|
4498
4512
|
import { existsSync, readFileSync } from "fs";
|
|
4499
4513
|
import { join } from "path";
|
|
4500
4514
|
var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
|
|
@@ -4777,11 +4791,11 @@ class Library {
|
|
|
4777
4791
|
return insts;
|
|
4778
4792
|
}
|
|
4779
4793
|
}
|
|
4780
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4794
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/build-pack.ts
|
|
4781
4795
|
import fs3 from "node:fs";
|
|
4782
4796
|
import path3 from "node:path";
|
|
4783
4797
|
|
|
4784
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4798
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/resolver.ts
|
|
4785
4799
|
import fs from "node:fs";
|
|
4786
4800
|
import path from "node:path";
|
|
4787
4801
|
var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
|
|
@@ -5110,11 +5124,11 @@ function collectDeps(lib, refs) {
|
|
|
5110
5124
|
return out;
|
|
5111
5125
|
}
|
|
5112
5126
|
|
|
5113
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5127
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/compile.ts
|
|
5114
5128
|
import fs2 from "node:fs";
|
|
5115
5129
|
import path2 from "node:path";
|
|
5116
5130
|
|
|
5117
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5131
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/lod.ts
|
|
5118
5132
|
import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
|
|
5119
5133
|
await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
|
|
5120
5134
|
function reorderMesh(P, N, C, I) {
|
|
@@ -5306,7 +5320,7 @@ function lodChain(P, C, I) {
|
|
|
5306
5320
|
return out;
|
|
5307
5321
|
}
|
|
5308
5322
|
|
|
5309
|
-
// ../../../../../../../tmp/ldr-build-
|
|
5323
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/compile.ts
|
|
5310
5324
|
function loadColors(root) {
|
|
5311
5325
|
const map = new Map;
|
|
5312
5326
|
for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
|
|
@@ -6021,7 +6035,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
|
|
|
6021
6035
|
return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
|
|
6022
6036
|
}
|
|
6023
6037
|
|
|
6024
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6038
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/build-pack.ts
|
|
6025
6039
|
function packCompilerOpts(o) {
|
|
6026
6040
|
return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures };
|
|
6027
6041
|
}
|
|
@@ -6093,7 +6107,7 @@ function buildPack(o) {
|
|
|
6093
6107
|
const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
|
|
6094
6108
|
return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
|
|
6095
6109
|
}
|
|
6096
|
-
// ../../../../../../../tmp/ldr-build-
|
|
6110
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/node/promote.ts
|
|
6097
6111
|
var GEOM = /^\s*[2-5]\s/;
|
|
6098
6112
|
var REF = /^\s*1\s/;
|
|
6099
6113
|
var FILE = /^\s*0\s+FILE\s+(.+?)\s*$/i;
|
package/dist/parts-cdn.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface PartsCdnIndex {
|
|
|
10
10
|
archives: string[];
|
|
11
11
|
bytes: number;
|
|
12
12
|
colors: Record<string, string>;
|
|
13
|
+
/** Materials of the colours that aren't opaque plastic (alpha, luminance, finish), as a pack's `colorTable`; CDNs built before ldr 0.31 have none. */
|
|
14
|
+
colorTable?: Record<string, unknown>;
|
|
13
15
|
parts: Record<string, [offset: number, length: number, archive: number, bodyTris?: number]>;
|
|
14
16
|
}
|
|
15
17
|
export interface LoadPartsOptions {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ldr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
4
4
|
"description": "High-performance LEGO (LDraw) rendering for three.js: instanced parts packs, hidden stud/tube culling, low-detail studs, indexed edges, build steps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Evan Bacon",
|