brepjs-cad 0.154.0 → 0.156.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/package.json +1 -1
- package/viewer/dist/assets/{brepjs-D8ZLiJTj.js → brepjs-B7PT7jd2.js} +2 -2
- package/viewer/dist/assets/{index-Co8PIeMA.js → index-BqWemo1I.js} +1 -1
- package/viewer/dist/assets/{kernelWorker-2Y-yFa-0.js → kernelWorker-BPGnKZst.js} +1 -1
- package/viewer/dist/index.html +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,86 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.156.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.155.1...brepjs-cad-v0.156.0) (2026-08-17)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **brepjs-cad:** add airfoils.md feature recipe (swept fans/props/impellers) ([#1566](https://github.com/andymai/brepjs/issues/1566)) ([8c786db](https://github.com/andymai/brepjs/commit/8c786db69ead59edcdc9d0f8525e43324552e4db))
|
|
9
|
+
* **brepjs-cad:** aimed section cut for the design judge (Phase 3) ([#1543](https://github.com/andymai/brepjs/issues/1543)) ([40e5acd](https://github.com/andymai/brepjs/commit/40e5acd54318d768dc5a620403d17d43e358e698))
|
|
10
|
+
* **brepjs-cad:** decomposed, cross-checked design-judge rubric (Phase 1.5) ([#1539](https://github.com/andymai/brepjs/issues/1539)) ([8059b6d](https://github.com/andymai/brepjs/commit/8059b6d701ae5980e6bb11f51695aa102fe2bb43))
|
|
11
|
+
* **brepjs-cad:** deterministic body/interference metrics for the design judge (Phase 1) ([#1531](https://github.com/andymai/brepjs/issues/1531)) ([d296b54](https://github.com/andymai/brepjs/commit/d296b545f2d7084b861683d61b626ace4747a371))
|
|
12
|
+
* **brepjs-cad:** grade judge quality against a reference exemplar ([#1731](https://github.com/andymai/brepjs/issues/1731)) ([9d4aaeb](https://github.com/andymai/brepjs/commit/9d4aaeb8e4830c6be78668854730367194b6a9e5))
|
|
13
|
+
* **brepjs-cad:** kernel-anchored Set-of-Marks for the design judge ([#1545](https://github.com/andymai/brepjs/issues/1545)) ([2b6f5b4](https://github.com/andymai/brepjs/commit/2b6f5b436f2a73c96747cc71f83afc8715765cd0))
|
|
14
|
+
* **brepjs-cad:** reliable internal-bore detection for the design judge (keystone) ([#1542](https://github.com/andymai/brepjs/issues/1542)) ([0d780c3](https://github.com/andymai/brepjs/commit/0d780c3b73c2551dab2f04a6ff31bf9ec8cae2ab))
|
|
15
|
+
* **brepjs-cad:** surface fragmentation in verify --check (the [#1](https://github.com/andymai/brepjs/issues/1) design defect) ([#1560](https://github.com/andymai/brepjs/issues/1560)) ([45a4f6e](https://github.com/andymai/brepjs/commit/45a4f6e268331b7816cd9957fbdab4c0893b2000))
|
|
16
|
+
* **brepjs-cad:** xray internal-reveal shot for the design judge (Phase 2a) ([#1540](https://github.com/andymai/brepjs/issues/1540)) ([eca5bc9](https://github.com/andymai/brepjs/commit/eca5bc9ad20fc7947132d647952245cfe466a7f4))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Bug Fixes
|
|
20
|
+
|
|
21
|
+
* **brepjs-cad:** add a triangular-gusset recipe to the implement skill (bracket/enclosure eval) ([#1571](https://github.com/andymai/brepjs/issues/1571)) ([346d042](https://github.com/andymai/brepjs/commit/346d0423fefa3bd163f4075f69bf96d478543bf5))
|
|
22
|
+
* **brepjs-cad:** add the "realize the designed object" bar to the implement skill ([#1563](https://github.com/andymai/brepjs/issues/1563)) ([e150357](https://github.com/andymai/brepjs/commit/e1503570aaf271ebef1e39d48be9c70a5ffe8f03))
|
|
23
|
+
* **brepjs-cad:** bore detector misses full-cylinder through-holes ([#1551](https://github.com/andymai/brepjs/issues/1551)) ([#1586](https://github.com/andymai/brepjs/issues/1586)) ([b6d61eb](https://github.com/andymai/brepjs/commit/b6d61eb6d88e2e4a3aa1c55b78dc2e76315ebc02))
|
|
24
|
+
* **brepjs-cad:** close gear-teeth edge cases found by /eval-skill (ring, worm tip relief, GT2) ([#1548](https://github.com/andymai/brepjs/issues/1548)) ([4bd0494](https://github.com/andymai/brepjs/commit/4bd049401f3affcc3f38e3a31bb9520653a3e89c))
|
|
25
|
+
* **brepjs-cad:** code + hint the degenerate-edge (duplicate-vertex) verify failure ([#1550](https://github.com/andymai/brepjs/issues/1550)) ([502dffc](https://github.com/andymai/brepjs/commit/502dffc4a2ae495ae5c98b0c7966721abe0d5f48))
|
|
26
|
+
* **brepjs-cad:** exploded-joint legibility + disjoint-compound caveat (basics eval) ([#1565](https://github.com/andymai/brepjs/issues/1565)) ([9d06121](https://github.com/andymai/brepjs/commit/9d0612111a595e57fcfca6fd191ed9169fc2c062))
|
|
27
|
+
* **brepjs-cad:** handle brepjs/playground refs + summarize body relations in the digest ([#1547](https://github.com/andymai/brepjs/issues/1547)) ([b0acef0](https://github.com/andymai/brepjs/commit/b0acef0ad80cdd61f0d2683f1e6d0ece0cae028e))
|
|
28
|
+
* **brepjs-cad:** heal 6 implement-skill findings from the full-flywheel re-run ([#1568](https://github.com/andymai/brepjs/issues/1568)) ([f63bf3d](https://github.com/andymai/brepjs/commit/f63bf3d5a0aa638d06e11dd7e2c27e84dbf74746))
|
|
29
|
+
* **brepjs-cad:** heal implement skill from the eval flywheel (3 findings) ([#1552](https://github.com/andymai/brepjs/issues/1552)) ([51def82](https://github.com/andymai/brepjs/commit/51def82db4e0600e85f45e4dd828cc9caee58d15))
|
|
30
|
+
* **brepjs-cad:** heal implement skill from the full-corpus eval flywheel (4 findings) ([#1554](https://github.com/andymai/brepjs/issues/1554)) ([3cfc28e](https://github.com/andymai/brepjs/commit/3cfc28ed8b82c46330f1d75f1e98c13fd4d65a06))
|
|
31
|
+
* **brepjs-cad:** polish skill — bosses on shells must fuse, or they float (eval finding) ([#1553](https://github.com/andymai/brepjs/issues/1553)) ([07cbf93](https://github.com/andymai/brepjs/commit/07cbf93e47fbf880df53bc2a1cee05bf0d17e2d5))
|
|
32
|
+
* **brepjs-cad:** teach worm-wheel and rack tooth recipes; fix gear-build contradiction ([#1544](https://github.com/andymai/brepjs/issues/1544)) ([b0da85f](https://github.com/andymai/brepjs/commit/b0da85f218d463e0f1ef0ca8760cec54b4814b02))
|
|
33
|
+
* **core:** bump occt-wasm to 3.7.0 with borrowed adjacency handles ([#1821](https://github.com/andymai/brepjs/issues/1821)) ([4b76974](https://github.com/andymai/brepjs/commit/4b76974833f2d9900740fffcec2dd589de952ff9))
|
|
34
|
+
* **deps:** clear all remaining OSV findings to get main green ([#1917](https://github.com/andymai/brepjs/issues/1917)) ([2456ef4](https://github.com/andymai/brepjs/commit/2456ef40860129a59027d055978c002004104925))
|
|
35
|
+
* **release:** unbreak Vercel — repin brepjs-cad to brepjs >=18.0.0 ([#1711](https://github.com/andymai/brepjs/issues/1711)) ([78c780a](https://github.com/andymai/brepjs/commit/78c780a3ab2fcc78f26b32029df72795582e145c))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Reverts
|
|
39
|
+
|
|
40
|
+
* restore brepjs-cad brepjs dep floor — "*" did not fix the release churn ([#1854](https://github.com/andymai/brepjs/issues/1854)) ([194caba](https://github.com/andymai/brepjs/commit/194cabaa6c7196ee38a3b3ddaa68a881909ae263))
|
|
41
|
+
|
|
42
|
+
## [0.155.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.154.0...brepjs-cad-v0.155.0) (2026-08-17)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### Features
|
|
46
|
+
|
|
47
|
+
* **brepjs-cad:** add airfoils.md feature recipe (swept fans/props/impellers) ([#1566](https://github.com/andymai/brepjs/issues/1566)) ([8c786db](https://github.com/andymai/brepjs/commit/8c786db69ead59edcdc9d0f8525e43324552e4db))
|
|
48
|
+
* **brepjs-cad:** aimed section cut for the design judge (Phase 3) ([#1543](https://github.com/andymai/brepjs/issues/1543)) ([40e5acd](https://github.com/andymai/brepjs/commit/40e5acd54318d768dc5a620403d17d43e358e698))
|
|
49
|
+
* **brepjs-cad:** decomposed, cross-checked design-judge rubric (Phase 1.5) ([#1539](https://github.com/andymai/brepjs/issues/1539)) ([8059b6d](https://github.com/andymai/brepjs/commit/8059b6d701ae5980e6bb11f51695aa102fe2bb43))
|
|
50
|
+
* **brepjs-cad:** deterministic body/interference metrics for the design judge (Phase 1) ([#1531](https://github.com/andymai/brepjs/issues/1531)) ([d296b54](https://github.com/andymai/brepjs/commit/d296b545f2d7084b861683d61b626ace4747a371))
|
|
51
|
+
* **brepjs-cad:** grade judge quality against a reference exemplar ([#1731](https://github.com/andymai/brepjs/issues/1731)) ([9d4aaeb](https://github.com/andymai/brepjs/commit/9d4aaeb8e4830c6be78668854730367194b6a9e5))
|
|
52
|
+
* **brepjs-cad:** kernel-anchored Set-of-Marks for the design judge ([#1545](https://github.com/andymai/brepjs/issues/1545)) ([2b6f5b4](https://github.com/andymai/brepjs/commit/2b6f5b436f2a73c96747cc71f83afc8715765cd0))
|
|
53
|
+
* **brepjs-cad:** reliable internal-bore detection for the design judge (keystone) ([#1542](https://github.com/andymai/brepjs/issues/1542)) ([0d780c3](https://github.com/andymai/brepjs/commit/0d780c3b73c2551dab2f04a6ff31bf9ec8cae2ab))
|
|
54
|
+
* **brepjs-cad:** surface fragmentation in verify --check (the [#1](https://github.com/andymai/brepjs/issues/1) design defect) ([#1560](https://github.com/andymai/brepjs/issues/1560)) ([45a4f6e](https://github.com/andymai/brepjs/commit/45a4f6e268331b7816cd9957fbdab4c0893b2000))
|
|
55
|
+
* **brepjs-cad:** xray internal-reveal shot for the design judge (Phase 2a) ([#1540](https://github.com/andymai/brepjs/issues/1540)) ([eca5bc9](https://github.com/andymai/brepjs/commit/eca5bc9ad20fc7947132d647952245cfe466a7f4))
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
### Bug Fixes
|
|
59
|
+
|
|
60
|
+
* **brepjs-cad:** add a triangular-gusset recipe to the implement skill (bracket/enclosure eval) ([#1571](https://github.com/andymai/brepjs/issues/1571)) ([346d042](https://github.com/andymai/brepjs/commit/346d0423fefa3bd163f4075f69bf96d478543bf5))
|
|
61
|
+
* **brepjs-cad:** add the "realize the designed object" bar to the implement skill ([#1563](https://github.com/andymai/brepjs/issues/1563)) ([e150357](https://github.com/andymai/brepjs/commit/e1503570aaf271ebef1e39d48be9c70a5ffe8f03))
|
|
62
|
+
* **brepjs-cad:** bore detector misses full-cylinder through-holes ([#1551](https://github.com/andymai/brepjs/issues/1551)) ([#1586](https://github.com/andymai/brepjs/issues/1586)) ([b6d61eb](https://github.com/andymai/brepjs/commit/b6d61eb6d88e2e4a3aa1c55b78dc2e76315ebc02))
|
|
63
|
+
* **brepjs-cad:** close gear-teeth edge cases found by /eval-skill (ring, worm tip relief, GT2) ([#1548](https://github.com/andymai/brepjs/issues/1548)) ([4bd0494](https://github.com/andymai/brepjs/commit/4bd049401f3affcc3f38e3a31bb9520653a3e89c))
|
|
64
|
+
* **brepjs-cad:** code + hint the degenerate-edge (duplicate-vertex) verify failure ([#1550](https://github.com/andymai/brepjs/issues/1550)) ([502dffc](https://github.com/andymai/brepjs/commit/502dffc4a2ae495ae5c98b0c7966721abe0d5f48))
|
|
65
|
+
* **brepjs-cad:** correct spur-gear example flanks + add root fillet ([#1528](https://github.com/andymai/brepjs/issues/1528)) ([6971c6b](https://github.com/andymai/brepjs/commit/6971c6befa1fea36a8c2f3ee89c4aa20946020c7))
|
|
66
|
+
* **brepjs-cad:** exploded-joint legibility + disjoint-compound caveat (basics eval) ([#1565](https://github.com/andymai/brepjs/issues/1565)) ([9d06121](https://github.com/andymai/brepjs/commit/9d0612111a595e57fcfca6fd191ed9169fc2c062))
|
|
67
|
+
* **brepjs-cad:** handle brepjs/playground refs + summarize body relations in the digest ([#1547](https://github.com/andymai/brepjs/issues/1547)) ([b0acef0](https://github.com/andymai/brepjs/commit/b0acef0ad80cdd61f0d2683f1e6d0ece0cae028e))
|
|
68
|
+
* **brepjs-cad:** heal 6 implement-skill findings from the full-flywheel re-run ([#1568](https://github.com/andymai/brepjs/issues/1568)) ([f63bf3d](https://github.com/andymai/brepjs/commit/f63bf3d5a0aa638d06e11dd7e2c27e84dbf74746))
|
|
69
|
+
* **brepjs-cad:** heal implement skill — deep-stack bounds extremes aren't datums ([#1529](https://github.com/andymai/brepjs/issues/1529)) ([5ed366f](https://github.com/andymai/brepjs/commit/5ed366f266b3e6e50ae4b54d5779aa05453e894a))
|
|
70
|
+
* **brepjs-cad:** heal implement skill from the eval flywheel (3 findings) ([#1552](https://github.com/andymai/brepjs/issues/1552)) ([51def82](https://github.com/andymai/brepjs/commit/51def82db4e0600e85f45e4dd828cc9caee58d15))
|
|
71
|
+
* **brepjs-cad:** heal implement skill from the full-corpus eval flywheel (4 findings) ([#1554](https://github.com/andymai/brepjs/issues/1554)) ([3cfc28e](https://github.com/andymai/brepjs/commit/3cfc28ed8b82c46330f1d75f1e98c13fd4d65a06))
|
|
72
|
+
* **brepjs-cad:** make blind-judge reference adaptation render multi-body parts at scale ([#1530](https://github.com/andymai/brepjs/issues/1530)) ([18d4523](https://github.com/andymai/brepjs/commit/18d4523c85e1b22496bb5c0b8fb382a1146429c6))
|
|
73
|
+
* **brepjs-cad:** polish skill — bosses on shells must fuse, or they float (eval finding) ([#1553](https://github.com/andymai/brepjs/issues/1553)) ([07cbf93](https://github.com/andymai/brepjs/commit/07cbf93e47fbf880df53bc2a1cee05bf0d17e2d5))
|
|
74
|
+
* **brepjs-cad:** teach worm-wheel and rack tooth recipes; fix gear-build contradiction ([#1544](https://github.com/andymai/brepjs/issues/1544)) ([b0da85f](https://github.com/andymai/brepjs/commit/b0da85f218d463e0f1ef0ca8760cec54b4814b02))
|
|
75
|
+
* **core:** bump occt-wasm to 3.7.0 with borrowed adjacency handles ([#1821](https://github.com/andymai/brepjs/issues/1821)) ([4b76974](https://github.com/andymai/brepjs/commit/4b76974833f2d9900740fffcec2dd589de952ff9))
|
|
76
|
+
* **deps:** clear all remaining OSV findings to get main green ([#1917](https://github.com/andymai/brepjs/issues/1917)) ([2456ef4](https://github.com/andymai/brepjs/commit/2456ef40860129a59027d055978c002004104925))
|
|
77
|
+
* **release:** unbreak Vercel — repin brepjs-cad to brepjs >=18.0.0 ([#1711](https://github.com/andymai/brepjs/issues/1711)) ([78c780a](https://github.com/andymai/brepjs/commit/78c780a3ab2fcc78f26b32029df72795582e145c))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
### Reverts
|
|
81
|
+
|
|
82
|
+
* restore brepjs-cad brepjs dep floor — "*" did not fix the release churn ([#1854](https://github.com/andymai/brepjs/issues/1854)) ([194caba](https://github.com/andymai/brepjs/commit/194cabaa6c7196ee38a3b3ddaa68a881909ae263))
|
|
83
|
+
|
|
3
84
|
## [0.154.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.153.1...brepjs-cad-v0.154.0) (2026-08-17)
|
|
4
85
|
|
|
5
86
|
|
package/package.json
CHANGED
|
@@ -56,5 +56,5 @@ ${u.join(`
|
|
|
56
56
|
</Types>`),c(`_rels/.rels`,`<?xml version="1.0" encoding="UTF-8"?>
|
|
57
57
|
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
58
58
|
<Relationship Target="/3D/3dmodel.model" Id="rel0" Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel" />
|
|
59
|
-
</Relationships>`),c(`3D/3dmodel.model`,s)])}function VX(e){let t=[],n=/([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g,r;for(;(r=n.exec(e))!==null;){let e=r[1]??``,n=(r[2]??``).trim(),i=[];if(n){let e=/[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/g,t;for(;(t=e.exec(n))!==null;)i.push(parseFloat(t[0]))}t.push({command:e,args:i})}return t}function HX(e){return[e[0],-e[1]]}function UX(e,t,n,r){let i=0;for(;i<e.length;){let a=(n?t.cx:0)+(e[i]??0),o=(n?t.cy:0)+(e[i+1]??0);i===0?(t.sx=a,t.sy=o):r.push(nR(HX([t.cx,t.cy]),HX([a,o]))),t.cx=a,t.cy=o,i+=2}}function WX(e,t,n,r){let i=0;for(;i<e.length;){let a=(n?t.cx:0)+(e[i]??0),o=(n?t.cy:0)+(e[i+1]??0);r.push(nR(HX([t.cx,t.cy]),HX([a,o]))),t.cx=a,t.cy=o,i+=2}}function GX(e,t,n,r){for(let i of e){let e=n?t.cx+i:i;r.push(nR(HX([t.cx,t.cy]),HX([e,t.cy]))),t.cx=e}}function KX(e,t,n,r){for(let i of e){let e=n?t.cy+i:i;r.push(nR(HX([t.cx,t.cy]),HX([t.cx,e]))),t.cy=e}}function qX(e,t,n,r){let i=0;for(;i+5<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=a+(e[i]??0),c=o+(e[i+1]??0),l=a+(e[i+2]??0),u=o+(e[i+3]??0),d=a+(e[i+4]??0),f=o+(e[i+5]??0);r.push(cR(HX([t.cx,t.cy]),[HX([s,c]),HX([l,u])],HX([d,f]))),t.prevControlX=l,t.prevControlY=u,t.cx=d,t.cy=f,i+=6}}function JX(e,t,n,r){let i=0;for(;i+3<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=t.lastCmd,c=s===`C`||s===`S`?2*t.cx-t.prevControlX:t.cx,l=s===`C`||s===`S`?2*t.cy-t.prevControlY:t.cy,u=a+(e[i]??0),d=o+(e[i+1]??0),f=a+(e[i+2]??0),p=o+(e[i+3]??0);r.push(cR(HX([t.cx,t.cy]),[HX([c,l]),HX([u,d])],HX([f,p]))),t.prevControlX=u,t.prevControlY=d,t.cx=f,t.cy=p,t.lastCmd=`S`,i+=4}}function YX(e,t,n,r){let i=0;for(;i+3<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=a+(e[i]??0),c=o+(e[i+1]??0),l=a+(e[i+2]??0),u=o+(e[i+3]??0);r.push(cR(HX([t.cx,t.cy]),[HX([s,c])],HX([l,u]))),t.prevControlX=s,t.prevControlY=c,t.cx=l,t.cy=u,i+=4}}function XX(e,t,n,r){let i=0;for(;i+1<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=t.lastCmd,c=s===`Q`||s===`T`?2*t.cx-t.prevControlX:t.cx,l=s===`Q`||s===`T`?2*t.cy-t.prevControlY:t.cy,u=a+(e[i]??0),d=o+(e[i+1]??0);r.push(cR(HX([t.cx,t.cy]),[HX([c,l])],HX([u,d]))),t.prevControlX=c,t.prevControlY=l,t.cx=u,t.cy=d,t.lastCmd=`T`,i+=2}}function ZX(e,t,n,r,i){let a=Math.max(n,r),o=i?1:-1,s=t+2*o*a,c=[e-o*a,t+o*a],l=[e+o*a,t+o*a];try{return[rR(HX([e,t]),HX(c),HX([e,s])),rR(HX([e,s]),HX(l),HX([e,t]))]}catch{return[]}}function QX(e,t,n,r,i,a,o,s){let c=.5,l=e+c*(n-e),u=t+c*(r-t),d=n-e,f=r-t,p=Math.sqrt(d*d+f*f),m=Math.max(i,a),h=p/2,g=h<m?m-Math.sqrt(m*m-h*h):m,_=(o===s?-1:1)*(s?1:-1),v=-f/p,y=d/p,b=l+_*g*v,x=u+_*g*y;try{return[rR(HX([e,t]),HX([b,x]),HX([n,r]))]}catch{return[nR(HX([e,t]),HX([n,r]))]}}function $X(e,t,n,r){let i=0;for(;i+6<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=Math.abs(e[i]??0),c=Math.abs(e[i+1]??0),l=(e[i+3]??0)!==0,u=(e[i+4]??0)!==0,d=a+(e[i+5]??0),f=o+(e[i+6]??0);if(s===0||c===0)r.push(nR(HX([t.cx,t.cy]),HX([d,f])));else{let e=d-t.cx,n=f-t.cy;Math.sqrt(e*e+n*n)<1e-10?r.push(...ZX(t.cx,t.cy,s,c,u)):r.push(...QX(t.cx,t.cy,d,f,s,c,l,u))}t.cx=d,t.cy=f,i+=7}}function eZ(e,t){(Math.abs(e.cx-e.sx)>1e-10||Math.abs(e.cy-e.sy)>1e-10)&&t.push(nR(HX([e.cx,e.cy]),HX([e.sx,e.sy]))),e.cx=e.sx,e.cy=e.sy}function tZ(e){let t=VX(e),n=[],r={cx:0,cy:0,sx:0,sy:0,prevControlX:0,prevControlY:0,lastCmd:``};for(let{command:e,args:i}of t){let t=e===e.toLowerCase(),a=e.toUpperCase();switch(a){case`M`:UX(i,r,t,n);break;case`L`:WX(i,r,t,n);break;case`H`:GX(i,r,t,n);break;case`V`:KX(i,r,t,n);break;case`C`:qX(i,r,t,n);break;case`S`:JX(i,r,t,n);break;case`Q`:YX(i,r,t,n);break;case`T`:XX(i,r,t,n);break;case`A`:$X(i,r,t,n);break;case`Z`:eZ(r,n)}a!==`S`&&a!==`T`&&(r.lastCmd=a)}return n}function nZ(e){try{let t=tZ(e);return t.length===0?z(yD(`SVG_EMPTY_PATH`,`SVG path produced no curves`)):R(new ER(t))}catch(e){return z(yD(`SVG_PARSE_FAILED`,`Failed to parse SVG path: ${e instanceof Error?e.message:String(e)}`))}}function rZ(e){try{let t=/\bd\s*=\s*(?:"([^"]*)"|'([^']*)')/,n=[],r=e.toLowerCase(),i=0;for(;i<r.length;){let a=r.indexOf(`<path `,i);if(a===-1)break;let o=e.indexOf(`>`,a);if(o===-1)break;let s=e.slice(a,o+1);i=o+1;let c=t.exec(s),l=c?.[1]??c?.[2];if(!l)continue;let u=nZ(l);u.ok&&n.push(u.value)}return n.length===0?z(yD(`SVG_NO_PATHS`,`No <path> elements found in SVG`)):R(n)}catch(e){return z(yD(`SVG_IMPORT_FAILED`,`Failed to import SVG: ${e instanceof Error?e.message:String(e)}`))}}function iZ(e,t){try{let n=F(),r=e.map(e=>({shape:e.shape.wrapped,name:e.name,color:e.color?[...e.color]:void 0}));return R(n.exportSTEPConfigured(r,t))}catch(e){return z(yD(H.STEP_EXPORT_CONFIGURED_FAILED,`Configured STEP export failed`,e))}}async function aZ(e){try{let t=await e.arrayBuffer(),n=F().importSTEP(t);if(n.length===0)return z(yD(`STEP_IMPORT_FAILED`,`STEP file contains no valid geometry`));for(let e=1;e<n.length;e++){let t=n[e];t&&F().dispose(t)}return R(I(n[0]))}catch(e){return z(yD(`STEP_IMPORT_FAILED`,`Failed to load STEP file`,e))}}async function oZ(e){try{let t=await e.arrayBuffer(),n=F().importSTL(t);return n.IsNull()?z(yD(`STL_IMPORT_FAILED`,`Failed to create solid from STL mesh`)):R(I(n))}catch(e){return z(yD(`STL_IMPORT_FAILED`,`Failed to load STL file`,e))}}async function sZ(e){try{let t=await e.arrayBuffer(),n=F().importIGES(t);if(n.length===0)return z(yD(`IGES_IMPORT_FAILED`,`IGES file contains no valid geometry`));for(let e=1;e<n.length;e++){let t=n[e];t&&F().dispose(t)}return R(I(n[0]))}catch(e){return z(yD(`IGES_IMPORT_FAILED`,`Failed to load IGES file`,e))}}function cZ(e,t,n={}){let r=fJ(e,t);return new sJ((typeof n.plane==`string`||n.plane===void 0?r.sketchOnPlane(n.plane,n.origin):r.sketchOnPlane(n.plane)).map(e=>Array.isArray(e)?new Wq(e.map(Gq)):Gq(e)))}function lZ(e,t){let n=t?.fontSize??1,r=uJ(t?.fontFamily);if(!r)return z(W(H.NO_FONT_LOADED,`No font loaded. Call loadFont() first.`,void 0,void 0,`Load a font with loadFont() before calling textMetrics()`));let i=r.getAdvanceWidth(e,n),a=n/r.unitsPerEm,o=r.ascender*a,s=r.descender*a;return R({width:i,height:o-s,ascender:o,descender:s})}function uZ(e){let t=e?.fontSize??1,n=uJ(e?.fontFamily);if(!n)return z(W(H.NO_FONT_LOADED,`No font loaded. Call loadFont() first.`,void 0,void 0,`Load a font with loadFont() before calling fontMetrics()`));let r=t/n.unitsPerEm,i=n.ascender*r,a=n.descender*r,o=(n.tables?.os2?.sTypoLineGap??0)*r;return R({ascender:i,descender:a,unitsPerEm:n.unitsPerEm,lineHeight:i-a+o})}function dZ(e){return e.type===`init`}function fZ(e){return e.type===`operation`}function pZ(e){return e.type===`dispose`}function mZ(e){return e.type===`batch`}function hZ(e){return e.success}function gZ(e){return!e.success}function _Z(){return{pending:new Map}}function vZ(e,t){let n=new Map(e.pending);return n.set(t.id,t),{pending:n}}function yZ(e,t){let n=e.pending.get(t);if(!n)return{queue:e,task:void 0};let r=new Map(e.pending);return r.delete(t),{queue:{pending:r},task:n}}function bZ(e){return e.pending.size}function xZ(e){return e.pending.size===0}function SZ(e,t){for(let n of e.pending.values())n.reject(t);return{pending:new Map}}function CZ(e,t){let n=t.data,r=e.get(n.id);if(r){if(e.delete(n.id),hZ(n)){let e={};n.resultBrep!==void 0&&(e.resultBrep=n.resultBrep),n.resultData!==void 0&&(e.resultData=n.resultData),r.resolve(e)}else r.reject(Error(n.error))}}function wZ(e){let{worker:t,wasmUrl:n}=e,r=new Map,i=!1;function a(){return crypto.randomUUID()}function o(e){CZ(r,e)}t.addEventListener(`message`,o);function s(e){return i?Promise.reject(Error(`WorkerClient has been disposed`)):new Promise((n,i)=>{r.set(e.id,{resolve:n,reject:i}),t.postMessage(e)})}return{async init(){await s({id:a(),type:`init`,...n===void 0?{}:{wasmUrl:n}})},async execute(e,t,n){return s({id:a(),type:`operation`,operation:e,shapesBrep:t,parameters:n})},executeBatch(e){let t=e.length;return s({id:a(),type:`batch`,operations:e}).then(e=>{let n=e.resultData;if(!Array.isArray(n)||n.length!==t)throw Error(`Invalid batch response: expected ${t} results`);return n})},dispose(){i=!0;for(let e of r.values())e.reject(Error(`WorkerClient disposed`));r.clear(),t.removeEventListener(`message`,o);let e={id:a(),type:`dispose`};t.postMessage(e)}}}function TZ(){return{operations:new Map}}function EZ(e,t,n){let r=new Map(e.operations);return r.set(t,n),{operations:r}}function DZ(e){return e instanceof Error?e.message:String(e)}function OZ(e,t,n,r){let i=e.operations.get(t);if(!i)return{success:!1,error:`Unknown operation: ${t}`};try{let e=i(n,r);return{success:!0,...e.resultBrep===void 0?{}:{resultBrep:e.resultBrep},...e.resultData===void 0?{}:{resultData:e.resultData}}}catch(e){return{success:!1,error:DZ(e)}}}function kZ(e,t){return t.success?{id:e,success:!0,...t.resultBrep===void 0?{}:{resultBrep:t.resultBrep},...t.resultData===void 0?{}:{resultData:t.resultData}}:{id:e,success:!1,error:t.error??`operation failed`}}function AZ(e,t){let n=globalThis;n.onmessage=async r=>{let i=r.data;if(dZ(i)){try{await t(i.wasmUrl);let e={id:i.id,success:!0};n.postMessage(e)}catch(e){let t={id:i.id,success:!1,error:DZ(e)};n.postMessage(t)}return}if(fZ(i)){let t=OZ(e,i.operation,i.shapesBrep,i.parameters);n.postMessage(kZ(i.id,t));return}if(mZ(i)){let t=i.operations.map(t=>OZ(e,t.operation,t.shapesBrep,t.params)),r={id:i.id,success:!0,resultData:t};n.postMessage(r);return}if(pZ(i)){let e={id:i.id,success:!0};n.postMessage(e),n.close?.()}}}function jZ(e){let{workers:t,wasmUrl:n}=e;if(t.length===0)throw Error(`createWorkerPool requires at least one worker`);let r=t.map(e=>({client:wZ({worker:e,...n===void 0?{}:{wasmUrl:n}}),inFlight:0})),i=!1;function a(){return r.reduce((e,t)=>t.inFlight<e.inFlight?t:e)}function o(e,t,n){if(i)return Promise.reject(Error(`WorkerPool has been disposed`));let r=a();return r.inFlight+=1,r.client.execute(e,t,n).finally(()=>{--r.inFlight})}function s(){if(!i){i=!0;for(let e of r)e.client.dispose()}}return{size:r.length,async init(){try{await Promise.all(r.map(e=>e.client.init()))}catch(e){throw s(),e}},execute:o,executeBatch(e){return Promise.all(e.map(e=>o(e.operation,e.shapesBrep,e.params)))},inFlight(){return r.map(e=>e.inFlight)},dispose:s}}var MZ=Object.defineProperty,NZ=(e,t)=>{let n={};for(var r in e)MZ(n,r,{get:e[r],enumerable:!0});return t||MZ(n,Symbol.toStringTag,{value:`Module`}),n};function PZ(e){return`projectEdges`in e}function FZ(e){return`sketchNew`in e&&`sketchDof`in e}var IZ=1,LZ=2;function RZ(e,t){t===`commonFace`&&e.SetGlue(IZ),t===`sameFace`&&e.SetGlue(LZ)}function zZ(e){return typeof e==`number`}function BZ(e){if(typeof e==`number`)return!0;if(typeof e==`object`&&e){let t=e;return`distances`in t&&Array.isArray(t.distances)&&`selectedFace`in t||`distance`in t&&`angle`in t&&`selectedFace`in t}return!1}function VZ(e){return typeof e==`number`?!0:Array.isArray(e)&&e.length===2?e.every(zZ):!1}function HZ(e,t){let n=n=>{let r=e.findAll(n);if(r.length===0)return[];let i=0,a=NO(cO(jk(r)),t);for(let e=1;e<r.length;e++){let n=NO(cO(Ak(r,e)),t);n<a&&(a=n,i=e)}return[Ak(r,i)]},r=e=>{let t=n(e);return t.length===0?z(bD(`FINDER_NOT_UNIQUE`,`Finder expected a unique match but found 0 element(s)`)):R(jk(t))};return{...e,findAll:n,findUnique:r}}function UZ(e){return kL(`vertex`,e,UZ,(t,n)=>({nearestTo:t=>HZ(UZ(e),t),atPosition:(e,t=1e-4)=>n(n=>NO(cO(n),e)<t),withinBox:(e,t)=>n(n=>{let r=cO(n);return r[0]>=e[0]-1e-6&&r[0]<=t[0]+1e-6&&r[1]>=e[1]-1e-6&&r[1]<=t[1]+1e-6&&r[2]>=e[2]-1e-6&&r[2]<=t[2]+1e-6}),atDistance:(e,t=[0,0,0],r=1e-4)=>n(n=>{let i=cO(n);return Math.abs(NO(i,t)-e)<r})}))}function WZ(){return UZ([])}var GZ=new Map,KZ=null,qZ=null;function JZ(e,t){GZ.set(e,t),KZ||=e,e===KZ&&(qZ=t)}function YZ(e){if(!e&&qZ)return qZ;let t=e??KZ;if(!t)throw Error(`brepjs voxel engine not initialized. Call initVoxel() (or registerVoxel()) before using voxel operations.`);let n=GZ.get(t);if(!n)throw Error(`brepjs: voxel engine '${t}' is not registered.`);return n}function XZ(){return KZ}function ZZ(e,t=`voxel`){JZ(t,e),KZ=t,qZ=e}function QZ(e){if(e.vertices.length%3!=0)return W(`VOXEL_INVALID_MESH`,`mesh.vertices length must be a multiple of 3 (flat xyz).`);if(e.triangles.length%3!=0)return W(`VOXEL_INVALID_MESH`,`mesh.triangles length must be a multiple of 3.`);let t=e.vertices.length/3;for(let n=0;n<e.triangles.length;n++){let r=e.triangles[n];if(r===void 0||r>=t)return W(`VOXEL_INVALID_TRIANGLE_INDEX`,`triangle index ${r} at position ${n} is out of range for ${t} vertices.`)}return null}function $Z(e,t){return QZ(e)||(t.length%3==0?null:W(`VOXEL_INVALID_QUERIES`,`queries length must be a multiple of 3 (flat xyz).`))}function eQ(e){try{return R(YZ(e))}catch(e){return z(_D(`VOXEL_NOT_INITIALIZED`,e instanceof Error?e.message:`voxel engine not initialized`,e))}}function tQ(e,t,n){let r=$Z(e,t);if(r)return z(r);let i=eQ(n);return B(i)?i:R(i.value.winding_numbers(e.vertices,e.triangles,t))}function nQ(e,t,n){let r=$Z(e,t);if(r)return z(r);let i=eQ(n);if(B(i))return i;let a=i.value.points_inside(e.vertices,e.triangles,t);return R(Array.from(a,e=>e===1))}var rQ=48,iQ=2;function aQ(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`repairMesh requires a non-empty triangle mesh.`));let i=t?.resolution??rQ,a=t?.padding??iQ;if(!Number.isInteger(i)||i<1)return z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`));if(!Number.isInteger(a)||a<1)return z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`));let o=eQ(n);if(B(o))return o;try{try{var s=WT();let t=s.u(o.value.repair_mesh(e.vertices,e.triangles,i,a)),n=t.positions.length/3;return R({vertices:t.positions,normals:t.normals,triangles:t.indices,uvs:new Float32Array(n*2),faceGroups:[{start:0,count:t.indices.length/3,faceHash:0}]})}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_REPAIR_FAILED`,e instanceof Error?e.message:`voxel repair failed (grid too large?).`,e))}}var oQ=.001;function sQ(e,t=oQ){try{let n=bM(e,{tolerance:t});return n.vertices.length===0||n.triangles.length===0?z(vD(`VOXEL_SHAPE_MESH_EMPTY`,`shape tessellated to an empty triangle mesh.`)):R({vertices:n.vertices,triangles:n.triangles})}catch(e){return z(vD(`VOXEL_SHAPE_MESH_FAILED`,e instanceof Error?e.message:`failed to mesh shape for voxel op.`,e))}}var cQ=48,lQ=2,uQ={union:0,intersection:1,difference:2};function dQ(e){let t=e?.resolution??cQ,n=e?.padding??lQ;return!Number.isInteger(t)||t<1?z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function fQ(e){if(e.positions.length===0||e.indices.length===0)return z(vD(`VOXEL_DEGENERATE_RESULT`,`the voxel operation produced an empty mesh (over-shrunk offset or disjoint operands?).`));let t=e.positions.length/3;return R({vertices:e.positions,normals:e.normals,triangles:e.indices,uvs:new Float32Array(t*2),faceGroups:[{start:0,count:e.indices.length/3,faceHash:0}]})}function pQ(e,t,n,r){let i=QZ(e);if(i)return z(i);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`offsetMesh requires a non-empty triangle mesh.`));if(!Number.isFinite(t))return z(W(`VOXEL_INVALID_DISTANCE`,`distance must be a finite number.`));let a=dQ(n);if(B(a))return a;let o=eQ(r);if(B(o))return o;try{try{var s=WT();return fQ(s.u(o.value.offset_mesh(e.vertices,e.triangles,t,a.value.resolution,a.value.padding)))}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_OFFSET_FAILED`,e instanceof Error?e.message:`voxel offset failed (grid too large?).`,e))}}function mQ(e,t,n,r){let i=QZ(e);if(i)return z(i);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`shellMesh requires a non-empty triangle mesh.`));if(!Number.isFinite(t)||t<=0)return z(W(`VOXEL_INVALID_THICKNESS`,`thickness must be a finite number > 0.`));let a=dQ(n);if(B(a))return a;let o=eQ(r);if(B(o))return o;try{try{var s=WT();return fQ(s.u(o.value.shell_mesh(e.vertices,e.triangles,t,a.value.resolution,a.value.padding)))}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_SHELL_FAILED`,e instanceof Error?e.message:`voxel shell failed (grid too large?).`,e))}}function hQ(e,t,n,r,i){let a=QZ(e);if(a)return z(a);let o=QZ(t);if(o)return z(o);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBoolean requires a non-empty mesh for operand A.`));if(t.vertices.length===0||t.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBoolean requires a non-empty mesh for operand B.`));let s=uQ[n],c=dQ(r);if(B(c))return c;let l=eQ(i);if(B(l))return l;try{try{var u=WT();return fQ(u.u(l.value.voxel_boolean(e.vertices,e.triangles,t.vertices,t.triangles,s,c.value.resolution,c.value.padding)))}catch(e){u.e=e}finally{u.d()}}catch(e){return z(vD(`VOXEL_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel boolean failed (grid too large?).`,e))}}function gQ(e,t,n,r){let i=sQ(e);return B(i)?i:pQ(i.value,t,n,r)}function _Q(e,t,n,r){let i=sQ(e);return B(i)?i:mQ(i.value,t,n,r)}function vQ(e,t,n,r,i){let a=sQ(e);if(B(a))return a;let o=sQ(t);return B(o)?o:hQ(a.value,o.value,n,r,i)}var yQ=48,bQ=2,xQ={union:0,intersection:1,difference:2};function SQ(e){let t=e?.resolution??yQ,n=e?.padding??bQ;return!Number.isInteger(t)||t<1?z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function CQ(e){try{var t=WT();let n=e.contour(),{positions:r,normals:i,indices:a}=t.u({value:n,[Symbol.dispose](){n.free()}}).value;if(r.length===0||a.length===0)return z(vD(`VOXEL_DEGENERATE_RESULT`,`the voxel field contoured to an empty mesh (over-shrunk offset or disjoint operands?).`));let o=r.length/3;return R({vertices:r,normals:i,triangles:a,uvs:new Float32Array(o*2),faceGroups:[{start:0,count:a.length/3,faceHash:0}]})}catch(e){t.e=e}finally{t.d()}}function wQ(e){return{raw:e,delete(){e.free()}}}function TQ(e){return EQ(e)}function EQ(e){let t=rE(wQ(e)),n={get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()},boolean(e,t){return this.value.boolean(e.value,xQ[t]),n},offset(e){return this.value.offset(e),n},shell(e){return this.value.shell(e),n},reinit(){return this.value.reinit(),n},contour(){let e=CQ(this.value);if(B(e))throw Error(e.error.message);return e.value}};return n}function DQ(e){return!e.disposed}function OQ(){return z(W(`VOXEL_FIELD_DISPOSED`,`the voxel field handle has been disposed.`))}function kQ(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelField requires a non-empty triangle mesh.`));let i=SQ(t);if(B(i))return i;let a=eQ(n);if(B(a))return a;try{return R(EQ(new a.value.VoxelField(e.vertices,e.triangles,i.value.resolution,i.value.padding)))}catch(e){return z(vD(`VOXEL_FIELD_VOXELIZE_FAILED`,e instanceof Error?e.message:`voxel field voxelization failed (grid too large or non-dense?).`,e))}}function AQ(e,t,n,r,i){let a=QZ(e);if(a)return z(a);let o=QZ(t);if(o)return z(o);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBooleanField requires a non-empty mesh for operand A.`));if(t.vertices.length===0||t.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBooleanField requires a non-empty mesh for operand B.`));let s=SQ(r);if(B(s))return s;let c=eQ(i);if(B(c))return c;try{return R(EQ(c.value.VoxelField.boolean_of(e.vertices,e.triangles,t.vertices,t.triangles,xQ[n],s.value.resolution,s.value.padding)))}catch(e){return z(vD(`VOXEL_FIELD_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel field boolean failed (grid too large or non-dense?).`,e))}}function jQ(e,t,n){if(!DQ(e)||!DQ(t))return OQ();try{return e.value.boolean(t.value,xQ[n]),R(e)}catch(e){return z(vD(`VOXEL_FIELD_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel field boolean failed (dim mismatch?).`,e))}}function MQ(e,t){if(!DQ(e))return OQ();if(!Number.isFinite(t))return z(W(`VOXEL_INVALID_DISTANCE`,`distance must be a finite number.`));try{return e.value.offset(t),R(e)}catch(e){return z(vD(`VOXEL_FIELD_OFFSET_FAILED`,e instanceof Error?e.message:`voxel field offset failed.`,e))}}function NQ(e,t){if(!DQ(e))return OQ();if(!Number.isFinite(t)||t<=0)return z(W(`VOXEL_INVALID_THICKNESS`,`thickness must be a finite number > 0.`));try{return e.value.shell(t),R(e)}catch(e){return z(vD(`VOXEL_FIELD_SHELL_FAILED`,e instanceof Error?e.message:`voxel field shell failed.`,e))}}function PQ(e){if(!DQ(e))return OQ();try{return e.value.reinit(),R(e)}catch(e){return z(vD(`VOXEL_FIELD_REINIT_FAILED`,e instanceof Error?e.message:`voxel field reinit failed.`,e))}}function FQ(e){if(!DQ(e))return OQ();try{return CQ(e.value)}catch(e){return z(vD(`VOXEL_FIELD_CONTOUR_FAILED`,e instanceof Error?e.message:`voxel field contour failed.`,e))}}function IQ(e,t,n){let r=sQ(e);return B(r)?r:kQ(r.value,t,n)}function LQ(e,t,n,r,i){let a=sQ(e);if(B(a))return a;let o=sQ(t);return B(o)?o:AQ(a.value,o.value,n,r,i)}var RQ=48,zQ=2;function BQ(e){try{return R(YZ(e))}catch(e){return z(_D(`VOXEL_NOT_INITIALIZED`,e instanceof Error?e.message:`voxel engine not initialized`,e))}}function VQ(e){let t=e?.resolution??RQ,n=e?.padding??zQ;return!Number.isInteger(t)||t<1?z(W(`SDF_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`SDF_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function HQ(e){return{raw:e,delete(){e.free()}}}var UQ={offsetField(e){return WQ(this.value.offset_field(e.value))},roundField(e){return WQ(this.value.round_field(e.value))},shellField(e){return WQ(this.value.shell_field(e.value))},smoothUnionField(e,t){return WQ(this.value.smooth_union_field(e.value,t.value))}};function WQ(e){let t=rE(HQ(e));return{get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()},union(e){return WQ(this.value.union(e.value))},intersection(e){return WQ(this.value.intersection(e.value))},difference(e){return WQ(this.value.difference(e.value))},smoothUnion(e,t){return WQ(this.value.smooth_union(e.value,t))},smoothIntersection(e,t){return WQ(this.value.smooth_intersection(e.value,t))},smoothDifference(e,t){return WQ(this.value.smooth_difference(e.value,t))},offset(e){return WQ(this.value.offset(e))},round(e){return WQ(this.value.round(e))},shell(e){return WQ(this.value.shell(e))},onion(e){return WQ(this.value.onion(e))},...UQ,translate(e,t,n){return WQ(this.value.translate(e,t,n))},rotate(e,t,n,r){return WQ(this.value.rotate(e,t,n,r))},scale(e){return WQ(this.value.scale(e))},rasterize(e){return GQ(this.value,e)},rasterizeIn(e,t){return KQ(this.value,e,t)}}}function GQ(e,t){let n=VQ(t);if(B(n))return n;try{return R(TQ(e.rasterize(n.value.resolution,n.value.padding)))}catch(e){return qQ(e)}}function KQ(e,t,n){let r=VQ(n);if(B(r))return r;let i=JQ(t);if(i)return z(i);try{return R(TQ(e.rasterize_in(t.min[0],t.min[1],t.min[2],t.max[0],t.max[1],t.max[2],r.value.resolution,r.value.padding)))}catch(e){return qQ(e)}}function qQ(e){return z(vD(`SDF_RASTERIZE_FAILED`,e instanceof Error?e.message:`SDF rasterization failed (grid too large?).`,e))}function JQ(e){if(![...e.min,...e.max].every(e=>Number.isFinite(e)))return W(`SDF_INVALID_BOUNDS`,`bounds must be finite numbers.`);for(let t=0;t<3;t++)if(e.max[t]<=e.min[t])return W(`SDF_INVALID_BOUNDS`,`bounds max must exceed min on every axis.`);return null}function YQ(e,t){let n=BQ(t);if(B(n))return n;try{return R(WQ(e(n.value)))}catch(e){return z(vD(`SDF_BUILD_FAILED`,e instanceof Error?e.message:`SDF primitive construction failed.`,e))}}function XQ(e,t){return YQ(t=>t.Sdf.sphere(e),t)}function ZQ(e,t,n,r){return YQ(r=>r.Sdf.box_(e,t,n),r)}function QQ(e,t,n,r,i){return YQ(i=>i.Sdf.rounded_box(e,t,n,r),i)}function $Q(e,t,n){return YQ(n=>n.Sdf.cylinder(e,t),n)}function e$(e,t,n){return YQ(n=>n.Sdf.cone(e,t),n)}function t$(e,t,n,r){return YQ(r=>r.Sdf.capsule(e[0],e[1],e[2],t[0],t[1],t[2],n),r)}function n$(e,t,n){return YQ(n=>n.Sdf.torus(e,t),n)}function r$(e,t,n){return YQ(n=>n.Sdf.plane(e[0],e[1],e[2],t),n)}function i$(e){if(e.length<2)return z(W(`SDF_INVALID_SPINE`,`sweep spine needs at least 2 points.`));let t=new Float64Array(e.length*3);for(let n=0;n<e.length;n++){let r=e[n];if(!r.every(e=>Number.isFinite(e)))return z(W(`SDF_INVALID_SPINE`,`sweep spine coordinates must be finite.`));t[n*3]=r[0],t[n*3+1]=r[1],t[n*3+2]=r[2]}return R(t)}function a$(e,t,n,r){let i=i$(e);if(B(i))return i;let a=n?.closed??!1;return YQ(e=>e.Sdf.sweep(i.value,t.value,a),r)}var o$={gyroid:0,schwarzP:1,diamond:2};function s$(e,t,n,r){let i=o$[e];return i===void 0?z(W(`SDF_INVALID_LATTICE_KIND`,`unknown lattice kind: ${e}`)):YQ(e=>e.Sdf.lattice(i,t.value,n.value),r)}function c$(e,t,n){return YQ(n=>n.Sdf.strut_lattice(e,t.value),n)}function l$(e){return{raw:e,delete(){e.free()}}}function u$(e){let t=rE(l$(e));return{get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()}}}function d$(e,t){let n=BQ(t);if(B(n))return n;try{return R(u$(e(n.value)))}catch(e){return z(vD(`SDF_FIELD_BUILD_FAILED`,e instanceof Error?e.message:`scalar field construction failed.`,e))}}function f$(e,t){return d$(t=>t.ScalarField.constant(e),t)}function p$(e,t,n,r,i,a){return d$(a=>a.ScalarField.axial_ramp(e,t,n,r,i),a)}function m$(e,t,n,r,i,a,o){return d$(o=>o.ScalarField.radial_ramp(e[0],e[1],e[2],t,n,r,i,a),o)}function h$(e,t,n,r){return d$(r=>r.ScalarField.from_sdf(e.value,t,n),r)}function g$(e,t,n,r){return d$(r=>r.ScalarField.clamp(e.value,t,n),r)}var _$={gyroid:0,schwarzP:1,diamond:2},v$=48,y$=2;function b$(e){let t=_$[e.type];if(t===void 0)return z(W(`LATTICE_INVALID_TYPE`,`lattice type must be one of gyroid, schwarzP, diamond (got '${e.type}').`));if(!(e.period>0))return z(W(`LATTICE_INVALID_PERIOD`,`period must be > 0.`));if(!(e.thickness>0))return z(W(`LATTICE_INVALID_THICKNESS`,`thickness must be > 0.`));let n=e.resolution??v$,r=e.padding??y$;return!Number.isInteger(n)||n<1?z(W(`LATTICE_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(r)||r<1?z(W(`LATTICE_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({tag:t,period:e.period,thickness:e.thickness,resolution:n,padding:r})}function x$(e){let t=e.positions.length/3;return{vertices:e.positions,normals:e.normals,triangles:e.indices,uvs:new Float32Array(t*2),faceGroups:[{start:0,count:e.indices.length/3,faceHash:0}]}}function S$(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`LATTICE_EMPTY_MESH`,`latticeInfill requires a non-empty triangle mesh.`));let i=b$(t);if(B(i))return i;let a=eQ(n);if(B(a))return a;let{tag:o,period:s,thickness:c,resolution:l,padding:u}=i.value;try{try{var d=WT();return R(x$(d.u(a.value.lattice_infill(e.vertices,e.triangles,l,u,o,s,c))))}catch(e){d.e=e}finally{d.d()}}catch(e){return z(vD(`LATTICE_INFILL_FAILED`,e instanceof Error?e.message:`lattice infill failed (grid too large?).`,e))}}function C$(e,t,n){let r=sQ(e);return B(r)?r:S$(r.value,t,n)}function w$(e,t,n){for(let t=0;t<3;t++){let n=e.min[t],r=e.max[t];if(n===void 0||r===void 0||!(n<r))return z(W(`LATTICE_INVALID_BOUNDS`,`bounds.min must be strictly less than bounds.max on every axis (axis ${t}).`))}let r=b$(t);if(B(r))return r;let i=eQ(n);if(B(i))return i;let{tag:a,period:o,thickness:s,resolution:c,padding:l}=r.value,[u,d,f]=e.min,[p,m,h]=e.max;try{try{var g=WT();return R(x$(g.u(i.value.tpms_box(u,d,f,p,m,h,c,l,a,o,s))))}catch(e){g.e=e}finally{g.d()}}catch(e){return z(vD(`TPMS_LATTICE_FAILED`,e instanceof Error?e.message:`tpms lattice failed (grid too large?).`,e))}}var T$=14695981039346656037n,E$=1099511628211n,D$=18446744073709551615n;function O$(){return T$}function k$(e,t){return(e^BigInt(t&255))*E$&D$}function A$(e,t){let n=e;for(let e=0;e<t.length;e++)n=k$(n,t[e]??0);return n}var j$=new TextEncoder;function M$(e,t){return A$(e,j$.encode(t))}var N$=new ArrayBuffer(8),P$=new DataView(N$),F$=new Uint8Array(N$);function I$(e,t){return P$.setFloat64(0,Object.is(t,-0)?0:t),A$(e,F$)}function L$(e,t){let n=e,r=t&D$;for(let e=0;e<8;e++)n=k$(n,Number(r&255n)),r>>=8n;return n}function R$(e,t){let n=e,r=t|0;for(let e=0;e<4;e++)n=k$(n,r&255),r>>>=8;return n}function z$(e,t){return k$(e,+!!t)}function B$(e){return(e&D$).toString(16).padStart(16,`0`)}var V$=new Set;function H$(e){return M$(O$(),e)}function U$(e){return{kind:`NumLit`,value:e,structuralHash:I$(H$(`NumLit`),e),freeParams:V$}}function W$(e){let t=H$(`Vec3Lit`);for(let n of e)t=I$(t,n);return{kind:`Vec3Lit`,value:e,structuralHash:t,freeParams:V$}}function G$(e){let t=H$(`Vec2Lit`);for(let n of e)t=I$(t,n);return{kind:`Vec2Lit`,value:e,structuralHash:t,freeParams:V$}}function K$(e){return{kind:`Param`,name:e,structuralHash:M$(H$(`Param`),e),freeParams:new Set([e])}}function q$(e,t,n){let r=M$(H$(`BinOp`),e);return r=L$(r,t.structuralHash),r=L$(r,n.structuralHash),{kind:`BinOp`,op:e,a:t,b:n,structuralHash:r,freeParams:r1(t.freeParams,n.freeParams)}}function J$(e,t){let n=M$(H$(`UnaryOp`),e);return n=L$(n,t.structuralHash),{kind:`UnaryOp`,op:e,arg:t,structuralHash:n,freeParams:t.freeParams}}function Y$(e,t){let n=R$(H$(`Component`),t);return n=L$(n,e.structuralHash),{kind:`Component`,vec:e,index:t,structuralHash:n,freeParams:e.freeParams}}function X$(e,t){let n=R$(H$(`BuildVec`),e),r=new Set;for(let e of t){n=L$(n,e.structuralHash);for(let t of e.freeParams)r.add(t)}return{kind:`BuildVec`,dim:e,components:t,structuralHash:n,freeParams:r}}var Z$=(e,t)=>q$(`+`,e,t),Q$=(e,t)=>q$(`*`,e,t);function $$(e){return typeof e==`number`?U$(e):e}function e1(e,t){if(!Array.isArray(e))return e;let n=e;return n.every(e=>typeof e==`number`)?t===3?W$([n[0],n[1],n[2]]):G$([n[0],n[1]]):X$(t,n.map($$))}function t1(e){return e1(e,3)}function n1(e){return e1(e,2)}function r1(e,t){if(e.size===0)return t;if(t.size===0)return e;let n=new Set(e);for(let e of t)n.add(e);return n}function i1(e){return typeof e==`number`}function a1(e,t){return i1(e)?R(e):z(W(H.NULL_SHAPE_INPUT,`${t}: expected number, got ${Array.isArray(e)?`vector(${e.length})`:typeof e}`))}function o1(e,t,n){return Array.isArray(e)&&e.length===t?R(e):z(W(H.NULL_SHAPE_INPUT,`${n}: expected Vec${t}, got ${i1(e)?`number`:`vector(${e.length})`}`))}function s1(e,t){switch(e.kind){case`NumLit`:return R(e.value);case`Vec3Lit`:return R(e.value);case`Vec2Lit`:return R(e.value);case`Param`:{let n=t[e.name];return n===void 0?z(W(H.NULL_SHAPE_INPUT,`unbound param: ${e.name}`)):R(n)}case`BinOp`:return c1(e,t);case`UnaryOp`:return l1(e,t);case`Component`:return u1(e,t);case`BuildVec`:return d1(e,t)}}function c1(e,t){let n=s1(e.a,t);if(!n.ok)return n;let r=s1(e.b,t);if(!r.ok)return r;let i=a1(n.value,`BinOp(${e.op}).a`);if(!i.ok)return i;let a=a1(r.value,`BinOp(${e.op}).b`);if(!a.ok)return a;switch(e.op){case`+`:return R(i.value+a.value);case`-`:return R(i.value-a.value);case`*`:return R(i.value*a.value);case`/`:return a.value===0?z(W(H.NULL_SHAPE_INPUT,`BinOp(/): division by zero`)):R(i.value/a.value)}}function l1(e,t){let n=s1(e.arg,t);if(!n.ok)return n;let r=a1(n.value,`UnaryOp(${e.op})`);if(!r.ok)return r;let i=r.value;switch(e.op){case`neg`:return R(-i);case`sin`:return R(Math.sin(i));case`cos`:return R(Math.cos(i));case`sqrt`:return R(Math.sqrt(i));case`abs`:return R(Math.abs(i))}}function u1(e,t){let n=s1(e.vec,t);if(!n.ok)return n;if(i1(n.value))return z(W(H.NULL_SHAPE_INPUT,`Component: cannot index a scalar`));let r=n.value,i=r[e.index];return i===void 0?z(W(H.NULL_SHAPE_INPUT,`Component: index ${e.index} out of range for Vec${r.length}`)):R(i)}function d1(e,t){if(e.components.length!==e.dim)return z(W(H.NULL_SHAPE_INPUT,`BuildVec(${e.dim}): expected ${e.dim} components, got ${e.components.length}`));let n=[];for(let r of e.components){let e=s1(r,t);if(!e.ok)return e;let i=a1(e.value,`BuildVec.component`);if(!i.ok)return i;n.push(i.value)}return R(e.dim===2?[n[0],n[1]]:[n[0],n[1],n[2]])}function f1(e,t,n){let r=s1(e,t);return r.ok?a1(r.value,n):r}function p1(e,t,n){let r=s1(e,t);if(!r.ok)return r;let i=o1(r.value,3,n);if(!i.ok)return i;let[a,o,s]=i.value;return R([a,o,s])}function m1(e,t,n){let r=s1(e,t);if(!r.ok)return r;let i=o1(r.value,2,n);if(!i.ok)return i;let[a,o]=i.value;return R([a,o])}function h1(e,t){if(t.size===0)return Object.freeze({});let n={};for(let r of t){let t=e[r];t!==void 0&&(n[r]=t)}return Object.freeze(n)}function g1(e){return{kind:`Line`,to:n1(e)}}function _1(e,t,n){return{kind:`Arc`,to:n1(e),radius:$$(t),largeArc:n?.largeArc??!1,clockwise:n?.clockwise??!1}}function v1(e,t){return{kind:`Bezier`,controls:e.map(n1),to:n1(t)}}function y1(e,t,n){return{kind:`EllipseArc`,to:n1(e),radii:n1(t),rotation:$$(n?.rotation??0),largeArc:n?.largeArc??!1,clockwise:n?.clockwise??!1}}function b1(e,t){return{start:n1(e),segments:[...t]}}function x1(e,t){let n=R$(e,t.length),r=(e,t)=>L$(e,t.structuralHash);for(let e of t)if(n=M$(n,e.kind),n=r(n,e.to),e.kind===`Arc`)n=r(n,e.radius),n=z$(z$(n,e.largeArc),e.clockwise);else if(e.kind===`Bezier`){n=R$(n,e.controls.length);for(let t of e.controls)n=r(n,t)}else e.kind===`EllipseArc`&&(n=r(n,e.radii),n=r(n,e.rotation),n=z$(z$(n,e.largeArc),e.clockwise));return n}function S1(e){let t=[];for(let n of e)t.push(n.to),n.kind===`Arc`?t.push(n.radius):n.kind===`Bezier`?t.push(...n.controls):n.kind===`EllipseArc`&&t.push(n.radii,n.rotation);return t}function C1(e,t){return x1(L$(e,t.start.structuralHash),t.segments)}function w1(e){return[e.start,...S1(e.segments)]}function T1(e,t){return{start:t(e.start),segments:e.segments.map(e=>E1(e,t))}}function E1(e,t){switch(e.kind){case`Line`:return g1(t(e.to));case`Arc`:return _1(t(e.to),t(e.radius),{largeArc:e.largeArc,clockwise:e.clockwise});case`Bezier`:return v1(e.controls.map(t),t(e.to));case`EllipseArc`:return y1(t(e.to),t(e.radii),{rotation:t(e.rotation),largeArc:e.largeArc,clockwise:e.clockwise})}}var D1=new Set;function O1(e){return M$(O$(),e)}function k1(e,t){return L$(e,t.structuralHash)}function A1(e,t){return t===void 0?z$(e,!1):k1(z$(e,!0),t)}function j1(e,t){return t===void 0?z$(e,!1):I$(z$(e,!0),t)}function M1(...e){let t=new Set;for(let n of e)if(n)for(let e of n.freeParams)t.add(e);return t.size===0?D1:t}function N1(e,t,n){let r=$$(e),i=$$(t),a=$$(n),o=O1(`Box`);return o=k1(k1(k1(o,r),i),a),{kind:`Box`,x:r,y:i,z:a,structuralHash:o,freeParams:M1(r,i,a)}}function P1(e){let t=$$(e);return{kind:`Sphere`,radius:t,structuralHash:k1(O1(`Sphere`),t),freeParams:t.freeParams}}function F1(e,t){let n=$$(e),r=$$(t);return{kind:`Cylinder`,radius:n,height:r,structuralHash:k1(k1(O1(`Cylinder`),n),r),freeParams:M1(n,r)}}function I1(e,t,n){let r=$$(e),i=$$(t),a=$$(n),o=O1(`Cone`);return o=k1(k1(k1(o,r),i),a),{kind:`Cone`,radius1:r,radius2:i,height:a,structuralHash:o,freeParams:M1(r,i,a)}}function L1(e,t){let n=$$(e),r=$$(t);return{kind:`Torus`,majorRadius:n,minorRadius:r,structuralHash:k1(k1(O1(`Torus`),n),r),freeParams:M1(n,r)}}function R1(e){let t=e.map(t1),n=R$(O1(`Polygon`),t.length);for(let e of t)n=k1(n,e);return{kind:`Polygon`,points:t,structuralHash:n,freeParams:M1(...t)}}function z1(e){let t=$$(e);return{kind:`Circle`,radius:t,structuralHash:k1(O1(`Circle`),t),freeParams:t.freeParams}}function B1(e,t){let n=t1(e),r=t1(t);return{kind:`Line`,from:n,to:r,structuralHash:k1(k1(O1(`Line`),n),r),freeParams:M1(n,r)}}function V1(e){let t=t1(e);return{kind:`Vertex`,point:t,structuralHash:k1(O1(`Vertex`),t),freeParams:t.freeParams}}function H1(e){return{kind:`Empty`,output:e,structuralHash:M$(O1(`Empty`),e),freeParams:D1}}function U1(){return H1(`Solid`)}function W1(){return H1(`Face`)}function G1(){return H1(`Wire`)}function K1(e,t,n,r){return j1(k1(k1(O1(e),t),n),r)}function q1(e,t,n){return{kind:`Fuse`,a:e,b:t,tolerance:n,structuralHash:K1(`Fuse`,e,t,n),freeParams:M1(e,t)}}function J1(e,t,n){return{kind:`Cut`,a:e,b:t,tolerance:n,structuralHash:K1(`Cut`,e,t,n),freeParams:M1(e,t)}}function Y1(e,t,n){return{kind:`Intersect`,a:e,b:t,tolerance:n,structuralHash:K1(`Intersect`,e,t,n),freeParams:M1(e,t)}}function X1(e,t){let n=[...e],r=R$(O1(`FuseAll`),n.length);for(let e of n)r=k1(r,e);return r=j1(r,t),{kind:`FuseAll`,shapes:n,tolerance:t,structuralHash:r,freeParams:M1(...n)}}function Z1(e,t,n){let r=[...t],i=k1(O1(`CutAll`),e);i=R$(i,r.length);for(let e of r)i=k1(i,e);return i=j1(i,n),{kind:`CutAll`,base:e,tools:r,tolerance:n,structuralHash:i,freeParams:M1(e,...r)}}function Q1(e){return e===void 0?void 0:t1(e)}function $1(e,t){let n=t1(t);return{kind:`Translate`,target:e,vector:n,structuralHash:k1(k1(O1(`Translate`),e),n),freeParams:M1(e,n)}}function e0(e,t,n){let r=$$(t),i=Q1(n?.axis),a=Q1(n?.at),o=k1(k1(O1(`Rotate`),e),r);return o=A1(o,i),o=A1(o,a),{kind:`Rotate`,target:e,angle:r,axis:i,at:a,structuralHash:o,freeParams:M1(e,r,i,a)}}function t0(e,t,n){let r=$$(t),i=Q1(n?.center),a=k1(k1(O1(`Scale`),e),r);return a=A1(a,i),{kind:`Scale`,target:e,factor:r,center:i,structuralHash:a,freeParams:M1(e,r,i)}}function n0(e,t){let n=Q1(t?.normal),r=Q1(t?.at),i=k1(O1(`Mirror`),e);return i=A1(i,n),i=A1(i,r),{kind:`Mirror`,target:e,normal:n,at:r,structuralHash:i,freeParams:M1(e,n,r)}}function r0(e,t){let n=t1(t);return{kind:`Extrude`,profile:e,vector:n,structuralHash:k1(k1(O1(`Extrude`),e),n),freeParams:M1(e,n)}}function i0(e,t){let n=M$(e,t.origin);n=M$(n,t.faceRoles[0]),n=M$(n,t.faceRoles[1]);let r=t.hint;if(n=z$(n,r.length!==void 0),r.length!==void 0&&(n=I$(n,r.length)),n=z$(n,r.midpoint!==void 0),r.midpoint)for(let e of r.midpoint)n=I$(n,e);return n}function a0(e,t,n){let r={origin:t.origin,faceRoles:[t.faceRoles[0],t.faceRoles[1]],hint:{entityType:`edge`,length:t.hint.length,midpoint:t.hint.midpoint?[...t.hint.midpoint]:void 0}},i=$$(n),a=k1(O1(`Fillet`),e);return a=i0(a,r),a=k1(a,i),{kind:`Fillet`,target:e,ref:r,radius:i,structuralHash:a,freeParams:M1(e,i)}}function o0(e,t){let n=mA(t).map(e=>Math.min(1,Math.max(0,e))),r=k1(O1(`Color`),e);for(let e of n)r=I$(r,e);return{kind:`Color`,target:e,color:n,structuralHash:r,freeParams:e.freeParams}}function s0(e,t=[]){let n=[...t],r=C1(O1(`Profile`),e);r=R$(r,n.length);for(let e of n)r=C1(r,e);return{kind:`Profile`,outline:e,holes:n,structuralHash:r,freeParams:M1(...w1(e),...n.flatMap(e=>w1(e)))}}function c0(e,t,n){let r=n?.frenet??!1,i=k1(k1(O1(`Sweep`),e),t);return i=z$(i,r),{kind:`Sweep`,profile:e,spine:t,frenet:r,structuralHash:i,freeParams:M1(e,t)}}function l0(e,t){let n=n1(e),r=[...t],i=k1(O1(`Path`),n);return i=x1(i,r),{kind:`Path`,start:n,segments:r,structuralHash:i,freeParams:M1(n,...S1(r))}}function u0(e,t){let n=[...e],r=t?.ruled??!0,i=R$(O1(`Loft`),n.length);for(let e of n)i=k1(i,e);return i=z$(i,r),{kind:`Loft`,sections:n,ruled:r,structuralHash:i,freeParams:M1(...n)}}function d0(e,t=360,n){let r=$$(t),i=Q1(n?.axis),a=Q1(n?.at),o=k1(k1(O1(`Revolve`),e),r);return o=A1(o,i),o=A1(o,a),{kind:`Revolve`,profile:e,angle:r,axis:i,at:a,structuralHash:o,freeParams:M1(e,r,i,a)}}function f0(e){let t=[...e],n=R$(O1(`Compound`),t.length);for(let e of t)n=k1(n,e);return{kind:`Compound`,children:t,structuralHash:n,freeParams:M1(...t)}}function p0(e,t,n=!1){let r=t.map(e=>e.map(e=>[...e])),i=R$(z$(k1(O1(`Instance`),e),n),r.length);for(let e of r)for(let t of e.flat())i=I$(i,t);return{kind:`Instance`,source:e,placements:r,fuse:n,structuralHash:i,freeParams:M1(e)}}function m0(e){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:return`Solid`;case`Polygon`:return`Face`;case`Circle`:case`Line`:return`Edge`;case`Vertex`:return`Vertex`;case`Empty`:return e.output;case`Fuse`:case`Cut`:case`Intersect`:return m0(e.a);case`FuseAll`:return e.shapes[0]?m0(e.shapes[0]):`Solid`;case`CutAll`:return m0(e.base);case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:case`Color`:return m0(e.target);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Fillet`:return`Solid`;case`Profile`:return`Face`;case`Path`:return`Wire`;case`Compound`:return`Compound`;case`Instance`:return e.fuse?`Solid`:`Compound`}}function h0(e){let t=1/0,n=-1/0,r=1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.max(n,a),r=Math.min(r,o),i=Math.max(i,o);let a=(t+n)/2,o=(r+i)/2,s=e.map(([e,t])=>[e-a,t-o]);return b1(s[0]??[0,0],s.slice(1).map(e=>g1(e)))}function g0(e,t=0,n=0){return b1([t-e,n],[_1([t+e,n],e),_1([t-e,n],e)])}function _0(e,t){let n=e/2,r=t/2;return s0(h0([[-n,-r],[n,-r],[n,r],[-n,r]]))}function v0(e){return s0(g0(e))}function y0(e){let t=e.overallWidth,n=e.overallDepth,r=e.flangeThickness,i=e.webThickness,a=(t-i)/2,o=(t+i)/2;return s0(h0([[0,0],[t,0],[t,r],[o,r],[o,n-r],[t,n-r],[t,n],[0,n],[0,n-r],[a,n-r],[a,r],[0,r]]))}function b0(e){let t=e.overallDepth,n=e.webThickness,r=e.bottomFlangeWidth,i=e.bottomFlangeThickness,a=e.topFlangeWidth,o=e.topFlangeThickness,s=Math.max(r,a)/2;return s0(h0([[s-r/2,0],[s+r/2,0],[s+r/2,i],[s+n/2,i],[s+n/2,t-o],[s+a/2,t-o],[s+a/2,t],[s-a/2,t],[s-a/2,t-o],[s-n/2,t-o],[s-n/2,i],[s-r/2,i]]))}function x0(e){let t=e.legThickness;return s0(h0([[0,0],[e.width,0],[e.width,t],[t,t],[t,e.depth],[0,e.depth]]))}function S0(e){let t=e.flangeWidth,n=e.depth,r=e.flangeThickness,i=e.webThickness;return s0(h0([[(t-i)/2,0],[(t+i)/2,0],[(t+i)/2,n-r],[t,n-r],[t,n],[0,n],[0,n-r],[(t-i)/2,n-r]]))}function C0(e){let t=e.flangeWidth,n=e.depth,r=e.flangeThickness,i=e.webThickness;return s0(h0([[0,0],[t,0],[t,r],[i,r],[i,n-r],[t,n-r],[t,n],[0,n]]))}function w0(e){let t=e.flangeWidth/2,n=e.depth/2,r=e.webThickness/2,i=e.flangeThickness;return s0(h0([[-t,-n],[r,-n],[r,n-i],[t,n-i],[t,n],[-r,n],[-r,-n+i],[-t,-n+i]]))}function T0(e){let t=e.width,n=e.depth,r=e.wallThickness,i=e.girth;return s0(h0([[0,0],[t,0],[t,i],[t-r,i],[t-r,r],[r,r],[r,n-r],[t-r,n-r],[t-r,n-i],[t,n-i],[t,n],[0,n]]))}function E0(e,t){let n=e;return s0(b1([-n,0],[y1([n,0],[n,t]),y1([-n,0],[n,t])]))}function D0(e){let t=e.bottomXDim/2,n=e.yDim/2,r=-e.topXDim/2+e.topXOffset,i=e.topXDim/2+e.topXOffset;return s0(b1([-t,-n],[g1([t,-n]),g1([i,n]),g1([r,n])]))}function O0(e){let t=e.xDim/2,n=e.yDim/2,r=e.wallThickness;return s0(h0([[-t,-n],[t,-n],[t,n],[-t,n]]),[h0([[-(t-r),-(n-r)],[t-r,-(n-r)],[t-r,n-r],[-(t-r),n-r]])])}function k0(e){return s0(g0(e.radius),[g0(e.radius-e.wallThickness)])}function A0(e){return s0(b1(e[0]??[0,0],e.slice(1).map(e=>g1(e))))}function j0(e,t){return s0(b1(e[0]??[0,0],e.slice(1).map(e=>g1(e))),t.map(e=>b1(e[0]??[0,0],e.slice(1).map(e=>g1(e)))))}function M0(e,t){let n=f1(e.x,t.env,`Box.x`);if(!n.ok)return n;let r=f1(e.y,t.env,`Box.y`);if(!r.ok)return r;let i=f1(e.z,t.env,`Box.z`);return i.ok?R(hj(n.value,r.value,i.value)):i}function N0(e,t){let n=f1(e.radius,t.env,`Sphere.radius`);return n.ok?R(_j(n.value)):n}function P0(e,t){let n=f1(e.radius,t.env,`Cylinder.radius`);if(!n.ok)return n;let r=f1(e.height,t.env,`Cylinder.height`);return r.ok?R(gj(n.value,r.value)):r}function F0(e,t){let n=f1(e.radius1,t.env,`Cone.radius1`);if(!n.ok)return n;let r=f1(e.radius2,t.env,`Cone.radius2`);if(!r.ok)return r;let i=f1(e.height,t.env,`Cone.height`);return i.ok?R(vj(n.value,r.value,i.value)):i}function I0(e,t){let n=f1(e.majorRadius,t.env,`Torus.majorRadius`);if(!n.ok)return n;let r=f1(e.minorRadius,t.env,`Torus.minorRadius`);return r.ok?R(yj(n.value,r.value)):r}function L0(e,t){let n=[];for(let r of e.points){let e=p1(r,t.env,`Polygon.point`);if(!e.ok)return e;n.push(e.value)}return Fj(n)}function R0(e,t){let n=f1(e.radius,t.env,`Circle.radius`);return n.ok?R(Sj(n.value)):n}function z0(e,t){let n=p1(e.from,t.env,`Line.from`);if(!n.ok)return n;let r=p1(e.to,t.env,`Line.to`);return r.ok?R(xj(n.value,r.value)):r}function B0(e,t){let n=p1(e.point,t.env,`Vertex.point`);return n.ok?R(Ij(n.value)):n}function V0(e){return z(vD(H.NULL_SHAPE_INPUT,`${e}: empty result has no kernel representation`))}function H0(e,t,n){let r=e.evalNode(t);return r.ok?FE(r.value)?R(r.value):z(hD(H.CSG_NOT_3D,`${n}: operand did not produce a 3D shape`)):r}function U0(e,t){return{unsafe:!0,fuzzyValue:e.tolerance??t.tolerance}}function W0(e,t){if(e.a.kind===`Empty`)return t.evalNode(e.b);if(e.b.kind===`Empty`)return t.evalNode(e.a);let n=H0(t,e.a,`Fuse.a`);if(!n.ok)return n;let r=H0(t,e.b,`Fuse.b`);return r.ok?DA(n.value,r.value,U0(e,t)):r}function G0(e,t){if(e.a.kind===`Empty`)return V0(`Cut`);if(e.b.kind===`Empty`)return t.evalNode(e.a);let n=H0(t,e.a,`Cut.a`);if(!n.ok)return n;let r=H0(t,e.b,`Cut.b`);return r.ok?OA(n.value,r.value,U0(e,t)):r}function K0(e,t){if(e.a.kind===`Empty`||e.b.kind===`Empty`)return V0(`Intersect`);let n=H0(t,e.a,`Intersect.a`);if(!n.ok)return n;let r=H0(t,e.b,`Intersect.b`);return r.ok?kA(n.value,r.value,U0(e,t)):r}function q0(e,t,n){let r=[];for(let i of t){let t=H0(e,i,n);if(!t.ok)return t;r.push(t.value)}return R(r)}function J0(e,t){let n=e.shapes.filter(e=>e.kind!==`Empty`);if(n.length===0)return V0(`FuseAll`);if(n.length===1&&n[0])return t.evalNode(n[0]);let r=q0(t,n,`FuseAll.operand`);return r.ok?jA(r.value,U0(e,t)):r}function Y0(e,t){if(e.base.kind===`Empty`)return V0(`CutAll`);let n=e.tools.filter(e=>e.kind!==`Empty`);if(n.length===0)return t.evalNode(e.base);let r=H0(t,e.base,`CutAll.base`);if(!r.ok)return r;let i=q0(t,n,`CutAll.tool`);return i.ok?MA(r.value,i.value,U0(e,t)):i}function X0(e){return z(vD(H.NULL_SHAPE_INPUT,`${e}: cannot transform an Empty node`))}function Z0(e,t,n,r){return e?p1(e,t,n):R(r)}function Q0(e,t){let n=F(),{handle:r,dispose:i}=n.composeTransform(t),a;try{a=LE(n.locate(e.wrapped,r))}finally{i()}return bA(e)&&wA(e,a),a}function $0(e,t){if(e.target.kind===`Empty`)return X0(`Translate`);let n=p1(e.vector,t.env,`Translate.vector`);if(!n.ok)return n;let r=t.evalNode(e.target);return r.ok?R(Q0(r.value,[{type:`translate`,x:n.value[0],y:n.value[1],z:n.value[2]}])):r}function e2(e,t){if(e.target.kind===`Empty`)return X0(`Rotate`);let n=f1(e.angle,t.env,`Rotate.angle`);if(!n.ok)return n;let r=Z0(e.axis,t.env,`Rotate.axis`,[0,0,1]);if(!r.ok)return r;let i=Z0(e.at,t.env,`Rotate.at`,[0,0,0]);if(!i.ok)return i;let a=t.evalNode(e.target);return a.ok?R(Q0(a.value,[{type:`rotate`,angle:n.value,axis:r.value,center:i.value}])):a}function t2(e,t){if(e.target.kind===`Empty`)return X0(`Scale`);let n=f1(e.factor,t.env,`Scale.factor`);if(!n.ok)return n;let r=Z0(e.center,t.env,`Scale.center`,[0,0,0]);if(!r.ok)return r;let i=t.evalNode(e.target);return i.ok?R(oj(i.value,n.value,r.value)):i}function n2(e,t){if(e.target.kind===`Empty`)return X0(`Mirror`);let n=Z0(e.normal,t.env,`Mirror.normal`,[1,0,0]);if(!n.ok)return n;let r=Z0(e.at,t.env,`Mirror.at`,[0,0,0]);if(!r.ok)return r;let i=t.evalNode(e.target);return i.ok?R(aj(i.value,n.value,r.value)):i}function r2(e,t){let n=e.children.filter(e=>e.kind!==`Empty`);if(n.length===0)return z(vD(H.NULL_SHAPE_INPUT,`Compound: cannot materialize a compound with zero non-empty children`));let r=[];for(let e of n){let n=t.evalNode(e);if(!n.ok)return n;r.push(n.value)}return R(Lj(r))}function i2(){return z(vD(H.NULL_SHAPE_INPUT,`Empty: cannot materialize an Empty node directly — only valid as boolean/transform operand`))}function a2(e){return[[1,0,0,e[0]],[0,1,0,e[1]],[0,0,1,e[2]],[0,0,0,1]]}function o2(e){let t=e[0];return t!==void 0&&typeof t[0]==`number`}function s2(e,t,n){return{__instanced:!0,source:e,placements:t,grid:n,[Symbol.dispose](){e[Symbol.dispose]()}}}function c2(e){return typeof e==`object`&&!!e&&e.__instanced===!0}function l2(e,t){return s2(e,o2(t)?t.map(a2):t.map(e=>e.map(e=>[...e])))}function u2(e,t){let{cols:n,rows:r,pitchX:i,pitchY:a}=t;if(!Number.isInteger(n)||!Number.isInteger(r)||n<1||r<1)throw RangeError(`instanceGrid: cols and rows must be positive integers, got ${n}x${r}`);let o=[];for(let e=0;e<n;e++)for(let t=0;t<r;t++)o.push(a2([e*i,t*a,0]));return s2(e,o,{cols:n,rows:r,pitchX:i,pitchY:a})}function d2(e){return e.placements.length}function f2(e,t={}){let{source:n,placements:r,grid:i}=e;return r.length===0?z(W(`INSTANCE_EMPTY`,`materialize: instance has no placements`)):t.fuse?FE(n)?i?UF(n,[1,0,0],[0,1,0],i.cols,i.rows,i.pitchX,i.pitchY):p2(n,r,!0):z(W(`MATERIALIZE_NOT_3D`,`materialize({fuse:true}) requires a 3D source shape`)):p2(n,r,!1)}function p2(e,t,n){let r=[];for(let n of t){let t=dj(e,n);if(!t.ok){for(let e of r)e[Symbol.dispose]();return t}r.push(t.value)}let i=n?jA(r,{unsafe:!0}):R(tj(r));for(let e of r)(!i.ok||e!==i.value)&&e[Symbol.dispose]();return i}function m2(e,t){return{geometry:bM(e.source,t),instances:e.placements}}function h2(e,t){let n=t.evalNode(e.source);return n.ok?f2(l2(n.value,e.placements),{fuse:e.fuse}):n}function g2(e,t,n){let r=e.evalNode(t);if(!r.ok)return r;if(!jE(r.value))return z(hD(`CSG_NOT_FACE`,`${n}: node did not produce a Face`));let i=mO(r.value);return i.ok?_O(i.value)?R(i.value):z(hD(`CSG_NOT_FACE`,`${n}: face is not planar`)):z(hD(`CSG_NOT_FACE`,`${n}: ${i.error}`))}function _2(e,t){let n=p1(e.vector,t.env,`Extrude.vector`);if(!n.ok)return n;let r=g2(t,e.profile,`Extrude.profile`);return r.ok?Vq(r.value,n.value):r}function v2(e,t){let n=f1(e.angle,t.env,`Revolve.angle`);if(!n.ok)return n;if(n.value<=0)return z(W(`CSG_REVOLVE_ANGLE`,`Revolve.angle must be positive (degrees), got ${n.value}`));let r=Math.min(n.value,360),i=e.axis?p1(e.axis,t.env,`Revolve.axis`):R([0,0,1]);if(!i.ok)return i;let a=e.at?p1(e.at,t.env,`Revolve.at`):R([0,0,0]);if(!a.ok)return a;let o=g2(t,e.profile,`Revolve.profile`);return o.ok?Hq(o.value,a.value,i.value,r*Math.PI/180):o}function y2(e,t){try{var n=WT();if(e.sections.length<2)return z(W(`CSG_LOFT_SECTIONS`,`Loft requires at least 2 sections, got ${e.sections.length}`));let r=n.u(new iE),i=[];for(let[n,a]of e.sections.entries()){let e=g2(t,a,`Loft.sections[${n}]`);if(!e.ok)return e;let o=yk(e.value);r.register(o),i.push(o)}return qN(i,{ruled:e.ruled})}catch(e){n.e=e}finally{n.d()}}var b2=1e-9;function x2(e){return[e[0],e[1],0]}function S2(e){return z(W(`CSG_PATH_SEGMENT`,`contour segment: ${e}`))}function C2(e,t,n,r,i){let[a,o]=e,[s,c]=t,l=s-a,u=c-o,d=Math.hypot(l,u);if(d<b2)return S2(`Arc: coincident endpoints`);if(d>2*n+1e-6)return S2(`Arc: radius ${n} too small for chord ${d}`);let f=Math.sqrt(Math.max(0,n*n-d/2*(d/2))),p=l/d,m=u/d,h=i===r?1:-1,g=(a+s)/2+h*f*-m,_=(o+c)/2+h*f*p,v=Math.atan2(o-_,a-g),y=Math.atan2(c-_,s-g);if(i)for(;y>=v-b2;)y-=2*Math.PI;else for(;y<=v+b2;)y+=2*Math.PI;let b=(v+y)/2;return R([g+n*Math.cos(b),_+n*Math.sin(b)])}function w2(e,t,n,r,i,a){let o=!a,[s,c]=n;if(s<=0||c<=0)return S2(`EllipseArc: non-positive radius`);let l=Math.cos(r),u=Math.sin(r),d=(e[0]-t[0])/2,f=(e[1]-t[1])/2,p=l*d+u*f,m=-u*d+l*f,h=p*p/(s*s)+m*m/(c*c);if(h>1){let e=Math.sqrt(h);s*=e,c*=e}let g=s*s*c*c-s*s*m*m-c*c*p*p,_=s*s*m*m+c*c*p*p;if(_<b2)return S2(`EllipseArc: coincident endpoints`);let v=(i===o?-1:1)*Math.sqrt(Math.max(0,g/_)),y=v*(s*m/c),b=v*(-(c*p)/s),x=l*y-u*b+(e[0]+t[0])/2,S=u*y+l*b+(e[1]+t[1])/2,C=Math.atan2((m-b)/c,(p-y)/s),w=Math.atan2((-m-b)/c,(-p-y)/s)-C;!o&&w>0&&(w-=2*Math.PI),o&&w<0&&(w+=2*Math.PI);let ee=w>=0?C:C+w,te=w>=0?C+w:C;return R({center:[x,S],theta1:ee,theta2:te,rx:s,ry:c})}function T2(e,t,n){if(t.kind!==`EllipseArc`)return S2(`internal: not an ellipse segment`);let r=m1(t.to,n.env,`Path.EllipseArc.to`);if(!r.ok)return r;let i=m1(t.radii,n.env,`Path.EllipseArc.radii`);if(!i.ok)return i;let a=f1(t.rotation,n.env,`Path.EllipseArc.rotation`);if(!a.ok)return a;let o=a.value*Math.PI/180,s=w2(e,r.value,i.value,o,t.largeArc,t.clockwise);if(!s.ok)return s;let{center:c,theta1:l,theta2:u,rx:d,ry:f}=s.value,p,m;if(d>=f?(p=Bk(d,f,l,u,x2(c),[0,0,1]),m=o):(p=Bk(f,d,l-Math.PI/2,u-Math.PI/2,x2(c),[0,0,1]),m=o+Math.PI/2),!p.ok)return p;let h=p.value;if(Math.abs(m)>b2)try{var g=WT();let e=E2(g.u(h),m*180/Math.PI,c);if(!e.ok)return e;h=e.value}catch(e){g.e=e}finally{g.d()}if(t.clockwise)try{var _=WT();h=oM(_.u(h))}catch(e){_.e=e}finally{_.d()}return R(h)}function E2(e,t,n){let r=F(),{handle:i,dispose:a}=r.composeTransform([{type:`rotate`,angle:t,axis:[0,0,1],center:[n[0],n[1],0]}]);try{return R(LE(r.locate(e.wrapped,i)))}catch(e){return z(U(`CSG_PATH_ELLIPSE_ROTATE`,`Path: kernel cannot relocate ellipse-arc edges`,e,{operation:`evalPath`}))}finally{a()}}function D2(e,t){return m1(e.to,t.env,`Path.${e.kind}.to`)}function O2(e,t,n){switch(t.kind){case`Line`:{let r=D2(t,n);return r.ok?Math.hypot(r.value[0]-e[0],r.value[1]-e[1])<b2?S2(`Line: zero length`):R(Fk(x2(e),x2(r.value))):r}case`Arc`:{let r=D2(t,n);if(!r.ok)return r;let i=f1(t.radius,n.env,`Path.Arc.radius`);if(!i.ok)return i;let a=C2(e,r.value,i.value,t.largeArc,t.clockwise);return a.ok?R(zk(x2(e),x2(a.value),x2(r.value))):a}case`Bezier`:{let r=D2(t,n);if(!r.ok)return r;let i=[];for(let e of t.controls){let t=m1(e,n.env,`Path.Bezier.control`);if(!t.ok)return t;i.push(x2(t.value))}return Uk([x2(e),...i,x2(r.value)])}case`EllipseArc`:return T2(e,t,n)}}function k2(e,t,n,r,i,a){if(t.length===0)return z(W(`CSG_PATH_SEGMENT`,`${a}: at least one segment required`));let o=m1(e,n.env,`${a}.start`);if(!o.ok)return o;let s=[],c=o.value;for(let e of t){let t=O2(c,e,n);if(!t.ok)return t;r.register(t.value),s.push(t.value);let i=D2(e,n);if(!i.ok)return i;c=i.value}if(i&&Math.hypot(c[0]-o.value[0],c[1]-o.value[1])>b2){let e=Fk(x2(c),x2(o.value));r.register(e),s.push(e)}return Gk(s)}function A2(e,t){try{var n=WT();let r=n.u(new iE);return k2(e.start,e.segments,t,r,!1,`Path`)}catch(e){n.e=e}finally{n.d()}}function j2(e,t){try{var n=WT();let r=g2(t,e.profile,`Sweep.profile`);if(!r.ok)return r;let i=t.evalNode(e.spine);if(!i.ok)return i;let a=n.u(new iE),o;if(AE(i.value))o=i.value;else if(kE(i.value)){let e=Gk([i.value]);if(!e.ok)return e;a.register(e.value),o=e.value}else return z(hD(`CSG_SWEEP_SPINE`,`Sweep.spine: node did not produce a Wire or Edge`));let s=yk(r.value);a.register(s);let c=zN(s,o,{frenet:e.frenet});if(!c.ok)return c;if(Array.isArray(c.value)){for(let e of c.value)e[Symbol.dispose]();return z(hD(`CSG_SWEEP_SPINE`,`Sweep: unexpected shell-mode result`))}return R(c.value)}catch(e){n.e=e}finally{n.d()}}function M2(e,t){let n=pO(e);return n.ok?vO(n.value)?R(n.value):z(W(`CSG_PROFILE_CONTOUR`,`${t}: contour is not planar`)):z(W(`CSG_PROFILE_CONTOUR`,`${t}: ${n.error}`))}function N2(e,t){try{var n=WT();let r=n.u(new iE),i=(e,n)=>{let i=k2(e.start,e.segments,t,r,!0,n);return i.ok?(r.register(i.value),M2(i.value,n)):i},a=i(e.outline,`Profile.outline`);if(!a.ok)return a;let o=[];for(let[t,n]of e.holes.entries()){let e=i(n,`Profile.holes[${t}]`);if(!e.ok)return e;o.push(e.value)}return Mj(a.value,o.length>0?o:void 0)}catch(e){n.e=e}finally{n.d()}}function P2(e,t){let n=t.evalNode(e.target);if(!n.ok)return n;let r=F(),{handle:i,dispose:a}=r.composeTransform([{type:`translate`,x:0,y:0,z:0}]),o;try{o=I(r.locate(n.value.wrapped,i))}finally{a()}return bA(n.value)&&wA(n.value,o),R(hA(o,[...e.color]))}function F2(e,t){let n=f1(e.radius,t.env,`Fillet.radius`);if(!n.ok)return n;if(n.value<=0)return z(W(`CSG_FILLET_RADIUS`,`Fillet.radius must be positive, got ${n.value}`));let r=t.evalNode(e.target);if(!r.ok)return r;if(!NE(r.value))return z(W(`CSG_FILLET_TARGET`,`Fillet.target did not produce a Solid`));let i=gO(r.value);if(!i.ok)return z(W(`CSG_FILLET_TARGET`,i.error));let a=OF(e.ref,r.value);return a.ok?kE(a.entity)?qM(i.value,[a.entity],n.value):z(W(`CSG_FILLET_REF`,`Fillet.ref resolved to a non-edge`)):z(W(`CSG_FILLET_REF`,`Fillet.ref did not resolve: ${a.reason}`))}function I2(e,t){switch(e.kind){case`Box`:return M0(e,t);case`Sphere`:return N0(e,t);case`Cylinder`:return P0(e,t);case`Cone`:return F0(e,t);case`Torus`:return I0(e,t);case`Polygon`:return L0(e,t);case`Circle`:return R0(e,t);case`Line`:return z0(e,t);case`Vertex`:return B0(e,t);case`Empty`:return i2();case`Fuse`:return W0(e,t);case`Cut`:return G0(e,t);case`Intersect`:return K0(e,t);case`FuseAll`:return J0(e,t);case`CutAll`:return Y0(e,t);case`Translate`:return $0(e,t);case`Rotate`:return e2(e,t);case`Scale`:return t2(e,t);case`Mirror`:return n2(e,t);case`Compound`:return r2(e,t);case`Instance`:return h2(e,t);case`Extrude`:return _2(e,t);case`Revolve`:return v2(e,t);case`Loft`:return y2(e,t);case`Path`:return A2(e,t);case`Sweep`:return j2(e,t);case`Profile`:return N2(e,t);case`Color`:return P2(e,t);case`Fillet`:return F2(e,t)}}function L2(e,t){if(typeof t==`number`)return I$(z$(e,!1),t);let n=z$(e,!0);n=R$(n,t.length);for(let e of t)n=I$(n,e);return n}function R2(e,t){if(t.size===0)return O$();let n=h1(e,t),r=Object.keys(n).sort(),i=O$();for(let e of r){i=M$(i,e);let t=n[e];t!==void 0&&(i=L2(i,t))}return i}function z2(e,t,n,r){let i=R2(t,e.freeParams),a=r===void 0?`d`:I$(O$(),r).toString(16);return`${B$(e.structuralHash)}:${n}:${B$(i)}:${a}`}var B2=[1,0,0,0];function V2(e,t){let n=f1(e.angle,t,`evaluateMesh.peelRigid`);if(!n.ok)return null;let r=e.axis?p1(e.axis,t,`evaluateMesh.peelRigid`):R([0,0,1]);if(!r.ok)return null;let i=e.at?p1(e.at,t,`evaluateMesh.peelRigid`):R([0,0,0]);return i.ok?{angle:n.value,axis:r.value,center:i.value}:null}function H2(e,t){let n=e,r=B2,i=[0,0,0];for(;;)if(n.kind===`Translate`){let e=p1(n.vector,t,`evaluateMesh.peelRigid`);if(!e.ok)break;let a=LF(r,e.value);i=[i[0]+a[0],i[1]+a[1],i[2]+a[2]],n=n.target}else if(n.kind===`Rotate`){let e=V2(n,t);if(!e)break;let a=RF(e.axis,e.angle*Math.PI/180),o=BF(r,a),s=LF(r,e.center),c=LF(o,e.center);i=[i[0]+s[0]-c[0],i[1]+s[1]-c[1],i[2]+s[2]-c[2]],r=o,n=n.target}else break;return{inner:n,rot:r,trans:i}}function U2(e){return e[0]===1&&e[1]===0&&e[2]===0&&e[3]===0}function W2(e,t,n,r,i,a,o,s,c){for(let l=0;l<t.length;l+=3){let u=t[l]??0,d=t[l+1]??0,f=t[l+2]??0,p=2*(i*f-a*d),m=2*(a*u-r*f),h=2*(r*d-i*u);e[l]=u+n*p+(i*h-a*m)+o,e[l+1]=d+n*m+(a*p-r*h)+s,e[l+2]=f+n*h+(r*m-i*p)+c}}function G2(e,t,n){let[r,i,a]=n,o=U2(t);if(o&&r===0&&i===0&&a===0)return e;let s=e.vertices,c=new Float32Array(s.length);if(o){for(let e=0;e<s.length;e+=3)c[e]=(s[e]??0)+r,c[e+1]=(s[e+1]??0)+i,c[e+2]=(s[e+2]??0)+a;return{...e,vertices:c}}let[l,u,d,f]=t;W2(c,s,l,u,d,f,r,i,a);let p=e.normals,m=new Float32Array(p.length);return W2(m,p,l,u,d,f,0,0,0),{...e,vertices:c,normals:m}}function K2(e,t,n){let r=new Map,i=Math.min(t.length,n.length);for(let e=0;e<i;e++){let i=t[e],a=n[e];i!==void 0&&a!==void 0&&r.set(i,a)}return e.map(e=>({...e,faceId:r.get(e.faceId)??e.faceId}))}var q2=class{cache=new Map;refCounts=new Map;evaluating=!1;pendingKeys=[];kernelId;defaultTolerance;maxCacheEntries;maxMeshCacheEntries;meshCache=new Map;onStep;hits=0;misses=0;evictions=0;constructor(e={}){this.kernelId=e.kernel??NT()??`unregistered`,this.defaultTolerance=e.tolerance,e.onStep&&(this.onStep=e.onStep);let t=e.maxCacheEntries;if(t!==void 0&&(!Number.isInteger(t)||t<1))throw RangeError(`Evaluator: maxCacheEntries must be a positive integer, got ${String(t)}`);this.maxCacheEntries=t;let n=e.maxMeshCacheEntries;if(n!==void 0&&(!Number.isInteger(n)||n<1))throw RangeError(`Evaluator: maxMeshCacheEntries must be a positive integer, got ${String(n)}`);this.maxMeshCacheEntries=n}evaluate(e,t={}){if(this.maxCacheEntries!==void 0&&this.evaluating)throw Error(`Evaluator.evaluate() is not reentrant when maxCacheEntries is set — do not call it from an onStep callback.`);return PT(this.kernelId,()=>{this.evaluating=!0;let n=!1;try{let r=this.evaluateInner(e,t);return this.maxCacheEntries!==void 0&&r.ok&&this.trimCache(this.maxCacheEntries),n=r.ok,r}finally{!n&&this.maxCacheEntries!==void 0&&this.rollbackPending(),this.pendingKeys.length=0,this.evaluating=!1}})}evaluateMesh(e,t={},n={}){n.signal?.throwIfAborted();let r=n.cache??!0,i=ho(),a=n.tolerance??i.tolerance,o=n.angularTolerance??i.angularTolerance,s=`${z2(e,t,this.kernelId,this.defaultTolerance)}|${uM(a,o,n.skipNormals??!1,n.includeUVs??!1)}`;if(r){let r=this.meshCache.get(s);if(r!==void 0)return this.maxMeshCacheEntries!==void 0&&(this.meshCache.delete(s),this.meshCache.set(s,r)),R(r);let{inner:i,rot:a,trans:o}=H2(e,t);if(i!==e){let r=this.evaluateMesh(i,t,n);if(!r.ok)return r;let c=this.evaluate(i,t);if(!c.ok)return c;let l=WD(c.value).map(Wj),u=this.evaluate(e,t);if(!u.ok)return u;let d=WD(u.value).map(Wj),f=G2(r.value,a,o),p=K2(f.faceGroups,l,d),m=new Set(d);if(p.every(e=>m.has(e.faceId))){let e={...f,faceGroups:p};return this.meshCache.set(s,e),this.maxMeshCacheEntries!==void 0&&this.trimMeshCache(this.maxMeshCacheEntries),R(e)}}}let c=this.evaluate(e,t);if(!c.ok)return c;let l=PT(this.kernelId,()=>bM(c.value,n));return r&&(this.meshCache.set(s,l),this.maxMeshCacheEntries!==void 0&&this.trimMeshCache(this.maxMeshCacheEntries)),R(l)}evaluateInner(e,t){let n=z2(e,t,this.kernelId,this.defaultTolerance),r=this.cache.get(n);if(r!==void 0)return this.hits++,this.maxCacheEntries!==void 0&&(this.cache.delete(n),this.cache.set(n,r)),this.onStep?.({node:e,cacheKey:n,cacheHit:!0}),R(r);this.misses++;let i=I2(e,{env:t,tolerance:this.defaultTolerance,evalNode:e=>this.evaluateInner(e,t)});if(!i.ok)return i;let a=i.value;return this.refCounts.set(a,(this.refCounts.get(a)??0)+1),this.cache.set(n,a),this.maxCacheEntries!==void 0&&this.pendingKeys.push(n),this.onStep?.({node:e,cacheKey:n,cacheHit:!1}),i}releaseShape(e){let t=(this.refCounts.get(e)??1)-1;t<=0?(this.refCounts.delete(e),e[Symbol.dispose]()):this.refCounts.set(e,t)}trimCache(e){for(;this.cache.size>e;){let e=this.cache.keys().next();if(e.done)break;let t=e.value,n=this.cache.get(t);this.cache.delete(t),this.evictions++,n!==void 0&&this.releaseShape(n)}}trimMeshCache(e){for(;this.meshCache.size>e;){let e=this.meshCache.keys().next();if(e.done)break;this.meshCache.delete(e.value)}}rollbackPending(){for(let e of this.pendingKeys){let t=this.cache.get(e);t!==void 0&&(this.cache.delete(e),this.releaseShape(t))}}cacheStats(){return{hits:this.hits,misses:this.misses,entries:this.cache.size,evictions:this.evictions}}resetStats(){this.hits=0,this.misses=0,this.evictions=0}[Symbol.dispose](){for(let e of this.refCounts.keys())e[Symbol.dispose]();this.refCounts.clear(),this.cache.clear(),this.meshCache.clear()}};function J2(e,t){try{var n=WT();let r=t(n.u(new q2(e)));if(r instanceof Promise)throw Error(`withEvaluator() callback returned a Promise. Async code must construct an Evaluator directly and dispose it manually — borrowed shapes would otherwise be freed before the Promise resolves.`);return r}catch(e){n.e=e}finally{n.d()}}var Y2=1;function X2(e){return{csgVersion:5,root:i4(e)}}function Z2(e){switch(e.kind){case`NumLit`:return{kind:`NumLit`,value:e.value};case`Vec3Lit`:return{kind:`Vec3Lit`,value:[e.value[0],e.value[1],e.value[2]]};case`Vec2Lit`:return{kind:`Vec2Lit`,value:[e.value[0],e.value[1]]};case`Param`:return{kind:`Param`,name:e.name};case`BinOp`:return{kind:`BinOp`,op:e.op,a:Z2(e.a),b:Z2(e.b)};case`UnaryOp`:return{kind:`UnaryOp`,op:e.op,arg:Z2(e.arg)};case`Component`:return{kind:`Component`,vec:Z2(e.vec),index:e.index};case`BuildVec`:return{kind:`BuildVec`,dim:e.dim,components:e.components.map(Z2)}}}function Q2(e){switch(e.kind){case`Box`:return{kind:`Box`,x:Z2(e.x),y:Z2(e.y),z:Z2(e.z)};case`Sphere`:return{kind:`Sphere`,radius:Z2(e.radius)};case`Cylinder`:return{kind:`Cylinder`,radius:Z2(e.radius),height:Z2(e.height)};case`Cone`:return{kind:`Cone`,radius1:Z2(e.radius1),radius2:Z2(e.radius2),height:Z2(e.height)};case`Torus`:return{kind:`Torus`,majorRadius:Z2(e.majorRadius),minorRadius:Z2(e.minorRadius)};case`Polygon`:return{kind:`Polygon`,points:e.points.map(Z2)};case`Circle`:return{kind:`Circle`,radius:Z2(e.radius)};case`Line`:return{kind:`Line`,from:Z2(e.from),to:Z2(e.to)};case`Vertex`:return{kind:`Vertex`,point:Z2(e.point)};case`Empty`:return{kind:`Empty`,output:e.output};default:return}}function $2(e){switch(e.kind){case`Fuse`:case`Cut`:case`Intersect`:return{kind:e.kind,a:i4(e.a),b:i4(e.b),tolerance:e.tolerance};case`FuseAll`:return{kind:`FuseAll`,shapes:e.shapes.map(i4),tolerance:e.tolerance};case`CutAll`:return{kind:`CutAll`,base:i4(e.base),tools:e.tools.map(i4),tolerance:e.tolerance};default:return}}function e4(e){return e?Z2(e):void 0}function t4(e){switch(e.kind){case`Line`:return{kind:`Line`,to:Z2(e.to)};case`Arc`:return{kind:`Arc`,to:Z2(e.to),radius:Z2(e.radius),largeArc:e.largeArc,clockwise:e.clockwise};case`Bezier`:return{kind:`Bezier`,controls:e.controls.map(Z2),to:Z2(e.to)};case`EllipseArc`:return{kind:`EllipseArc`,to:Z2(e.to),radii:Z2(e.radii),rotation:Z2(e.rotation),largeArc:e.largeArc,clockwise:e.clockwise}}}function n4(e){return{start:Z2(e.start),segments:e.segments.map(t4)}}function r4(e){switch(e.kind){case`Translate`:return{kind:`Translate`,target:i4(e.target),vector:Z2(e.vector)};case`Rotate`:return{kind:`Rotate`,target:i4(e.target),angle:Z2(e.angle),axis:e4(e.axis),at:e4(e.at)};case`Scale`:return{kind:`Scale`,target:i4(e.target),factor:Z2(e.factor),center:e4(e.center)};case`Mirror`:return{kind:`Mirror`,target:i4(e.target),normal:e4(e.normal),at:e4(e.at)};default:return}}function i4(e){return e.kind===`Extrude`?{kind:`Extrude`,profile:i4(e.profile),vector:Z2(e.vector)}:e.kind===`Revolve`?{kind:`Revolve`,profile:i4(e.profile),angle:Z2(e.angle),axis:e4(e.axis),at:e4(e.at)}:e.kind===`Loft`?{kind:`Loft`,sections:e.sections.map(i4),ruled:e.ruled}:e.kind===`Path`?{kind:`Path`,start:Z2(e.start),segments:e.segments.map(t4)}:e.kind===`Sweep`?{kind:`Sweep`,profile:i4(e.profile),spine:i4(e.spine),frenet:e.frenet}:e.kind===`Profile`?{kind:`Profile`,outline:n4(e.outline),holes:e.holes.map(n4)}:e.kind===`Color`?{kind:`Color`,target:i4(e.target),color:[...e.color]}:e.kind===`Fillet`?{kind:`Fillet`,target:i4(e.target),ref:{origin:e.ref.origin,faceRoles:[...e.ref.faceRoles],hint:{entityType:`edge`,length:e.ref.hint.length,midpoint:e.ref.hint.midpoint?[...e.ref.hint.midpoint]:void 0}},radius:Z2(e.radius)}:e.kind===`Compound`?{kind:`Compound`,children:e.children.map(i4)}:e.kind===`Instance`?{kind:`Instance`,source:i4(e.source),placements:e.placements,fuse:e.fuse}:Q2(e)??$2(e)??r4(e)}function a4(e){return z(W(H.NULL_SHAPE_INPUT,`csg.fromJSON: ${e}`))}function o4(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s4(e){return typeof e==`number`&&Number.isFinite(e)}function c4(e){return typeof e==`string`}function l4(e,t){if(!Array.isArray(e)||e.length!==3)return a4(`${t}: expected Vec3 array`);let[n,r,i]=e;return!s4(n)||!s4(r)||!s4(i)?a4(`${t}: Vec3 contains non-number`):R([n,r,i])}function u4(e,t){if(!Array.isArray(e)||e.length!==2)return a4(`${t}: expected Vec2 array`);let[n,r]=e;return!s4(n)||!s4(r)?a4(`${t}: Vec2 contains non-number`):R([n,r])}function d4(e){if(!o4(e))return a4(`input is not an object`);let t=e.csgVersion;if(typeof t!=`number`||!Number.isInteger(t)||t<Y2||t>5)return a4(`unsupported csgVersion ${String(t)} (expected ${Y2}..5)`);let n=e.root;return y4(n)}function f4(e){if(!o4(e))return a4(`expression: not an object`);let t=e.kind;switch(t){case`NumLit`:return s4(e.value)?R(U$(e.value)):a4(`NumLit.value`);case`Vec3Lit`:{let t=l4(e.value,`Vec3Lit.value`);return t.ok?R(W$(t.value)):t}case`Vec2Lit`:{let t=u4(e.value,`Vec2Lit.value`);return t.ok?R(G$(t.value)):t}case`Param`:return c4(e.name)?R(K$(e.name)):a4(`Param.name`);case`BinOp`:return p4(e);case`UnaryOp`:return m4(e);case`Component`:return h4(e);case`BuildVec`:return g4(e);default:return a4(`unknown expression kind: ${String(t)}`)}}function p4(e){let t=e.op;if(t!==`+`&&t!==`-`&&t!==`*`&&t!==`/`)return a4(`BinOp.op: ${String(t)}`);let n=f4(e.a);if(!n.ok)return n;let r=f4(e.b);return r.ok?R(q$(t,n.value,r.value)):r}function m4(e){let t=e.op;if(!c4(t)||![`neg`,`sin`,`cos`,`sqrt`,`abs`].includes(t))return a4(`UnaryOp.op: ${String(t)}`);let n=f4(e.arg);return n.ok?R(J$(t,n.value)):n}function h4(e){let t=e.index;if(t!==0&&t!==1&&t!==2)return a4(`Component.index: ${String(t)}`);let n=f4(e.vec);return n.ok?R(Y$(n.value,t)):n}function g4(e){let t=e.dim;if(t!==2&&t!==3)return a4(`BuildVec.dim: ${String(t)}`);let n=e.components;if(!Array.isArray(n))return a4(`BuildVec.components: not array`);if(n.length!==t)return a4(`BuildVec.components: expected ${t} components, got ${n.length}`);let r=[];for(let e of n){let t=f4(e);if(!t.ok)return t;r.push(t.value)}return R(X$(t,r))}function _4(e,t){if(!Array.isArray(e))return a4(`${t}: not array`);let n=[];for(let t of e){let e=y4(t);if(!e.ok)return e;n.push(e.value)}return R(n)}function v4(e){let t=e.tolerance;return t==null?R(void 0):s4(t)?R(t):a4(`tolerance: not a finite number`)}function y4(e){if(!o4(e))return a4(`node: not an object`);let t=e.kind;switch(t){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:return x4(t,e);case`Fuse`:case`Cut`:case`Intersect`:return k4(t,e);case`FuseAll`:case`CutAll`:return A4(t,e);case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:return j4(t,e);case`Compound`:return J4(e);case`Instance`:return X4(e);case`Extrude`:return L4(e);case`Revolve`:return R4(e);case`Loft`:return z4(e);case`Path`:return q4(e);case`Sweep`:return K4(e);case`Profile`:return G4(e);case`Color`:return W4(e);case`Fillet`:return U4(e);default:return a4(`unknown node kind: ${String(t)}`)}}function b4(e,t,n){let r=f4(e[t]);return r.ok?R(n(r.value)):r}function x4(e,t){switch(e){case`Box`:return S4(t);case`Sphere`:return b4(t,`radius`,P1);case`Cylinder`:return C4(t);case`Cone`:return w4(t);case`Torus`:return T4(t);case`Polygon`:return E4(t);case`Circle`:return b4(t,`radius`,z1);case`Line`:return D4(t);case`Vertex`:return b4(t,`point`,V1);case`Empty`:return O4(t)}return a4(`unhandled primitive: ${e}`)}function S4(e){let t=f4(e.x);if(!t.ok)return t;let n=f4(e.y);if(!n.ok)return n;let r=f4(e.z);return r.ok?R(N1(t.value,n.value,r.value)):r}function C4(e){let t=f4(e.radius);if(!t.ok)return t;let n=f4(e.height);return n.ok?R(F1(t.value,n.value)):n}function w4(e){let t=f4(e.radius1);if(!t.ok)return t;let n=f4(e.radius2);if(!n.ok)return n;let r=f4(e.height);return r.ok?R(I1(t.value,n.value,r.value)):r}function T4(e){let t=f4(e.majorRadius);if(!t.ok)return t;let n=f4(e.minorRadius);return n.ok?R(L1(t.value,n.value)):n}function E4(e){let t=e.points;if(!Array.isArray(t))return a4(`Polygon.points: not array`);let n=[];for(let e of t){let t=f4(e);if(!t.ok)return t;n.push(t.value)}return R(R1(n))}function D4(e){let t=f4(e.from);if(!t.ok)return t;let n=f4(e.to);return n.ok?R(B1(t.value,n.value)):n}function O4(e){let t=e.output;switch(t){case`Solid`:return R(U1());case`Face`:return R(W1());case`Wire`:return R(G1());default:return a4(`Empty.output: ${String(t)}`)}}function k4(e,t){let n=y4(t.a);if(!n.ok)return n;let r=y4(t.b);if(!r.ok)return r;let i=v4(t);if(!i.ok)return i;switch(e){case`Fuse`:return R(q1(n.value,r.value,i.value));case`Cut`:return R(J1(n.value,r.value,i.value));case`Intersect`:return R(Y1(n.value,r.value,i.value))}}function A4(e,t){let n=v4(t);if(!n.ok)return n;if(e===`FuseAll`){let e=_4(t.shapes,`FuseAll.shapes`);return e.ok?R(X1(e.value,n.value)):e}let r=y4(t.base);if(!r.ok)return r;let i=_4(t.tools,`CutAll.tools`);return i.ok?R(Z1(r.value,i.value,n.value)):i}function j4(e,t){let n=y4(t.target);if(!n.ok)return n;switch(e){case`Translate`:return M4(t,n.value);case`Rotate`:return P4(t,n.value);case`Scale`:return F4(t,n.value);case`Mirror`:return I4(t,n.value)}}function M4(e,t){let n=f4(e.vector);return n.ok?R($1(t,n.value)):n}function N4(e,t){if(e[t]===void 0)return R(void 0);let n=f4(e[t]);return n.ok?R(n.value):n}function P4(e,t){let n=f4(e.angle);if(!n.ok)return n;let r=N4(e,`axis`);if(!r.ok)return r;let i=N4(e,`at`);return i.ok?R(e0(t,n.value,{axis:r.value,at:i.value})):i}function F4(e,t){let n=f4(e.factor);if(!n.ok)return n;let r=N4(e,`center`);return r.ok?R(t0(t,n.value,{center:r.value})):r}function I4(e,t){let n=N4(e,`normal`);if(!n.ok)return n;let r=N4(e,`at`);return r.ok?R(n0(t,{normal:n.value,at:r.value})):r}function L4(e){let t=y4(e.profile);if(!t.ok)return t;let n=f4(e.vector);return n.ok?R(r0(t.value,n.value)):n}function R4(e){let t=y4(e.profile);if(!t.ok)return t;let n=f4(e.angle);if(!n.ok)return n;let r=N4(e,`axis`);if(!r.ok)return r;let i=N4(e,`at`);return i.ok?R(d0(t.value,n.value,{axis:r.value,at:i.value})):i}function z4(e){let t=_4(e.sections,`Loft.sections`);if(!t.ok)return t;let n=e.ruled;return n!==void 0&&typeof n!=`boolean`?a4(`Loft.ruled: not a boolean`):R(u0(t.value,{ruled:n}))}function B4(e,t){let n=e[t];return n===void 0?R(!1):typeof n==`boolean`?R(n):a4(`${t}: not a boolean`)}function V4(e){if(!o4(e))return a4(`segment: not an object`);let t=f4(e.to);if(!t.ok)return t;let n=e.kind;switch(n){case`Line`:return R(g1(t.value));case`Arc`:{let n=f4(e.radius);if(!n.ok)return n;let r=B4(e,`largeArc`);if(!r.ok)return r;let i=B4(e,`clockwise`);return i.ok?R(_1(t.value,n.value,{largeArc:r.value,clockwise:i.value})):i}case`Bezier`:{let n=e.controls;if(!Array.isArray(n))return a4(`Bezier.controls: not array`);let r=[];for(let e of n){let t=f4(e);if(!t.ok)return t;r.push(t.value)}return R(v1(r,t.value))}case`EllipseArc`:{let n=f4(e.radii);if(!n.ok)return n;let r=f4(e.rotation);if(!r.ok)return r;let i=B4(e,`largeArc`);if(!i.ok)return i;let a=B4(e,`clockwise`);return a.ok?R(y1(t.value,n.value,{rotation:r.value,largeArc:i.value,clockwise:a.value})):a}default:return a4(`unknown segment kind: ${String(n)}`)}}function H4(e,t){if(!o4(e))return a4(`${t}: not an object`);let n=f4(e.start);if(!n.ok)return n;let r=e.segments;if(!Array.isArray(r))return a4(`${t}.segments: not array`);let i=[];for(let e of r){let t=V4(e);if(!t.ok)return t;i.push(t.value)}return R(b1(n.value,i))}function U4(e){let t=y4(e.target);if(!t.ok)return t;let n=f4(e.radius);if(!n.ok)return n;let r=e.ref;if(!o4(r))return a4(`Fillet.ref: not an object`);let i=r.origin;if(!c4(i))return a4(`Fillet.ref.origin: not a string`);let a=r.faceRoles;if(!Array.isArray(a)||a.length!==2||!a.every(c4))return a4(`Fillet.ref.faceRoles: expected two role strings`);let o=r.hint;if(!o4(o))return a4(`Fillet.ref.hint: not an object`);let s=o.length;if(s!==void 0&&!s4(s))return a4(`Fillet.ref.hint.length`);let c;if(o.midpoint!==void 0){let e=l4(o.midpoint,`Fillet.ref.hint.midpoint`);if(!e.ok)return e;c=e.value}return R(a0(t.value,{origin:i,faceRoles:[a[0],a[1]],hint:{entityType:`edge`,length:s,midpoint:c}},n.value))}function W4(e){let t=y4(e.target);if(!t.ok)return t;let n=e.color;return!Array.isArray(n)||n.length!==4||!n.every(e=>s4(e)&&e>=0&&e<=1)?a4(`Color.color: expected an RGBA array of 4 numbers in [0, 1]`):R(o0(t.value,[n[0],n[1],n[2],n[3]]))}function G4(e){let t=H4(e.outline,`Profile.outline`);if(!t.ok)return t;let n=e.holes;if(n!==void 0&&!Array.isArray(n))return a4(`Profile.holes: not array`);let r=[];for(let[e,t]of(Array.isArray(n)?n:[]).entries()){let n=H4(t,`Profile.holes[${e}]`);if(!n.ok)return n;r.push(n.value)}return R(s0(t.value,r))}function K4(e){let t=y4(e.profile);if(!t.ok)return t;let n=y4(e.spine);if(!n.ok)return n;let r=B4(e,`frenet`);return r.ok?R(c0(t.value,n.value,{frenet:r.value})):r}function q4(e){let t=f4(e.start);if(!t.ok)return t;let n=e.segments;if(!Array.isArray(n))return a4(`Path.segments: not array`);let r=[];for(let e of n){let t=V4(e);if(!t.ok)return t;r.push(t.value)}return R(l0(t.value,r))}function J4(e){let t=_4(e.children,`Compound.children`);return t.ok?R(f0(t.value)):t}function Y4(e){return Array.isArray(e)&&e.length===4&&e.every(e=>Array.isArray(e)&&e.length===4&&e.every(s4))}function X4(e){let t=y4(e.source);if(!t.ok)return t;let n=e.placements;return!Array.isArray(n)||!n.every(Y4)?a4(`Instance.placements must be an array of 4x4 number matrices`):R(p0(t.value,n,e.fuse===!0))}function Z4(e){return e3(e)}function Q4(e){switch(e.kind){case`NumLit`:case`Vec3Lit`:case`Vec2Lit`:case`Param`:return e;case`BinOp`:{let t=Q4(e.a),n=Q4(e.b);if(t.kind===`NumLit`&&n.kind===`NumLit`)switch(e.op){case`+`:return U$(t.value+n.value);case`-`:return U$(t.value-n.value);case`*`:return U$(t.value*n.value);case`/`:return U$(t.value/n.value)}return t!==e.a||n!==e.b?q$(e.op,t,n):e}case`UnaryOp`:{let t=Q4(e.arg);if(t.kind===`NumLit`){let n=t.value;switch(e.op){case`neg`:return U$(-n);case`sin`:return U$(Math.sin(n));case`cos`:return U$(Math.cos(n));case`sqrt`:return U$(Math.sqrt(n));case`abs`:return U$(Math.abs(n))}}return t===e.arg?e:J$(e.op,t)}case`Component`:{let t=Q4(e.vec);return t.kind===`Vec3Lit`||t.kind===`Vec2Lit`&&(e.index===0||e.index===1)?U$(t.value[e.index]):t===e.vec?e:Y$(t,e.index)}case`BuildVec`:{let t=e.components.map(Q4);return $4(e.dim,t)||(t.some((t,n)=>t!==e.components[n])?X$(e.dim,t):e)}}}function $4(e,t){if(t.length!==e)return;let n=[];for(let e of t){if(e.kind!==`NumLit`)return;n.push(e.value)}return e===2?G$([n[0],n[1]]):W$([n[0],n[1],n[2]])}function e3(e){switch(e.kind){case`Box`:return N1(Q4(e.x),Q4(e.y),Q4(e.z));case`Sphere`:return P1(Q4(e.radius));case`Cylinder`:return F1(Q4(e.radius),Q4(e.height));case`Cone`:return I1(Q4(e.radius1),Q4(e.radius2),Q4(e.height));case`Torus`:return L1(Q4(e.majorRadius),Q4(e.minorRadius));case`Polygon`:return R1(e.points.map(Q4));case`Circle`:return z1(Q4(e.radius));case`Line`:return B1(Q4(e.from),Q4(e.to));case`Vertex`:return V1(Q4(e.point));case`Empty`:return e;case`Fuse`:return r3(e.a,e.b,e.tolerance);case`Cut`:return i3(e.a,e.b,e.tolerance);case`Intersect`:return a3(e.a,e.b,e.tolerance);case`FuseAll`:return o3(e.shapes,e.tolerance);case`CutAll`:return s3(e.base,e.tools,e.tolerance);case`Translate`:return c3(e.target,e.vector);case`Rotate`:case`Scale`:case`Mirror`:return n3(e);case`Compound`:return f0(e.children.map(e3).filter(e=>e.kind!==`Empty`));case`Instance`:return p0(e3(e.source),e.placements,e.fuse);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Profile`:case`Path`:case`Color`:case`Fillet`:return t3(e)}}function t3(e){switch(e.kind){case`Extrude`:return r0(e3(e.profile),Q4(e.vector));case`Revolve`:return d0(e3(e.profile),Q4(e.angle),{axis:e.axis?Q4(e.axis):void 0,at:e.at?Q4(e.at):void 0});case`Loft`:return u0(e.sections.map(e3),{ruled:e.ruled});case`Sweep`:return c0(e3(e.profile),e3(e.spine),{frenet:e.frenet});case`Profile`:return s0(T1(e.outline,Q4),e.holes.map(e=>T1(e,Q4)));case`Path`:return l0(Q4(e.start),e.segments.map(e=>E1(e,Q4)));case`Color`:return o0(e3(e.target),[...e.color]);case`Fillet`:return a0(e3(e.target),e.ref,Q4(e.radius))}}function n3(e){switch(e.kind){case`Rotate`:return e0(e3(e.target),Q4(e.angle),{axis:e.axis?Q4(e.axis):void 0,at:e.at?Q4(e.at):void 0});case`Scale`:return t0(e3(e.target),Q4(e.factor),{center:e.center?Q4(e.center):void 0});case`Mirror`:return n0(e3(e.target),{normal:e.normal?Q4(e.normal):void 0,at:e.at?Q4(e.at):void 0})}}function r3(e,t,n){let r=e3(e),i=e3(t);return r.kind===`Empty`?i:i.kind===`Empty`?r:q1(r,i,n)}function i3(e,t,n){let r=e3(e),i=e3(t);return i.kind===`Empty`||r.kind===`Empty`?r:J1(r,i,n)}function a3(e,t,n){let r=e3(e),i=e3(t);return r.kind===`Empty`?r:i.kind===`Empty`?i:Y1(r,i,n)}function o3(e,t){let n=e.map(e3).filter(e=>e.kind!==`Empty`);return n.length===0?U1():n.length===1?n[0]:X1(n,t)}function s3(e,t,n){let r=e3(e);if(r.kind===`Empty`)return r;let i=t.map(e3).filter(e=>e.kind!==`Empty`);return i.length===0?r:Z1(r,i,n)}function c3(e,t){let n=e3(e),r=Q4(t);if(r.kind!==`Vec3Lit`)return $1(n,r);let[i,a,o]=r.value;if(i===0&&a===0&&o===0)return n;if(n.kind===`Translate`){let e=Q4(n.vector);if(e.kind===`Vec3Lit`)return $1(n.target,[e.value[0]+i,e.value[1]+a,e.value[2]+o])}return $1(n,r)}function l3(e,t,n){return u3(e,t,n)}function u3(e,t,n){return t(e)?n:d3(e,t,n)}function d3(e,t,n){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:case`Path`:case`Profile`:return e;case`Fuse`:return q1(u3(e.a,t,n),u3(e.b,t,n),e.tolerance);case`Cut`:return J1(u3(e.a,t,n),u3(e.b,t,n),e.tolerance);case`Intersect`:return Y1(u3(e.a,t,n),u3(e.b,t,n),e.tolerance);case`FuseAll`:return X1(e.shapes.map(e=>u3(e,t,n)),e.tolerance);case`CutAll`:return Z1(u3(e.base,t,n),e.tools.map(e=>u3(e,t,n)),e.tolerance);case`Translate`:return $1(u3(e.target,t,n),e.vector);case`Rotate`:return e0(u3(e.target,t,n),e.angle,{axis:e.axis,at:e.at});case`Scale`:return t0(u3(e.target,t,n),e.factor,{center:e.center});case`Mirror`:return n0(u3(e.target,t,n),{normal:e.normal,at:e.at});case`Compound`:return f0(e.children.map(e=>u3(e,t,n)));case`Instance`:return p0(u3(e.source,t,n),e.placements,e.fuse);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Color`:case`Fillet`:return f3(e,t,n)}}function f3(e,t,n){switch(e.kind){case`Extrude`:return r0(u3(e.profile,t,n),e.vector);case`Revolve`:return d0(u3(e.profile,t,n),e.angle,{axis:e.axis,at:e.at});case`Loft`:return u0(e.sections.map(e=>u3(e,t,n)),{ruled:e.ruled});case`Sweep`:return c0(u3(e.profile,t,n),u3(e.spine,t,n),{frenet:e.frenet});case`Color`:return o0(u3(e.target,t,n),[...e.color]);case`Fillet`:return a0(u3(e.target,t,n),e.ref,e.radius)}}function p3(e,t){t(e);for(let n of m3(e))p3(n,t)}function m3(e){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:case`Path`:case`Profile`:return[];case`Fuse`:case`Cut`:case`Intersect`:return[e.a,e.b];case`FuseAll`:return e.shapes;case`CutAll`:return[e.base,...e.tools];case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:case`Color`:case`Fillet`:return[e.target];case`Compound`:return e.children;case`Instance`:return[e.source];case`Extrude`:case`Revolve`:return[e.profile];case`Loft`:return e.sections;case`Sweep`:return[e.profile,e.spine]}}function h3(e){let t=0;return p3(e,()=>{t++}),t}var g3=1e-6;function _3(e){return[e[0]??0,e[1]??0]}function v3(e,t){return Math.hypot(e[0]-t[0],e[1]-t[1])<g3}function y3(e){return z(W(`BLUEPRINT_CONTOUR`,`blueprintToContour: ${e}`))}function b3(e){return _3(e.value((e.firstParameter+e.lastParameter)/2))}function x3(e,t,n){let[r,i]=e,[a,o]=t,[s,c]=n,l=2*(r*(o-c)+a*(c-i)+s*(i-o));if(Math.abs(l)<1e-12)return y3(`arc: collinear sample points`);let u=r*r+i*i,d=a*a+o*o,f=s*s+c*c,p=(u*(o-c)+d*(c-i)+f*(i-o))/l,m=(u*(s-a)+d*(r-s)+f*(a-r))/l,h=Math.hypot(r-p,i-m),g=(e,t)=>e[0]*t[1]-e[1]*t[0],_=g([a-r,o-i],[s-a,c-o])<0,v=[s-r,c-i];return R(_1(n,h,{largeArc:g(v,[a-r,o-i])*g(v,[p-r,m-i])>0,clockwise:_}))}function S3(e,t){let n=Math.cos(t),r=Math.sin(t);return[n*e[0]+r*e[1],-r*e[0]+n*e[1]]}function C3(e,t,n,r){let{a:i,b:a}=r,o=r.phi,s=S3(e,o),c=S3(t,o),l=S3(n,o),u=(s[0]-c[0])/2,d=(s[1]-c[1])/2,f=u*u/(i*i)+d*d/(a*a);if(f>1){let e=Math.sqrt(f);i*=e,a*=e}let p=i*i*a*a-i*i*d*d-a*a*u*u,m=i*i*d*d+a*a*u*u;if(m<1e-12)return y3(`ellipse: coincident endpoints`);let h=Math.sqrt(Math.max(0,p/m)),g=(s[0]+c[0])/2,_=(s[1]+c[1])/2,v=[[g+h*i*d/a,_-h*a*u/i],[g-h*i*d/a,_+h*a*u/i]],y=e=>{let t=(l[0]-e[0])/i,n=(l[1]-e[1])/a;return Math.abs(t*t+n*n-1)},b=y(v[0])<=y(v[1])?v[0]:v[1],x=e=>Math.atan2((e[1]-b[1])/a,(e[0]-b[0])/i),S=2*Math.PI,C=x(s),w=((x(l)-C)%S+S)%S,ee=((x(c)-C)%S+S)%S,te=w<ee,ne=te?ee:S-ee;return R(y1(t,[r.a,r.b],{rotation:o*180/Math.PI,largeArc:ne>Math.PI,clockwise:!te}))}function w3(e,t){let n=MT(),r=_3(e.firstPoint);if(e.geomType===`CIRCLE`){let i=n.getCurve2dCircleData(e.wrapped);if(!i)return y3(`circle: kernel returned no circle data`);let a=[2*i.cx-r[0],2*i.cy-r[1]],o=!i.isDirect;return t.push(_1(a,i.radius,{clockwise:o}),_1(r,i.radius,{clockwise:o})),R(r)}let i=n.getCurve2dEllipseData(e.wrapped);if(!i)return y3(`ellipse: kernel returned no ellipse data`);let a=_3(e.boundingBox.center),o=[2*a[0]-r[0],2*a[1]-r[1]],s=!i.isDirect,c=i.xAxisAngle*180/Math.PI,l=[i.majorRadius,i.minorRadius];return t.push(y1(o,l,{rotation:c,clockwise:s}),y1(r,l,{rotation:c,clockwise:s})),R(r)}function T3(e,t,n,r){let i=e.geomType;if(i===`LINE`)return R(g1(n));if(i===`CIRCLE`)return x3(t,b3(e),n);if(i===`BEZIER_CURVE`){let t=MT().getCurve2dBezierPoles(e.wrapped);if(!t)return y3(`bezier: kernel returned no poles`);let i=t.map(_3);r&&i.reverse();let a=i.slice(1,-1);return a.length===0?R(g1(n)):a.length>2?y3(`bezier: unsupported degree ${i.length-1}`):R(v1(a,n))}if(i===`ELLIPSE`){let r=MT().getCurve2dEllipseData(e.wrapped);return r?C3(t,n,b3(e),{a:r.majorRadius,b:r.minorRadius,phi:r.xAxisAngle}):y3(`ellipse: kernel returned no ellipse data`)}return y3(`unsupported curve type: ${i}`)}var E3=new Set([`LINE`,`CIRCLE`,`BEZIER_CURVE`,`ELLIPSE`]);function D3(e,t){let n=t?.tolerance??1e-4,r=e.curves[0];if(!r)return y3(`blueprint has no curves`);let i=_3(r.firstPoint),a=i,o=[];for(let t of e.curves){let e=E3.has(t.geomType)?[t]:tR([t],{tolerance:n,continuity:`C0`,maxSegments:300}),r=e[0]!==t;try{let t=e[0];e.length>1&&t!==void 0&&!v3(_3(t.firstPoint),a)&&!v3(_3(t.lastPoint),a)&&e.reverse();for(let t of e){let e=O3(t,a,o);if(!e.ok)return e;a=e.value}}finally{if(r)for(let t of e)t.delete()}}return R(b1(i,o))}function O3(e,t,n){let r=_3(e.firstPoint),i=_3(e.lastPoint);if(v3(r,i)&&(e.geomType===`CIRCLE`||e.geomType===`ELLIPSE`))return w3(e,n);let a,o;if(v3(r,t))a=i,o=!1;else if(v3(i,t))a=r,o=!0;else return y3(`curve is not chained to the current point (${e.geomType})`);let s=T3(e,t,a,o);return s.ok?(n.push(s.value),R(a)):s}function k3(e){return F().createVector3d(e[0],e[1],e[2])}function A3(e){return F().createPoint3d(e[0],e[1],e[2])}function j3(e){return F().createDirection3d(e[0],e[1],e[2])}function M3(e){return[e.X(),e.Y(),e.Z()]}function N3(e){return[e.X(),e.Y(),e.Z()]}function P3(e){return[e.X(),e.Y(),e.Z()]}function F3(e,t){let n=k3(e);try{return t(n)}finally{n.delete()}}function I3(e,t){let n=A3(e);try{return t(n)}finally{n.delete()}}function L3(e,t){let n=j3(e);try{return t(n)}finally{n.delete()}}var R3=.299,z3=.587,B3=.114;function V3(e,t={}){if(e.length<2)return z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromGrid: need at least 2 rows, got ${e.length}`));let n=e.length,r=e[0]?.length??0;if(r<2)return z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromGrid: need at least 2 columns, got ${r}`));for(let t=0;t<n;t++){let n=e[t];if(!n||n.length!==r)return z(W(H.SURFACE_GRID_JAGGED,`surfaceFromGrid: row ${t} has ${n?.length??0} columns, expected ${r}`))}let{width:i=r-1,depth:a=n-1,scaleZ:o=1}=t,s=i/(r-1),c=a/(n-1);try{return H3(e,n,r,s,c,o)}catch{}try{return U3(e,n,r,s,c,o)}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.SURFACE_FAILED,`surfaceFromGrid failed: ${t}`,e))}}function H3(e,t,n,r,i,a){let o=[];for(let s=0;s<t;s++)for(let t=0;t<n;t++){let n=e[s],c=(n?n[t]??0:0)*a;o.push([t*r,s*i,c])}let s=I(F().bsplineSurface(o,t,n));return jE(s)?R(s):(L(s),z(U(H.SURFACE_FAILED,`B-spline surface did not produce a face`)))}function U3(e,t,n,r,i,a){let o=[];for(let s=0;s<t;s++)for(let t=0;t<n;t++){let n=e[s],c=(n?n[t]??0:0)*a;o.push([t*r,s*i,c])}let s=I(F().triangulatedSurface(o,t,n));return jE(s)||ME(s)?R(s):(L(s),z(U(H.SURFACE_FAILED,`surfaceFromGrid: unexpected shape type from sewing`)))}async function W3(e,t={}){let n=t.channel??`luminance`,r=Math.max(1,Math.round(t.downsample??1));if(typeof createImageBitmap!=`function`)return z(yD(H.SURFACE_FAILED,`surfaceFromImage requires createImageBitmap (not available in this environment)`));let i;try{i=await createImageBitmap(e)}catch(e){return z(yD(H.SURFACE_FAILED,`surfaceFromImage: failed to decode image — ${e instanceof Error?e.message:String(e)}`))}let a=i.width,o=i.height;if(a<2||o<2)return i.close(),z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromImage: image too small (${a}x${o}), need at least 2x2`));if(typeof OffscreenCanvas!=`function`)return i.close(),z(yD(H.SURFACE_FAILED,`surfaceFromImage requires OffscreenCanvas (not available in this environment)`));let s=new OffscreenCanvas(a,o).getContext(`2d`);if(!s)return i.close(),z(yD(H.SURFACE_FAILED,`surfaceFromImage: could not get 2D canvas context`));s.drawImage(i,0,0),i.close();let c=s.getImageData(0,0,a,o).data,l=[];for(let e=0;e<o;e+=r){let t=[];for(let i=0;i<a;i+=r){let r=(e*a+i)*4,o=c[r]??0,s=c[r+1]??0,l=c[r+2]??0,u;switch(n){case`r`:u=o/255;break;case`g`:u=s/255;break;case`b`:u=l/255;break;default:u=(R3*o+z3*s+B3*l)/255}t.push(u)}l.push(t)}let u={};return t.width!==void 0&&(u.width=t.width),t.depth!==void 0&&(u.depth=t.depth),t.scaleZ!==void 0&&(u.scaleZ=t.scaleZ),V3(l,u)}function G3(e,t){return F().isNull(e.wrapped)?z(W(H.NULL_SHAPE_INPUT,`${t} is a null shape`)):R(void 0)}function K3(e,t={}){if(e.length===0)return z(W(H.HULL_EMPTY_INPUT,`hull: at least one shape is required`,void 0,void 0,`Provide one or more shapes to compute a convex hull`));for(let[t,n]of e.entries()){let e=G3(n,`hull: shapes[${t}]`);if(B(e))return e}let n=t.tolerance??.1;try{let t=F(),r=e.map(e=>e.wrapped),i=I(t.hull(r,n));return NE(i)?R(i):(L(i),z(U(H.HULL_NOT_3D,`Hull result is not a solid; input may be degenerate`)))}catch(e){let t=e instanceof Error?e.message:String(e);return t.includes(`coplanar`)||t.includes(`fewer than`)||t.includes(`degenerate`)?z(U(H.HULL_DEGENERATE,`Hull degenerate: ${t}`,e)):z(U(H.HULL_FAILED,`Hull operation failed: ${t}`,e))}}function q3(e){if(e.length<4)return z(W(H.HULL_EMPTY_INPUT,`convexHull: at least 4 points required, got ${e.length}`,void 0,void 0,`Provide 4 or more non-coplanar 3D points`));try{let t=F(),n=e.map(e=>({x:e[0],y:e[1],z:e[2]})),r=I(t.hullFromPoints(n,.1));return NE(r)?R(r):(L(r),z(U(H.HULL_NOT_3D,`convexHull result is not a solid; points may be coplanar`)))}catch(e){let t=e instanceof Error?e.message:String(e);return t.includes(`coplanar`)||t.includes(`fewer than`)||t.includes(`degenerate`)?z(U(H.HULL_DEGENERATE,`convexHull degenerate: ${t}`,e)):z(U(H.HULL_FAILED,`convexHull failed: ${t}`,e))}}function J3(e){let n=WD(e);if(n.length!==1)return null;let r=t(n,0);if(aO(r)!==`sphere`)return null;let i=F().area(r.wrapped);return Math.sqrt(i/(4*Math.PI))}function Y3(e,t,n){try{let r=I(F().offset(e.wrapped,t,n));return FE(r)?R(r):(L(r),z(hD(H.MINKOWSKI_NOT_3D,`Minkowski sphere offset did not produce a 3D shape`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.MINKOWSKI_FAILED,`Minkowski sphere offset failed: ${t}`,e,{operation:`minkowski`,fastPath:`sphere`}))}}function X3(e,t,n){let r=F();try{let i=KD(e),a=KD(t);if(i.length===0||a.length===0)return z(U(H.MINKOWSKI_FAILED,`Minkowski sum: one or both shapes have no vertices`,void 0,{operation:`minkowski`}));let o=[];for(let e of i){let[t,n,i]=r.vertexPosition(e.wrapped);for(let e of a){let[a,s,c]=r.vertexPosition(e.wrapped);o.push({x:t+a,y:n+s,z:i+c})}}let s=I(r.hullFromPoints(o,n));return FE(s)?R(s):(L(s),z(hD(H.MINKOWSKI_NOT_3D,`Minkowski hull did not produce a 3D shape`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.MINKOWSKI_FAILED,`Minkowski general path failed: ${t}`,e,{operation:`minkowski`}))}}function Z3(e,t,n={}){let{tolerance:r=1e-6}=n;if(F().isNull(e.wrapped))return z(W(H.NULL_SHAPE_INPUT,`minkowski: shape is a null shape`));if(F().isNull(t.wrapped))return z(W(H.MINKOWSKI_NULL_TOOL,`minkowski: tool is a null shape`));if(!FE(e)||!FE(t))return z(W(H.MINKOWSKI_NOT_3D,`minkowski: both shape and tool must be 3D`));let i=J3(t);return i===null?X3(e,t,r):Y3(e,i,r)}function Q3(e,t,n={}){let{tolerance:r=1e-6}=n;if(e.length<4)return z(W(H.POLYHEDRON_INSUFFICIENT_POINTS,`polyhedron: need at least 4 points, got ${e.length}`));if(t.length<4)return z(W(H.POLYHEDRON_INSUFFICIENT_FACES,`polyhedron: need at least 4 faces, got ${t.length}`));let i=[];for(let[n,r]of t.entries()){for(let t of r)if(t<0||t>=e.length)return z(W(H.POLYHEDRON_INVALID_INDEX,`polyhedron: face ${n} has out-of-range index ${t} (${e.length} points)`));if(r.length<3)continue;let t=r[0];for(let e=1;e<r.length-1;e++)i.push([t,r[e],r[e+1]])}try{let t=F(),n=e.map(([e,t,n])=>({x:e,y:t,z:n})),a=I(t.buildSolidFromFaces(n,i,r));return NE(a)?R(a):(L(a),z(U(H.POLYHEDRON_FAILED,`Polyhedron did not produce a solid`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.POLYHEDRON_FAILED,`Polyhedron failed: ${t}`,e))}}var $3=1e-10;function e6(e,t,n,r){return e*r-t*n}function t6(e,t,n,r){return e*n+t*r}function n6(e,t){return Math.sqrt(e*e+t*t)}function r6(e,t){let n=e[(t%e.length+e.length)%e.length];if(!n)throw Error(`Invalid polygon index ${t} for length ${e.length}`);return n}function i6(e){let t=0;for(let n=0;n<e.length;n++){let r=r6(e,n),i=r6(e,n+1);t+=r.x*i.y-i.x*r.y}return t<0?[...e].reverse():e}function a6(e,t){let n=r6(e,t-1),r=r6(e,t),i=r6(e,t+1),a=r.x-n.x,o=r.y-n.y,s=n6(a,o),c=i.x-r.x,l=i.y-r.y,u=n6(c,l);if(s<$3||u<$3)return{dx:0,dy:0};let d=-o/s,f=a/s,p=-l/u,m=c/u,h=d+p,g=f+m,_=n6(h,g);if(_<$3)return{dx:d,dy:f};h/=_,g/=_;let v=t6(h,g,d,f),y=Math.abs(v)>$3?1/v:1;return{dx:h*y,dy:g*y}}function o6(e){return!e.prev||!e.next?!1:e6(e.x-e.prev.x,e.y-e.prev.y,e.next.x-e.x,e.next.y-e.y)<-1e-10}function s6(e){let t=e.map((t,n)=>{let r=a6(e,n);return{x:t.x,y:t.y,bx:r.dx,by:r.dy,origIdx:n,prev:null,next:null,active:!0}});for(let e=0;e<t.length;e++){let n=t[e],r=t[(e-1+t.length)%t.length],i=t[(e+1)%t.length];n&&r&&i&&(n.prev=r,n.next=i)}return t}function c6(e,t){let n=e;for(let e=0;e<t&&n;e++)n.active=!1,n=n.next}function l6(e){let t=1,n=e.next;for(;n!==e&&(t++,n=n.next,!(t>1e4)););return t}function u6(e,t){let n=e.bx-t.bx,r=e.by-t.by,i=t.x-e.x,a=t.y-e.y;if(Math.abs(n)<$3&&Math.abs(r)<$3)return null;let o;if(o=Math.abs(n)>Math.abs(r)?i/n:a/r,o<$3)return null;let s=Math.abs(n)>Math.abs(r)?r:n,c=Math.abs(n)>Math.abs(r)?a:i;if(Math.abs(s)>$3){let e=c/s;if(Math.abs(o-e)>1e-4*Math.max(1,Math.abs(o)))return null}return o}function d6(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=n6(r,i);if(a<$3)return null;let o=-i/a,s=r/a,c=(e.x-t.x)*o+(e.y-t.y)*s,l=e.bx-(t.bx+n.bx)/2,u=e.by-(t.by+n.by)/2,d=l*o+u*s;if(Math.abs(d)<$3)return null;let f=-c/d;if(f<$3)return null;let p=e.x+f*e.bx,m=e.y+f*e.by,h=t.x+f*t.bx,g=t.y+f*t.by,_=n.x+f*n.bx,v=n.y+f*n.by,y=_-h,b=v-g,x=n6(y,b);if(x<$3)return f;let S=t6(p-h,m-g,y,b)/(x*x);return S<-.01||S>1.01?null:f}function f6(e){let t=[];for(let n of e){if(!n.active||!n.next)continue;let e=u6(n,n.next);if(e!==null&&e>$3){let r=n.x+e*n.bx,i=n.y+e*n.by;t.push({time:e,x:r,y:i,nodeA:n,nodeB:n.next,type:`edge`})}if(o6(n)){let e=n.next.next,r=0;for(;e!==n.prev&&e!==n&&r<1e3;){let i=d6(n,e,e.next);if(i!==null&&i>$3){let r=n.x+i*n.bx,a=n.y+i*n.by;t.push({time:i,x:r,y:a,nodeA:n,nodeB:e,type:`split`})}e=e.next,r++}}}return t.sort((e,t)=>e.time-t.time),t}function p6(e){if(e.length<3)return R({nodes:[],faces:[]});try{return R(m6(e))}catch(e){return z(vD(H.STRAIGHT_SKELETON_FAILED,e instanceof Error?e.message:String(e),e))}}function m6(e){let t=i6(e),n=t.length,r=[],i=Array.from({length:n},()=>[]),a=s6(t),o=0,s=n*n*2;for(;o<s;){o++;let e=a.find(e=>e.active);if(!e)break;let t=l6(e);if(t<=3){if(t===3){let t=e,n=t.next,a=n.next,o=u6(t,n),s=o!==null&&o>$3?o:0,c=(t.x+n.x+a.x)/3+s*(t.bx+n.bx+a.bx)/3,l=(t.y+n.y+a.y)/3+s*(t.by+n.by+a.by)/3,u=r.length;r.push({x:c,y:l,height:s});let d=i[t.origIdx],f=i[n.origIdx],p=i[a.origIdx];d&&d.push(u),f&&f.push(u),p&&p.push(u),t.active=!1,n.active=!1,a.active=!1}else c6(e,t);continue}let n=a.filter(e=>e.active),s=f6(n);if(s.length===0){for(let e of n)e.active=!1;break}let c=s[0];if(!c)break;if(c.type===`edge`){let e=c.nodeA,t=c.nodeB;if(!e.active||!t.active)continue;let n=r.length;r.push({x:c.x,y:c.y,height:c.time});let a=i[e.origIdx],o=i[t.origIdx];a&&a.push(n),o&&o.push(n),e.x=c.x,e.y=c.y,e.next=t.next,t.next.prev=e,t.active=!1;let s=[],l=e;do s.push({x:l.x,y:l.y}),l=l.next;while(l!==e);let u=a6(s,0);e.bx=u.dx,e.by=u.dy}else{let e=c.nodeA,t=c.nodeB;if(!e.active||!t.active)continue;let n=r.length;r.push({x:c.x,y:c.y,height:c.time});let o=i[e.origIdx];o&&o.push(n);let s=i[t.origIdx];s&&s.push(n);let l={x:c.x,y:c.y,bx:0,by:0,origIdx:e.origIdx,prev:null,next:null,active:!0};a.push(l),e.x=c.x,e.y=c.y;let u=e.next,d=t.next;e.next=d,d.prev=e,l.next=u,u.prev=l,l.prev=t,t.next=l;let f=e=>{let t=[],n=e;do t.push({x:n.x,y:n.y}),n=n.next;while(n!==e);return t},p=a6(f(e),0);e.bx=p.dx,e.by=p.dy;let m=a6(f(l),0);l.bx=m.dx,l.by=m.dy}}let c=[];for(let e=0;e<n;e++){let a=(e+1)%n,o=[r6(t,e),r6(t,a)],s=[0,0],l=i[a],u=i[e];if(l)for(let e of l){let t=r[e];t&&(o.push({x:t.x,y:t.y}),s.push(t.height))}if(u)for(let e=u.length-1;e>=0;e--){let t=u[e];if(t===void 0)continue;let n=r[t];if(!n)continue;let i=o[o.length-1];i&&n6(n.x-i.x,n.y-i.y)>$3&&(o.push({x:n.x,y:n.y}),s.push(n.height))}o.length>=3&&c.push({vertices:o,heights:s})}let l=[];for(let e of r)l.some(t=>Math.abs(t.x-e.x)<.01&&Math.abs(t.y-e.y)<.01)||l.push(e);return{nodes:l,faces:c}}function h6(e){let t=UD(e).map(e=>{let t=Xj(e);return{x:t[0],y:t[1]}}),n=t[0],r=t[t.length-1];return t.length>1&&n&&r&&Math.abs(n.x-r.x)<1e-10&&Math.abs(n.y-r.y)<1e-10&&t.pop(),t}function g6(e){let t=[];for(let n=1;n<e-1;n++)t.push([0,n,n+1]);return t}function _6(e,t,n,r,i,a){return(n-e)*(a-t)-(r-t)*(i-e)}function v6(e,t,n,r,i,a,o,s){let c=_6(n,r,i,a,e,t),l=_6(i,a,o,s,e,t),u=_6(o,s,n,r,e,t);return!((c<0||l<0||u<0)&&(c>0||l>0||u>0))}function y6(e){let t=e.length;if(t<3)return[];if(t===3)return[[0,1,2]];let n=0;for(let r=0;r<t;r++){let i=e[r],a=e[(r+1)%t];i&&a&&(n+=i.x*a.y-a.x*i.y)}let r=[],i=Array.from({length:t},(e,t)=>t);n<0&&i.reverse();let a=(t,n,r)=>{let a=e[t],o=e[n],s=e[r];if(!a||!o||!s||_6(a.x,a.y,o.x,o.y,s.x,s.y)<=0)return!1;for(let c of i){if(c===t||c===n||c===r)continue;let i=e[c];if(i&&v6(i.x,i.y,a.x,a.y,o.x,o.y,s.x,s.y))return!1}return!0};for(;i.length>3;){let e=!1;for(let t=0;t<i.length;t++){let n=i[(t-1+i.length)%i.length],o=i[t],s=i[(t+1)%i.length];if(n!==void 0&&o!==void 0&&s!==void 0&&a(n,o,s)){r.push([n,o,s]),i.splice(t,1),e=!0;break}}if(!e)break}if(i.length===3){let[e,t,n]=i;e!==void 0&&t!==void 0&&n!==void 0&&r.push([e,t,n])}return r}function b6(e,t,n){let r=[];for(let i of e.faces){let e=i.vertices.map((e,n)=>[e.x,e.y,(i.heights[n]??0)*t]),a=g6(e.length);for(let[t,i,o]of a){let a=e[t],s=e[i],c=e[o];if(!a||!s||!c)continue;let l=s[0]-a[0],u=s[1]-a[1],d=s[2]-a[2],f=c[0]-a[0],p=c[1]-a[1],m=c[2]-a[2],h=u*m-d*p,g=d*f-l*m,_=l*p-u*f;if(h*h+g*g+_*_<1e-20)continue;let v=n.buildTriFace(a,s,c);v!==null&&r.push(v)}}return r}function x6(e,t){let n=(t?.angle??45)*CD,r=Math.tan(n);try{let t=h6(e);if(t.length<3)return z(U(H.ROOF_FAILED,`Wire must have at least 3 edges for roof generation`));let n=p6(t);if(!n.ok)return n;let i=n.value;if(i.faces.length===0)return z(U(H.ROOF_FAILED,`Straight skeleton computation produced no faces`));let a=F(),o=b6(i,r,a);for(let[e,n,r]of y6(t)){let i=t[e],s=t[n],c=t[r];if(!i||!s||!c)continue;let l=[i.x,i.y,0],u=[s.x,s.y,0],d=[c.x,c.y,0],f=a.buildTriFace(l,d,u);f!==null&&o.push(f)}if(o.length===0)return z(U(H.ROOF_FAILED,`No valid triangular faces could be built`));try{let e=a.sewAndSolidify(o,1e-6),t=a.fixShape(e);return t!==e&&a.dispose(e),R(TE(t))}catch(e){try{let t=TE(a.sew(o,1e-6));return fO(t)?R(t):z(U(H.ROOF_FAILED,`Sew fallback produced invalid solid`,e))}catch(e){return z(U(H.ROOF_FAILED,`Failed to sew roof faces`,e))}}finally{for(let e of o)a.dispose(e)}}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.ROOF_FAILED,`Roof generation failed: ${t}`,e))}}var S6={coincident:3,concentric:4,distance:1,angle:1},C6=[1,0,0,0];function w6(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]}function T6(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function E6(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function D6(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function O6(e,t){return[e[0]*t,e[1]*t,e[2]*t]}function k6(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function A6(e){return k6(D6(e,Math.abs(e[0])<.9?[1,0,0]:[0,1,0]))}function j6(e,t){let n=w6(LF(t.rotation,e.origin),t.position);return{type:e.type,origin:n,...e.normal?{normal:LF(t.rotation,e.normal)}:{},...e.direction?{direction:LF(t.rotation,e.direction)}:{}}}function M6(e,t,n){let r=e.normal??[0,0,1];return{position:O6(r,E6(r,T6(e.origin,t.origin))+n),rotation:C6}}function N6(e,t){let n=e.direction??[0,0,1],r=zF(t.direction??[0,0,1],n),i=LF(r,t.origin);return{position:T6(e.origin,i),rotation:r}}function P6(e,t,n){let r=k6(e.normal??[0,0,1]),i=k6(t.normal??[0,0,1]),a=Math.acos(Math.max(-1,Math.min(1,E6(i,r)))),o=D6(i,r);return{position:[0,0,0],rotation:RF(Math.hypot(o[0],o[1],o[2])<1e-9?A6(i):o,a-n)}}function F6(e,t,n){let r=T6(t,e),i=Math.hypot(r[0],r[1],r[2]);return{position:T6(w6(e,O6(i<1e-9?[1,0,0]:O6(r,1/i),n)),t),rotation:C6}}function I6(e,t,n,r){let i=k6(e);return{position:O6(i,E6(i,T6(t,n))-r),rotation:C6}}function L6(e,t,n){let r=k6(e.direction??[0,0,1]),i=w6(e.origin,O6(r,E6(r,T6(t,e.origin))));if(n===0)return{position:T6(i,t),rotation:C6};let a=T6(t,i),o=Math.hypot(a[0],a[1],a[2]);return{position:T6(w6(i,O6(o<1e-9?A6(r):O6(a,1/o),n)),t),rotation:C6}}function R6(e,t,n){let r=k6(t.direction??[0,0,1]),i=T6(t.origin,e),a=T6(i,O6(r,E6(r,i))),o=Math.hypot(a[0],a[1],a[2]);return n===0?{position:O6(a,-1),rotation:C6}:{position:T6(O6(o<1e-9?A6(r):O6(a,1/o),n),a),rotation:C6}}function z6(e,t,n){let r=k6(e.direction??[0,0,1]),i=zF(k6(t.direction??[0,0,1]),r),a=T6(LF(i,t.origin),e.origin),o=T6(a,O6(r,E6(r,a))),s=Math.hypot(o[0],o[1],o[2]);return{position:T6(O6(s<1e-9?A6(r):O6(o,1/s),n),o),rotation:i}}var B6=new Set([`plane-plane`,`plane-point`,`point-plane`,`point-point`,`axis-axis`,`axis-point`,`point-axis`]),V6={angle:`plane`,concentric:`axis`},H6=new Set([`coincident`,`distance`,`angle`,`concentric`]);function U6(e,t,n){let r=V6[e];return r?t===r&&n===r:B6.has(`${t}-${n}`)}function W6(e,t,n){switch(`${e.type}-${t.type}`){case`plane-plane`:case`plane-point`:return M6(e,t,n);case`point-plane`:return I6(t.normal??[0,0,1],e.origin,t.origin,n);case`point-point`:return F6(e.origin,t.origin,n);case`axis-axis`:return n===0?N6(e,t):z6(e,t,n);case`axis-point`:return L6(e,t.origin,n);case`point-axis`:return R6(e.origin,t,n);default:return null}}function G6(e,t,n){switch(e.type){case`concentric`:return N6(t,n);case`angle`:return P6(t,n,(e.value??0)*Math.PI/180);default:{let r=W6(t,n,e.type===`distance`?e.value??0:0);if(!r)throw Error(`solveMate: unsupported entity pair escaped filter: ${t.type}-${n.type}`);return r}}}function K6(e,t){let n=new Map;for(let t of e)n.set(t,{position:[0,0,0],rotation:C6});let r=[],i=t.filter(e=>H6.has(e.type)&&e.entityA&&e.entityB),a=new Set;for(let e of i)e.entityB&&a.add(e.entityB.node);let o=new Set;for(let t of e)a.has(t)||o.add(t);for(let e of t)e.type===`fixed`&&e.entityA&&o.add(e.entityA.node);let s=[];for(let e of i){if(!e.entityA||!e.entityB)continue;let t=e.entityA.entity.type,n=e.entityB.entity.type;if(!U6(e.type,t,n)){r.push(`${e.type}(${t}-${n})`);continue}s.push(e)}let c=!0;for(;c&&s.length>0;){c=!1;for(let e=s.length-1;e>=0;e--){let t=s[e];if(!t?.entityA||!t.entityB)continue;let r=t.entityA,i=t.entityB;if(!o.has(r.node)||(s.splice(e,1),c=!0,o.has(i.node)))continue;let a=n.get(r.node)??{position:[0,0,0],rotation:C6},l=j6(r.entity,a);n.set(i.node,G6(t,l,i.entity)),o.add(i.node)}}for(let e of s)r.push(`${e.type}(unanchored)`);return{transforms:n,dof:r.reduce((e,t)=>e+(S6[t]??S6[t.split(`(`)[0]??``]??0),0),converged:r.length===0,unsupported:r}}function q6(e){if(e.face){let t=_k(e.face);return t?{type:`axis`,origin:t.origin,direction:t.direction}:{type:`plane`,origin:gk(e.face),normal:hk(e.face)}}if(e.edge){if(Yj(e.edge)===`LINE`)return{type:`axis`,origin:Xj(e.edge),direction:$j(e.edge)};let t=tM(e.edge);return t?{type:`axis`,origin:t.origin,direction:t.direction}:null}return e.point?{type:`point`,origin:e.point}:null}function J6(e,t){let n=q6(e),r=q6(t);return!n||!r?z(W(H.ASSEMBLY_MATE_INVALID,`solveAssembly: could not extract geometry from mate entities`)):R({entityA:{node:e.node,entity:n},entityB:{node:t.node,entity:r}})}function Y6(e){switch(e.type){case`fixed`:return R({type:`fixed`,entityA:{node:e.entity.node,entity:{type:`point`,origin:[0,0,0]}}});case`coincident`:{let t=J6(e.entityA,e.entityB);return t.ok?R({type:`coincident`,...t.value}):t}case`distance`:{let t=J6(e.entityA,e.entityB);return t.ok?R({type:`distance`,...t.value,value:e.distance}):t}case`angle`:{let t=J6(e.entityA,e.entityB);return t.ok?R({type:`angle`,...t.value,value:e.angle}):t}case`concentric`:{let t=J6(e.axisA,e.axisB);return t.ok?R({type:`concentric`,...t.value}):t}}}function X6(e,t){let n=e.mates??[];return{...e,mates:[...n,t]}}function Z6(e){let t=e.mates;if(!t||t.length===0)return z(W(H.ASSEMBLY_MATE_INVALID,`solveAssembly: no mates defined`));try{let n=[];XF(e,e=>{n.push(e.name)});let r=[];for(let e of t){let t=Y6(e);if(!t.ok)return t;r.push(t.value)}let i=K6(n,r);if(!i.converged){let e=i.unsupported.length>0?`Unsupported constraint types: ${i.unsupported.join(`, `)} (${i.dof} DOF unresolved)`:`Assembly constraint solver did not converge`;return z(U(H.ASSEMBLY_NOT_CONVERGED,e))}return R({transforms:i.transforms,dof:i.dof,converged:i.converged})}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.ASSEMBLY_SOLVE_FAILED,`Assembly solve failed: ${t}`,e))}}function Q6(e,t,n=1e-6){return F().isNull(e.wrapped)?z(W(H.NULL_SHAPE_INPUT,`checkInterference: first shape is a null shape`)):F().isNull(t.wrapped)?z(W(H.NULL_SHAPE_INPUT,`checkInterference: second shape is a null shape`)):nE(()=>{let r=F().distance(e.wrapped,t.wrapped);return R({hasInterference:r.value<=n,minDistance:r.value,pointOnShape1:r.point1,pointOnShape2:r.point2})})}function $6(e,n=1e-6){let r=[],i=e.map(e=>rO(e));return e.forEach((a,o)=>{for(let s=o+1;s<e.length;s++){if(e8(t(i,o),t(i,s),n))continue;let c=V(Q6(a,t(e,s),n));c.hasInterference&&r.push({i:o,j:s,result:c})}}),r}function e8(e,t,n){return e.xMax+n<t.xMin||t.xMax+n<e.xMin||e.yMax+n<t.yMin||t.yMax+n<e.yMin||e.zMax+n<t.zMin||t.zMax+n<e.zMin}function t8(e){let t=e.split(/\r?\n/),n=[],r=!1,i;for(let e=0;e<t.length-1;e+=2){let a=t[e],o=t[e+1];if(a===void 0||o===void 0)continue;let s=parseInt(a.trim(),10),c=o.trim();if(!isNaN(s)){if(s===2&&c===`ENTITIES`){r=!0;continue}if(r){if(s===0){if(c===`ENDSEC`||c===`EOF`){i&&n.push(i);break}i&&n.push(i),i={type:c,layer:`0`,data:new Map};continue}i&&(s===8?i.layer=c:i.data.set(s,c))}}}return n}function n8(e,t,n=0){let r=e.get(t);if(r===void 0)return n;let i=parseFloat(r);return isNaN(i)?n:i}function r8(e){let{type:t,data:n}=e,r=F();if(t===`LINE`)return r.makeLineEdge([n8(n,10),n8(n,20),n8(n,30)],[n8(n,11),n8(n,21),n8(n,31)]);if(t===`CIRCLE`)return r.makeCircleEdge([n8(n,10),n8(n,20),n8(n,30)],[0,0,1],n8(n,40));if(t===`ARC`){let e=n8(n,50)*Math.PI/180,t=n8(n,51)*Math.PI/180;return r.makeCircleArc([n8(n,10),n8(n,20),n8(n,30)],[0,0,1],n8(n,40),e,t)}}async function i8(e,t){let n;try{n=await e.text()}catch(e){return z(yD(H.DXF_IMPORT_FAILED,`Failed to read DXF blob`,e))}let r=t8(n),i=t?.layer===void 0?r:r.filter(e=>e.layer===t.layer);if(i.length===0)return R([]);let a=[];try{for(let e of i){let t=r8(e);t!==void 0&&a.push(t)}return a.length===0?R([]):R([SE(F().makeWire(a))])}catch(e){return z(yD(H.DXF_IMPORT_FAILED,`Failed to convert DXF entities to geometry`,e))}finally{for(let e of a)e.delete()}}function a8(e,t,n=1e-6){let r=F(),i=[];for(let[t,n,a]of e){let e=r.buildTriFace(t,n,a);e!==null&&i.push(e)}if(i.length===0)return z(yD(t,`No valid triangular faces could be built`));try{let e=I(r.sewAndSolidify(i,n));for(let e of i)r.dispose(e);return R(e)}catch{try{return R(LE(r.sew(i,n)))}catch(e){return z(yD(t,`Failed to sew triangular faces`,e))}}}function o8(e){let t=e.split(/\s+/),n=parseFloat(t[1]??``),r=parseFloat(t[2]??``),i=parseFloat(t[3]??``);return isNaN(n)||isNaN(r)||isNaN(i)?null:[n,r,i]}function s8(e){return e.split(/\s+/).slice(1).map(e=>parseInt(e.split(`/`)[0]??``,10)).filter(e=>!isNaN(e))}async function c8(e){let t=(await e.text()).split(`
|
|
60
|
-
`),n=[],r=[];for(let e of t){let t=e.trim();if(t.startsWith(`v `)){let e=o8(t);e&&n.push(e)}else if(t.startsWith(`f `)){let e=s8(t);e.length>=3&&r.push(e)}}if(n.length===0||r.length===0)return z(yD(H.OBJ_IMPORT_FAILED,`OBJ file contains no valid geometry`));try{return l8(n,r)}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.OBJ_IMPORT_FAILED,`OBJ import failed: ${t}`,e))}}function l8(e,t){let n=[];for(let r of t)for(let t=1;t<r.length-1;t++){let i=r[0]??0,a=r[t]??0,o=r[t+1]??0,s=i>0?i-1:e.length+i,c=a>0?a-1:e.length+a,l=o>0?o-1:e.length+o,u=e[s],d=e[c],f=e[l];!u||!d||!f||n.push([u,d,f])}return a8(n,H.OBJ_IMPORT_FAILED)}function u8(e,t){let n=-1;for(let t=e.length-22;t>=0;t--)if(e[t]===80&&e[t+1]===75&&e[t+2]===5&&e[t+3]===6){n=t;break}if(n<0)return null;let r=new DataView(e.buffer,e.byteOffset,e.byteLength),i=r.getUint32(n+16,!0),a=i+r.getUint32(n+12,!0),o=i,s=new TextDecoder;for(;o<a&&r.getUint32(o,!0)===33639248;){let n=r.getUint16(o+28,!0),i=r.getUint16(o+30,!0),a=r.getUint16(o+32,!0),c=r.getUint32(o+42,!0);if(s.decode(e.subarray(o+46,o+46+n))===t){if(r.getUint16(c+8,!0)!==0)return null;let t=r.getUint16(c+26,!0),n=r.getUint16(c+28,!0),i=r.getUint32(c+18,!0),a=c+30+t+n;return e.subarray(a,a+i)}o+=46+n+i+a}return null}function d8(e){return e>=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57||e===95}function f8(e){let t={},n=0;for(;n<e.length;){let r=e.indexOf(`="`,n);if(r<0)break;let i=r;for(;i>0&&d8(e.charCodeAt(i-1));)i--;if(i===r){n=r+2;continue}let a=e.slice(i,r),o=r+2,s=e.indexOf(`"`,o);if(s<0)break;t[a]=e.slice(o,s),n=s+1}return t}function p8(e,t){let n=[],r=`<${t} `,i=0;for(;i<e.length;){let t=e.indexOf(r,i);if(t<0)break;let a=e.indexOf(`>`,t);if(a<0)break;n.push(e.slice(t,a+1)),i=a+1}return n}function m8(e,t){let n=e.indexOf(`<${t}`);if(n<0)return null;let r=e.indexOf(`</${t}>`,n);return r<0?null:e.slice(n,r+t.length+3)}function h8(e){let t=e.startsWith(`#`)?e.slice(1):e;return[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255,t.length>=8?parseInt(t.slice(6,8),16)/255:1]}function g8(e){let t=new Map,n=0;for(;n<e.length;){let r=e.indexOf(`<colorgroup`,n);if(r<0)break;let i=e.indexOf(`</colorgroup>`,r);if(i<0)break;let a=e.slice(r,i+13);n=i+13;let o=e.indexOf(`>`,r);if(o<0)continue;let s=f8(e.slice(r,o+1)).id;if(s===void 0)continue;let c=parseInt(s,10),l=[];for(let e of p8(a,`color`)){let t=f8(e).color;t!==void 0&&l.push(h8(t))}t.set(c,l)}let r=0;for(;r<e.length;){let n=e.indexOf(`<basematerials`,r);if(n<0)break;let i=e.indexOf(`</basematerials>`,n);if(i<0)break;let a=e.slice(n,i+16);r=i+16;let o=e.indexOf(`>`,n);if(o<0)continue;let s=f8(e.slice(n,o+1)).id;if(s===void 0)continue;let c=parseInt(s,10),l=[];for(let e of p8(a,`base`)){let t=f8(e).displaycolor;t===void 0?l.push([0,0,0,1]):l.push(h8(t))}t.set(c,l)}return t}function _8(e){let t=[],n=[],r=[],i=g8(e);for(let n of p8(e,`vertex`)){let e=f8(n);e.x!==void 0&&e.y!==void 0&&e.z!==void 0&&t.push([parseFloat(e.x),parseFloat(e.y),parseFloat(e.z)])}let a=null,o=null,s=m8(e,`object`);if(s!==null){let e=s.indexOf(`>`);if(e>=0){let t=f8(s.slice(0,e+1));t.pid!==void 0&&(a=parseInt(t.pid,10)),t.pindex!==void 0&&(o=parseInt(t.pindex,10))}}for(let t of p8(e,`triangle`)){let e=f8(t);if(e.v1!==void 0&&e.v2!==void 0&&e.v3!==void 0){n.push([parseInt(e.v1,10),parseInt(e.v2,10),parseInt(e.v3,10)]);let t=null,s=e.pid??(a===null?void 0:String(a)),c=e.p1??(o===null?void 0:String(o));if(s!==void 0&&c!==void 0){let e=parseInt(s,10),n=parseInt(c,10),r=i.get(e);r!==void 0&&n<r.length&&(t=r[n]??null)}r.push(t)}}return{vertices:t,triangles:n,triangleColors:r}}function v8(e){let t=new Map;for(let n of e){if(n===null)continue;let e=n.join(`,`),r=t.get(e);r===void 0?t.set(e,{count:1,color:n}):r.count++}let n=null;for(let e of t.values())(n===null||e.count>n.count)&&(n=e);return n===null?null:n.color}function y8(e){let t=F(),n=e.vertices.map(([e,t,n])=>({x:e,y:t,z:n})),r=e.triangles;try{return R(I(t.buildSolidFromFaces(n,r,1e-6)))}catch{let t=[];for(let[n,r,i]of e.triangles){let a=e.vertices[n],o=e.vertices[r],s=e.vertices[i];!a||!o||!s||t.push([a,o,s])}return a8(t,H.THREEMF_IMPORT_FAILED)}}async function b8(e){try{let t=await e.arrayBuffer(),n=u8(new Uint8Array(t),`3D/3dmodel.model`);if(!n)return z(yD(H.THREEMF_IMPORT_FAILED,`3MF archive does not contain 3D/3dmodel.model (or uses unsupported compression)`));let r=_8(new TextDecoder().decode(n));if(r.vertices.length===0||r.triangles.length===0)return z(yD(H.THREEMF_IMPORT_FAILED,`3MF model contains no valid geometry`));let i=y8(r);if(i.ok){let e=v8(r.triangleColors);e!==null&&hA(i.value,e)}return i}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.THREEMF_IMPORT_FAILED,`3MF import failed: ${t}`,e))}}async function x8(e){try{let t=await e.arrayBuffer();return R(I(F().importGLB(t)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.GLB_IMPORT_FAILED,`Failed to import GLB: ${t}`,e))}}function $(e){return`__wrapped`in e?e.val:e}function S8(e){return $(e)}function C8(e,t){return rj($(e),t)}function w8(e,t){if(Array.isArray(e))throw Error(`${t}() expects an options object, e.g. ${t}(shape, { ... }), not an array of coordinates.`)}function T8(e,t,n){w8(n,`rotate`);let r=n?.at;return ij($(e),t,r,n?.axis)}function E8(e,t){w8(t,`mirror`);let n=t?.at;return aj($(e),t?.normal??[1,0,0],n)}function D8(e,t,n){return oj($(e),t,n?.center)}function O8(e){return Hj($(e))}function k8(e,t){return dj($(e),t)}function A8(e,t){return mj($(e),t)}function j8(e,t){return pj($(e),t)}function M8(e,t,n){return DA($(e),$(t),{...n,unsafe:!0})}function N8(e,t,n){return OA($(e),$(t),{...n,unsafe:!0})}function P8(e,t){return jA(e.map(e=>$(e)),{...t,unsafe:!0})}function F8(e,t,n){return MA($(e),t.map(e=>$(e)),{...n,unsafe:!0})}function I8(e,t,n){return kA($(e),$(t),{...n,unsafe:!0})}function L8(e,t,n){return FA($(e),t,n)}function R8(e,t,n){return VA($(e),t,n)}function z8(e,t){return HA($(e),t)}function B8(e,t,n){return UA($(e),t,n)}function V8(e,t){if(e!==void 0)return Array.isArray(e)?e:typeof e==`object`&&`findAll`in e?e.findAll(t):e(FL()).findAll(t)}function H8(e,t){return Array.isArray(e)?e:typeof e==`object`&&`findAll`in e?e.findAll(t):e(RL()).findAll(t)}function U8(e){return typeof e==`object`&&!Array.isArray(e)&&typeof e!=`function`?{mode:`distAngle`,distance:e.distance,angle:e.angle}:typeof e==`function`?{mode:`standard`,distance:t=>{let n=e(t);return n===null?null:typeof n==`object`&&!Array.isArray(n)?n.distance:n}}:{mode:`standard`,distance:e}}function W8(e,t,n){let r=$(e),i,a;return n===void 0?(i=void 0,a=t):(i=V8(t,r),a=n),qM(r,i,a)}function G8(e,t,n){let r=$(e),i,a;n===void 0?(i=void 0,a=t):(i=V8(t,r),a=n);let o=U8(a);return o.mode===`distAngle`?eN(r,[...i??UD(r)],o.distance,o.angle):JM(r,i,o.distance)}function K8(e,t,n,r){let i=$(e);return YM(i,H8(t,i),n,r?.tolerance)}function q8(e,t,n){return XM($(e),t,n?.tolerance)}function J8(e,t){return GM($(e),t)}function Y8(e,t,n){let r=$(e);return QM(r,H8(t,r),n.pullDirection,n.neutralPlane,n.angle)}function X8(e){return AN($(e))}function Z8(e){return Jj($(e))}function Q8(e,t){return bM($(e),t)}function $8(e,t){return xM($(e),t)}function e5(e){return sO($(e))}function t5(e){return Uj($(e))}function n5(e){return ak(e)}function r5(e){return EN($(e))}function i5(e){return Gj($(e))}function a5(e,t){return Vq($(e),typeof t==`number`?[0,0,t]:t)}function o5(e,t){let n=t?.at??[0,0,0];return Hq($(e),n,t?.axis??[0,0,1],t?.angle??2*Math.PI)}function s5(e,t){return qN(e.map(e=>$(e)),t)}function c5(e,n){if(n===void 0){let t=WD(e);if(t.length===0)return z(W(H.COMPOUND_NO_FACES,`compoundOps: shape has no faces`));let n=jk(t),r=gk(n)[2];for(let e=1;e<t.length;e++){let i=Ak(t,e),a=gk(i)[2];a>r&&(n=i,r=a)}return R(n)}if(typeof n==`function`){let r=n(RL()).findAll(e);return r.length===0?z(bD(H.COMPOUND_FACE_NOT_FOUND,`compoundOps: face finder matched no faces`)):R(t(r,0))}return R(n)}function l5(e){return`sketchOnPlane`in e&&typeof e.sketchOnPlane==`function`?{wire:e.sketchOnPlane(`XY`).wire,owned:!0}:{wire:e,owned:!1}}function u5(e,t){let n=$(e),{at:r,radius:i,axis:a}=t,o=a??[0,0,1];if(i<=0)return z(W(`DRILL_INVALID_RADIUS`,`Drill radius must be positive`));if(IO(o))return z(W(`DRILL_ZERO_AXIS`,`Drill axis cannot be zero`));let s=PO(o),c=r.length===2?[r[0],r[1],0]:[r[0],r[1],r[2]],l;if(t.depth!==void 0)l=JA(i,t.depth,c,s);else{let e=rO(n),t=[[e.xMin,e.yMin,e.zMin],[e.xMax,e.yMin,e.zMin],[e.xMin,e.yMax,e.zMin],[e.xMax,e.yMax,e.zMin],[e.xMin,e.yMin,e.zMax],[e.xMax,e.yMin,e.zMax],[e.xMin,e.yMax,e.zMax],[e.xMax,e.yMax,e.zMax]],r=1/0,a=-1/0;for(let e of t){let t=(e[0]-c[0])*s[0]+(e[1]-c[1])*s[1]+(e[2]-c[2])*s[2];t<r&&(r=t),t>a&&(a=t)}--r,a+=1,l=JA(i,a-r,[c[0]+s[0]*r,c[1]+s[1]*r,c[2]+s[2]*r],s)}try{return OA(n,l,{unsafe:!0})}finally{l[Symbol.dispose]()}}function d5(e,t){try{var n=WT();let r=$(e),{profile:i,depth:a}=t;if(a<=0)return z(W(`POCKET_INVALID_DEPTH`,`Pocket depth must be positive`));let o=c5(r,t.face);if(B(o))return o;let s=o.value,c=hk(s),l=gk(s),u=n.u(new iE),{wire:d,owned:f}=l5(i);f&&u.register(d);let p=Kk(d);if(B(p))return p;u.register(p.value);let m=Vq(u.register(rj(p.value,l)),DO(PO(c),-a));return B(m)?m:(u.register(m.value),OA(r,m.value,{unsafe:!0}))}catch(e){n.e=e}finally{n.d()}}function f5(e,t){try{var n=WT();let r=$(e),{profile:i,height:a}=t;if(a<=0)return z(W(`BOSS_INVALID_HEIGHT`,`Boss height must be positive`));let o=c5(r,t.face);if(B(o))return o;let s=o.value,c=hk(s),l=gk(s),u=n.u(new iE),{wire:d,owned:f}=l5(i);f&&u.register(d);let p=Kk(d);if(B(p))return p;u.register(p.value);let m=Vq(u.register(rj(p.value,l)),DO(PO(c),a));return B(m)?m:(u.register(m.value),DA(r,m.value,{unsafe:!0}))}catch(e){n.e=e}finally{n.d()}}function p5(e,t){try{var n=WT();let r=$(e),i=t?.normal??[1,0,0],a=t?.at;return IO(i)?z(W(`MIRROR_ZERO_NORMAL`,`Mirror plane normal cannot be zero`)):DA(r,n.u(aj(r,i,a)),{unsafe:!0})}catch(e){n.e=e}finally{n.d()}}function m5(e,t){let n=$(e),{xDir:r,xCount:i,xSpacing:a,yDir:o,yCount:s,ySpacing:c}=t;if(i<1||s<1)return z(W(`PATTERN_INVALID_COUNT`,`Pattern counts must be at least 1`));if(IO(r))return z(W(`PATTERN_ZERO_DIRECTION`,`X direction cannot be zero`));if(IO(o))return z(W(`PATTERN_ZERO_DIRECTION`,`Y direction cannot be zero`));if(i===1&&s===1)return R(n);let l=PO(r),u=PO(o),d=[n],f=[];for(let e=0;e<i;e++)for(let t=0;t<s;t++){if(e===0&&t===0)continue;let r=rj(n,[l[0]*a*e+u[0]*c*t,l[1]*a*e+u[1]*c*t,l[2]*a*e+u[2]*c*t]);d.push(r),f.push(r)}try{return jA(d,{unsafe:!0})}finally{for(let e of f)e[Symbol.dispose]()}}var h5=class extends Error{code;kind;suggestion;metadata;constructor(e){let t=e.suggestion?`${e.message}\nSuggestion: ${e.suggestion}`:e.message;super(t),this.name=`BrepError`,this.code=e.code,this.kind=e.kind,e.suggestion&&(this.suggestion=e.suggestion),e.metadata&&(this.metadata=e.metadata)}};function g5(e){if(B(e))throw new h5(e.error);return e.value}function _5(e){return e}function v5(e){return e}function y5(e){return e}function b5(e){return e}function x5(e){return{val:e,__wrapped:!0,translate:t=>j5(C8(e,t)),rotate:(t,n)=>j5(T8(e,t,n)),mirror:t=>j5(E8(e,t)),scale:(t,n)=>j5(D8(e,t,n)),applyMatrix:t=>j5(g5(k8(e,t))),moveX:t=>j5(C8(e,[t,0,0])),moveY:t=>j5(C8(e,[0,t,0])),moveZ:t=>j5(C8(e,[0,0,t])),rotateX:t=>j5(T8(e,t,{axis:[1,0,0]})),rotateY:t=>j5(T8(e,t,{axis:[0,1,0]})),rotateZ:t=>j5(T8(e,t,{axis:[0,0,1]})),bounds:()=>rO(e),describe:()=>e5(e),clone:()=>j5(g5(O8(e))),mesh:t=>Q8(e,t),meshEdges:t=>$8(e,t),isValid:()=>r5(e),isEmpty:()=>i5(e),heal:()=>j5(g5(X8(e))),simplify:()=>j5(g5(Z8(e))),toBREP:()=>g5(t5(e)),apply:t=>j5(t(e)),applyResult:t=>j5(g5(t(e))),done:()=>e}}function S5(e){return{fuse:(t,n)=>M5(g5(M8(e,$(t),{...n,unsafe:!0}))),cut:(t,n)=>M5(g5(N8(e,$(t),{...n,unsafe:!0}))),intersect:(t,n)=>M5(g5(I8(e,$(t),{...n,unsafe:!0}))),fuseAll:(t,n)=>M5(b5(g5(jA([e,...t.map($)],{...n,unsafe:!0})))),cutAll:(t,n)=>M5(b5(g5(MA(e,t,{...n,unsafe:!0})))),section:(t,n)=>j5(g5(L8(e,t,n))),split:t=>j5(g5(z8(e,t))),slice:(t,n)=>g5(B8(e,t,n))}}function C5(e){return{fillet(...t){return t.length===1?M5(b5(g5(W8(_5(e),t[0])))):M5(b5(g5(W8(_5(e),t[0],t[1]))))},chamfer(...t){return t.length===1?M5(b5(g5(G8(_5(e),t[0])))):M5(b5(g5(G8(_5(e),t[0],t[1]))))},shell:(t,n,r)=>M5(b5(g5(K8(_5(e),t,n,r)))),offset:(t,n)=>M5(b5(g5(q8(_5(e),t,n)))),draft:(t,n)=>M5(b5(g5(Y8(_5(e),t,n))))}}function w5(e){return{drill:t=>M5(g5(u5(e,t))),pocket:t=>M5(g5(d5(e,t))),boss:t=>M5(g5(f5(e,t))),mirrorJoin:t=>M5(g5(p5(e,t))),rectangularPattern:t=>M5(g5(m5(e,t)))}}function T5(e){return{volume:()=>g5(rP(e)),area:()=>g5(iP(e)),volumeProps:()=>g5(eP(e)),surfaceProps:()=>g5(tP(e))}}function E5(e){return{edges:()=>UD(e),faces:()=>WD(e),wires:()=>GD(e),vertices:()=>KD(e)}}function D5(e){return{linearPattern:(t,n,r)=>M5(b5(g5(VF(e,t,n,r)))),circularPattern:(t,n,r)=>M5(b5(g5(HF(e,t,n,r))))}}function O5(e){return{...x5(e),...S5(e),...C5(e),...w5(e),...T5(e),...E5(e),...D5(e)}}function k5(e){return{...x5(e),length:()=>eM(e),startPoint:()=>Xj(e),endPoint:()=>Zj(e),pointAt:t=>Qj(e,t),tangentAt:t=>$j(e,t),isClosed:()=>nM(e),sweep(t,n){if(!AE(e))throw Error(`sweep requires a Wire`);let r=g5(zN(y5(e),$(t),n));return M5(Array.isArray(r)?r[0]:r)}}}function A5(e){return{...x5(e),area:()=>g5(iP(e)),normalAt:t=>hk(e,t),center:()=>gk(e),surfaceType:()=>g5(sk(e)),outerWire:()=>yk(e),innerWires:()=>xk(e),extrude:t=>M5(g5(a5(v5(e),t))),revolve:t=>M5(g5(o5(v5(e),t)))}}function j5(e){return FE(e)?O5(e):jE(e)?A5(e):kE(e)||AE(e)?k5(e):x5(e)}function M5(e){return O5(e)}function N5(e){if(e&&typeof e==`object`&&`face`in e&&typeof e.face==`function`&&`_defaultOrigin`in e)return A5(e.face());if(e&&typeof e==`object`&&`wrapped`in e)return jE(e)?A5(e):FE(e)?O5(e):kE(e)||AE(e)?k5(e):x5(e);throw Error(`shape() requires a Sketch or branded shape type`)}var P5=.25,F5=e=>Math.tan(e)-e;function I5(e,t,n,r){let i=e/Math.cos(t),a=n+r*(Math.tan(t)-t);return[i*Math.cos(a),i*Math.sin(a),0]}function L5(e,t,n,r,i){let a=[];for(let o=0;o<=r;o++){let s=.5-.5*Math.cos(o/r*Math.PI);a.push(I5(e,s*t,n,i))}return a}function R5(e){return Math.max(16,Math.round(8*Math.sqrt(e)))}function z5(e,t,n,r,i,a,o){let s=e*t/2,c=s*Math.cos(n),l=t*(1+r),u=t*(1+i-r),d=o?s-t*(1-r):s+l,f=o?s+t*(1+i+r):s-u,p=a/s,m=(Math.PI/2+2*r*Math.tan(n))/e+(o?p:-p),h=o?f:d;return{rPitch:s,rb:c,rTip:d,rRoot:f,alphaPitch:n,halfToothAngle:m,alphaTip:h<=c?0:Math.acos(Math.min(1,c/h)),toothPitch:2*Math.PI/e,isInternal:o}}function B5(e,t,n){if(t===0)return R(e);let r=F5(e)+2*t*Math.tan(e)/n,i,a;if(r>F5(e)?(i=e,a=Math.PI/2-1e-6):(i=1e-4,a=e),r>F5(a)||r<F5(i))return z(W(`GEAR_PA_OUT_OF_RANGE`,`working pressure angle out of range — target inv(αw)=${r.toFixed(4)} not in [${F5(i).toFixed(4)}, ${F5(a).toFixed(4)}]`,void 0,{target:r,invLo:F5(i),invHi:F5(a)}));for(let e=0;e<50;e++){let e=.5*(i+a);F5(e)<r?i=e:a=e}return R(.5*(i+a))}function V5(e,t,n,r,i){return B5(e,t+n,r+i)}function H5(e,t,n,r,i){return B5(e,n-t,i-r)}function U5(e,t,n,r,i){return(e+t)*n*Math.cos(r)/(2*Math.cos(i))}function W5(e,t,n,r){if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(n))return z(W(`GEAR_NON_INTEGER_TEETH`,`tooth counts and planet count must be integers`));if(e<4||t<4||n<2)return z(W(`GEAR_TEETH_TOO_FEW`,`zs ≥ 4, zp ≥ 4, N ≥ 2 required`));if((2*e+2*t)%n!=0)return z(W(`GEAR_ASSEMBLY`,`(2·zs + 2·zp) must be divisible by N — got ${2*e+2*t} mod ${n} = ${(2*e+2*t)%n}`));let i=t+2+2*r,a=(e+t)*Math.sin(Math.PI/n);return a<=i?z(W(`GEAR_PLANET_COLLISION`,`planet tips would collide: (zs+zp)·sin(π/N) = ${a.toFixed(3)} ≤ planet tip = ${i.toFixed(3)}`)):R(void 0)}function G5(e,t,n,r,i,a,o,s){return(Math.sqrt(Math.max(0,e*e-t*t))+Math.sqrt(Math.max(0,n*n-r*r))-i*Math.sin(s))/(Math.PI*a*Math.cos(o))}function K5(e,t,n,r,i,a,o,s){return(Math.sqrt(Math.max(0,e*e-t*t))-Math.sqrt(Math.max(0,n*n-r*r))+i*Math.sin(s))/(Math.PI*a*Math.cos(o))}function q5(e,t){return 1-e*Math.sin(t)*Math.sin(t)/2}function J5(e,t,n){return Math.max(0,q5(e,t)-n)}function Y5(e){return e<8?.2:.485-2.88/e}function X5(e,t,n,r){let i=e*1e3,a=Y5(r);return a<=0||n<=0||t<=0?1/0:2*i/(r*t*t*n*a)}function Z5(e,t,n=!1){let r=(1.4+6.5/e)*(20/(t*180/Math.PI))**.15;return n?r*.85:r}function Q5(e,t,n,r,i,a=!1){return X5(e,t,n,r)*Z5(r,i,a)}function $5(e){return e/2}function e7(e,t){return e+2*t}function t7(e){return e%2==0?Math.PI/e:0}function n7(e,t,n){return e*(1+t/n)+t7(n)}function r7(e={}){let t=e.moduleSize??3,n=e.sunTeeth??15,r=e.planetTeeth??12,i=e.numPlanets??3,a=(e.pressureAngleDeg??20)*Math.PI/180,o=e.sunShift??0,s=e.planetShift??0,c=W5(n,r,i,s);if(B(c))return c;let l=V5(a,o,s,n,r);if(B(l))return l;let u=U5(n,r,t,a,l.value),d=[];for(let e=0;e<i;e++){let t=e*2*Math.PI/i,a=n7(t,n,r);d.push({rotationDeg:a*180/Math.PI,position:[u*Math.cos(t),u*Math.sin(t),0]})}return R(d)}function i7(e,t,n,r,i){let a=t*e.toothPitch,o=(t+1)%n*e.toothPitch,s=F5(e.alphaPitch),c=a-e.halfToothAngle-s,l=a+e.halfToothAngle+s,u=L5(e.rb,e.alphaTip,c,r,1),d=L5(e.rb,e.alphaTip,l,r,-1).reverse(),f=jk(u),p=Mk(u),m=jk(d),h=Mk(d),g=[],_=e=>{i.register(e),g.push(e)},v=e.isInternal?e.rb<e.rRoot:e.rb>e.rRoot;v&&_(Fk([e.rRoot*Math.cos(c),e.rRoot*Math.sin(c),0],f));let y=e.rPitch*1e-5,b=Hk(u,{tolerance:y});if(B(b))return b;_(b.value),_(zk(p,[e.rTip*Math.cos(a),e.rTip*Math.sin(a),0],m));let x=Hk(d,{tolerance:y});if(B(x))return x;_(x.value),v&&_(Fk(h,[e.rRoot*Math.cos(l),e.rRoot*Math.sin(l),0]));let S=o-e.halfToothAngle-s,C=.5*(l+S);return S<l&&(C+=Math.PI),_(zk(v?[e.rRoot*Math.cos(l),e.rRoot*Math.sin(l),0]:h,[e.rRoot*Math.cos(C),e.rRoot*Math.sin(C),0],v?[e.rRoot*Math.cos(S),e.rRoot*Math.sin(S),0]:[e.rb*Math.cos(S),e.rb*Math.sin(S),0])),R(g)}function a7(e){return s7(e,!1)}function o7(e){return s7(e,!0)}function s7(e,t){try{var n=WT();let{teeth:r,moduleSize:i,pressureAngle:a,shift:o,clearance:s,flankThinning:c,samples:l=R5(i)}=e;if(r<4)return z(W(`GEAR_TEETH_TOO_FEW`,`gear needs ≥ 4 teeth, got ${r}`));if(i<=0)return z(W(`GEAR_MODULE_NONPOSITIVE`,`module must be > 0, got ${i}`));let u=z5(r,i,a,o,s,c,t),d=n.u(new iE),f=[];for(let e=0;e<r;e++){let t=i7(u,e,r,l,d);if(B(t))return t;f.push(...t.value)}let p=Gk(f);return B(p)?p:R(p.value)}catch(e){n.e=e}finally{n.d()}}function c7(e){let{teeth:t,moduleSize:n,thickness:r,pressureAngleDeg:i=20,shift:a=0,clearance:o=P5,flankThinning:s=0,bore:c=0,samples:l}=e;if(r<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));if(l!==void 0&&(!Number.isInteger(l)||l<1))return z(W(`GEAR_SAMPLES_INVALID`,`samples must be a positive integer; got ${String(l)}`));let u=i*Math.PI/180,d=z5(t,n,u,a,o,s,!1);if(c>0&&c>=2*d.rRoot)return z(W(`GEAR_BORE_TOO_LARGE`,`bore diameter ${c.toFixed(2)} ≥ root diameter ${(2*d.rRoot).toFixed(2)} — would erase the gear teeth`));let f=a7({teeth:t,moduleSize:n,pressureAngle:u,shift:a,clearance:o,flankThinning:s,...l===void 0?{}:{samples:l}});if(B(f))return f;let p=u7(t,u,a);return h7(f.value,r,c,d,p)}function l7(e){let{teeth:t,moduleSize:n,thickness:r,pressureAngleDeg:i=20,shift:a=0,clearance:o=P5,flankThinning:s=0,ringWallThickness:c=2*e.moduleSize,samples:l}=e;if(r<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));if(c<=0)return z(W(`GEAR_WALL_NONPOSITIVE`,`ringWallThickness must be > 0`));if(l!==void 0&&(!Number.isInteger(l)||l<1))return z(W(`GEAR_SAMPLES_INVALID`,`samples must be a positive integer; got ${String(l)}`));let u=i*Math.PI/180,d=o7({teeth:t,moduleSize:n,pressureAngle:u,shift:a,clearance:o,flankThinning:s,...l===void 0?{}:{samples:l}});if(B(d))return d;let f=z5(t,n,u,a,o,s,!0),p=m7(f.rPitch+c);return B(p)?p:_7(p.value,d.value,r,f,[])}function u7(e,t,n){let r=J5(e,t,n);return r<=0?[]:[{code:`UNDERCUT_RISK`,severity:`warning`,message:`gear is undercut: increase shift by ${r.toFixed(3)} to avoid (z=${e})`,context:{deficit:r,teeth:e}}]}function d7(e){let t=p7(e);if(B(t))return t;let n=t.value,r=f7(n);if(B(r))return r;let{sun:i,planet:a,ring:o}=r.value,s=x7(n,i,a,o),c=y7(a.solid,n);a.solid.delete();let l=b7(o.solid,n.zr),u=S7(n,s);return R({sun:i.solid,planets:c,ring:l,ringTeeth:n.zr,workingPressureAngle:n.alphaW_sp,centerDistance:n.centerDistance,contactRatio:{sunPlanet:s.crSunPlanet,planetRing:s.crPlanetRing},undercutDeficit:{sun:s.undercutSun,planet:s.undercutPlanet},...s.lewisStress?{lewisStress:s.lewisStress}:{},...s.stressConcentrationFactor?{stressConcentrationFactor:s.stressConcentrationFactor}:{},diagnostics:u})}function f7(e){let t=e.samples===void 0?{}:{samples:e.samples},n={moduleSize:e.moduleSize,thickness:e.thickness,pressureAngleDeg:e.pressureAngleDeg,clearance:e.clearance,flankThinning:e.bHalf,...t},r=c7({...n,teeth:e.sunTeeth,shift:e.sunShift,bore:e.sunBore});if(B(r))return r;let i=c7({...n,teeth:e.planetTeeth,shift:e.planetShift,bore:e.planetBore});if(B(i))return r.value.solid.delete(),i;let a=l7({...n,teeth:e.zr,shift:e.ringShift,ringWallThickness:e.ringWallThickness});return B(a)?(r.value.solid.delete(),i.value.solid.delete(),a):R({sun:r.value,planet:i.value,ring:a.value})}function p7(e){let t=e.moduleSize??3,n=e.sunTeeth??15,r=e.planetTeeth??12,i=e.numPlanets??3,a=e.pressureAngleDeg??20,o=a*Math.PI/180,s=e.sunShift??0,c=e.planetShift??0,l=e.ringShift??0;if(e.thickness<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));let u=W5(n,r,i,c);if(B(u))return u;let d=e7(n,r),f=V5(o,s,c,n,r);if(B(f))return f;let p=H5(o,c,l,r,d);if(B(p))return p;let m=U5(n,r,t,o,f.value);return R({moduleSize:t,sunTeeth:n,planetTeeth:r,numPlanets:i,pressureAngleDeg:a,alpha:o,alphaW_sp:f.value,alphaW_pr:p.value,clearance:e.clearance??.25,bHalf:$5(e.backlash??0),sunShift:s,planetShift:c,ringShift:l,ringWallThickness:e.ringWallThickness??2*t,thickness:e.thickness,sunBore:e.sunBore??0,planetBore:e.planetBore??0,...e.appliedTorque===void 0?{}:{appliedTorque:e.appliedTorque},...e.samples===void 0?{}:{samples:e.samples},zr:d,centerDistance:m})}function m7(e){try{var t=WT();let n=Gk([t.u(new iE).register(Ik(e,[0,0,0],[0,0,1]))]);return B(n)?n:R(n.value)}catch(e){t.e=e}finally{t.d()}}function h7(e,t,n,r,i){try{var a=WT();let o=a.u(new iE);o.register(e);let s=Kk(e);if(B(s))return s;o.register(s.value);let c=Vq(s.value,[0,0,t]);if(B(c))return c;if(n<=0)return R(v7(c.value,r,i));let l=a.u(new iE);l.register(c.value);let u=g7(n/2);if(B(u))return u;l.register(u.value);let d=Vq(u.value,[0,0,t+1]);if(B(d))return d;l.register(d.value);let f=l.register(rj(d.value,[0,0,-.5])),p=OA(c.value,f);return B(p)?p:R(v7(p.value,r,i))}catch(e){a.e=e}finally{a.d()}}function g7(e){let t=m7(e);return B(t)?t:Kk(t.value)}function _7(e,t,n,r,i){let a=Kk(e,[t]);if(B(a))return a;let o=Vq(a.value,[0,0,n]);return B(o)?o:R(v7(o.value,r,i))}function v7(e,t,n=[]){return{solid:e,diagnostics:n,pitchDiameter:2*t.rPitch,baseDiameter:2*t.rb,tipDiameter:2*t.rTip,rootDiameter:2*t.rRoot}}function y7(e,t){let n=[];try{for(let r=0;r<t.numPlanets;r++){let i=r*2*Math.PI/t.numPlanets,a=ij(e,n7(i,t.sunTeeth,t.planetTeeth)*180/Math.PI);try{let e=[t.centerDistance*Math.cos(i),t.centerDistance*Math.sin(i),0];n.push(rj(a,e))}finally{a.delete()}}return n}catch(e){for(let e of n)e.delete();throw e}}function b7(e,t){let n=t7(t);if(n===0)return e;let r=ij(e,n*180/Math.PI);return e.delete(),r}function x7(e,t,n,r){let i={crSunPlanet:G5(t.tipDiameter/2,t.baseDiameter/2,n.tipDiameter/2,n.baseDiameter/2,e.centerDistance,e.moduleSize,e.alpha,e.alphaW_sp),crPlanetRing:K5(n.tipDiameter/2,n.baseDiameter/2,r.tipDiameter/2,r.baseDiameter/2,e.centerDistance,e.moduleSize,e.alpha,e.alphaW_pr),undercutSun:J5(e.sunTeeth,e.alpha,e.sunShift),undercutPlanet:J5(e.planetTeeth,e.alpha,e.planetShift)};if(e.appliedTorque!==void 0){let t=e.appliedTorque;i.lewisStress={sun:Q5(t,e.moduleSize,e.thickness,e.sunTeeth,e.alpha),planet:Q5(t*e.planetTeeth/e.sunTeeth,e.moduleSize,e.thickness,e.planetTeeth,e.alpha),ring:Q5(t*e.zr/e.sunTeeth,e.moduleSize,e.thickness,e.zr,e.alpha,!0)},i.stressConcentrationFactor={sun:Z5(e.sunTeeth,e.alpha),planet:Z5(e.planetTeeth,e.alpha),ring:Z5(e.zr,e.alpha,!0)}}return i}function S7(e,t){let n=[];t.crSunPlanet<1.2&&n.push({code:`CONTACT_RATIO_LOW_SUN_PLANET`,severity:`warning`,message:`sun-planet contact ratio ${t.crSunPlanet.toFixed(2)} is below 1.2 — may run unevenly`,context:{value:t.crSunPlanet}}),t.crPlanetRing<1.2&&n.push({code:`CONTACT_RATIO_LOW_PLANET_RING`,severity:`warning`,message:`planet-ring contact ratio ${t.crPlanetRing.toFixed(2)} is below 1.2 — may run unevenly`,context:{value:t.crPlanetRing}}),t.undercutSun>0&&n.push({code:`UNDERCUT_RISK_SUN`,severity:`warning`,message:`sun gear is undercut: increase sunShift by ${t.undercutSun.toFixed(3)} to avoid`,context:{deficit:t.undercutSun,sunTeeth:e.sunTeeth}}),t.undercutPlanet>0&&n.push({code:`UNDERCUT_RISK_PLANET`,severity:`warning`,message:`planet gear is undercut: increase planetShift by ${t.undercutPlanet.toFixed(3)} to avoid`,context:{deficit:t.undercutPlanet,planetTeeth:e.planetTeeth}});let r=Math.abs(e.sunShift)+Math.abs(e.planetShift)+Math.abs(e.ringShift);e.appliedTorque!==void 0&&r>.05&&n.push({code:`LEWIS_Y_SHIFT_UNCORRECTED`,severity:`info`,message:`Lewis stress uses unshifted Y(z) and K_f approximations; expect ±5% per 0.1 of profile shift`});let i=e.ringShift-(e.sunShift+2*e.planetShift);return Math.abs(i)>1e-6&&n.push({code:`PLANETARY_SHIFT_KINEMATIC_MISMATCH`,severity:`warning`,message:`ringShift should equal sunShift + 2·planetShift for both meshes to share working PA; off by ${i.toFixed(3)}`,context:{kinematicError:i,sunShift:e.sunShift,planetShift:e.planetShift,ringShift:e.ringShift}}),n}var C7=NZ({addHoles:()=>Vj,bezier:()=>Oj,box:()=>hj,bsplineApprox:()=>Dj,circle:()=>Sj,compound:()=>Lj,cone:()=>vj,cylinder:()=>gj,ellipse:()=>Cj,ellipseArc:()=>Ej,ellipsoid:()=>bj,face:()=>Mj,fill:()=>qk,filledFace:()=>Nj,helix:()=>wj,line:()=>xj,offsetFace:()=>zj,polygon:()=>Fj,polyhedron:()=>Q3,sewShells:()=>Bj,solid:()=>Rj,sphere:()=>_j,subFace:()=>Pj,tangentArc:()=>kj,threePointArc:()=>Tj,torus:()=>yj,vertex:()=>Ij,wire:()=>Aj,wireLoop:()=>jj}),w7=NZ({checkBoolean:()=>mN,convexHull:()=>q3,cut:()=>N8,cutAll:()=>MA,cutAllBisect:()=>aN,fuse:()=>M8,fuseAll:()=>jA,fuseAllBisect:()=>lN,hull:()=>K3,intersect:()=>I8,minkowski:()=>Z3,section:()=>L8,sectionToFace:()=>R8,slice:()=>B8,split:()=>z8}),T7=NZ({chamfer:()=>G8,draft:()=>Y8,fillet:()=>W8,heal:()=>X8,offset:()=>q8,shell:()=>K8,simplify:()=>Z8,thicken:()=>J8,variableFillet:()=>$M}),E7=NZ({applyMatrix:()=>k8,clone:()=>O8,composeTransforms:()=>fj,mirror:()=>E8,rotate:()=>T8,scale:()=>D8,transformCopy:()=>A8,translate:()=>C8}),D7=NZ({checkAllInterferences:()=>$6,checkInterference:()=>Q6,createDistanceQuery:()=>cP,measureArea:()=>iP,measureCurvatureAt:()=>lP,measureCurvatureAtMid:()=>uP,measureDistance:()=>oP,measureDistanceProps:()=>sP,measureLength:()=>aP,measureLinearProps:()=>nP,measureSurfaceProps:()=>tP,measureVolume:()=>rP,measureVolumeProps:()=>eP}),O7=NZ({blueprintToDXF:()=>xX,exportAssemblySTEP:()=>WF,exportDXF:()=>bX,exportGlb:()=>sX,exportGltf:()=>oX,exportIGES:()=>DM,exportOBJ:()=>XY,exportSTEP:()=>TM,exportSTEPConfigured:()=>iZ,exportSTL:()=>EM,exportThreeMF:()=>BX,importDXF:()=>i8,importGLB:()=>x8,importIGES:()=>sZ,importOBJ:()=>c8,importSTEP:()=>aZ,importSTL:()=>oZ,importSVG:()=>rZ,importSVGPathD:()=>nZ,importThreeMF:()=>b8}),k7=NZ({cornerFinder:()=>_z,edgeFinder:()=>FL,faceFinder:()=>RL,getSingleFace:()=>VL,vertexFinder:()=>WZ,wireFinder:()=>BL}),A7=NZ({complexExtrude:()=>VN,extrude:()=>a5,guidedSweep:()=>KN,loft:()=>s5,multiSectionSweep:()=>GN,revolve:()=>o5,roof:()=>x6,supportExtrude:()=>BN,surfaceFromGrid:()=>V3,surfaceFromImage:()=>W3,sweep:()=>zN,twistExtrude:()=>HN}),j7=NZ({circularPattern:()=>HF,linearPattern:()=>VF}),M7=NZ({CSG_VERSION:()=>5,Evaluator:()=>q2,add:()=>Z$,arbitraryClosedProfile:()=>A0,arbitraryProfileWithVoids:()=>j0,arcTo:()=>_1,asScalarExpr:()=>$$,asVec2Expr:()=>n1,asVec3Expr:()=>t1,asymmetricIProfile:()=>b0,bezierTo:()=>v1,binOp:()=>q$,box:()=>N1,buildVec:()=>X$,cShapeProfile:()=>T0,circle:()=>z1,circleHollowProfile:()=>k0,circularProfile:()=>v0,color:()=>o0,component:()=>Y$,compound:()=>f0,cone:()=>I1,contour:()=>b1,cut:()=>J1,cutAll:()=>Z1,cylinder:()=>F1,ellipseArcTo:()=>y1,ellipseProfile:()=>E0,emptyFace:()=>W1,emptySolid:()=>U1,emptyWire:()=>G1,extrude:()=>r0,fillet:()=>a0,foldExpr:()=>Q4,forEachNode:()=>p3,fromJSON:()=>d4,fuse:()=>q1,fuseAll:()=>X1,iBeamProfile:()=>y0,instance:()=>p0,intersect:()=>Y1,lShapeProfile:()=>x0,line:()=>B1,lineTo:()=>g1,loft:()=>u0,mirror:()=>n0,mul:()=>Q$,nodeCount:()=>h3,numLit:()=>U$,optimize:()=>Z4,outputKindOf:()=>m0,param:()=>K$,path:()=>l0,polygon:()=>R1,profile:()=>s0,rectangleHollowProfile:()=>O0,rectangularProfile:()=>_0,replaceNode:()=>l3,revolve:()=>d0,rotate:()=>e0,scale:()=>t0,sphere:()=>P1,sweep:()=>c0,tShapeProfile:()=>S0,toJSON:()=>X2,torus:()=>L1,translate:()=>$1,trapeziumProfile:()=>D0,uShapeProfile:()=>C0,unaryOp:()=>J$,vec2Lit:()=>G$,vec3Lit:()=>W$,vertex:()=>V1,withEvaluator:()=>J2,zShapeProfile:()=>w0});export{dz as BaseSketcher2d,fz as BlueprintSketcher,r as BrepBugError,H as BrepErrorCode,h5 as BrepWrapperError,Cy as BrepkitAdapter,Wq as CompoundSketch,o as DEFAULT_CAPABILITIES,CD as DEG2RAD,iE as DisposalScope,a as EXACT_BREP_CAPABILITIES,CJ as FaceSketcher,G as HASH_CODE_MAX,WE as OK,uo as OcctWasmAdapter,wD as RAD2DEG,oJ as Sketch,SJ as Sketcher,sJ as Sketches,KF as addChild,Vj as addHoles,hI as addJoint,X6 as addMate,XI as addStep,CP as adjacentFaces,$E as all,JE as andThen,RZ as applyGlue,k8 as applyMatrix,cM as approximateCurve,mE as as2D,pE as as3D,ZO as asTopo,RP as assignRoles,jN as autoHeal,Oj as bezier,D3 as blueprintToContour,xX as blueprintToDXF,WA as booleanPipeline,w7 as booleans,f5 as boss,hj as box,Dj as bsplineApprox,i as bug,yJ as cameraFromPlane,vJ as cameraLookAt,AP as captureHint,rk as cast,LE as castShape,RE as castShape3D,G8 as chamfer,eN as chamferDistAngleShape,CN as chamferWithEvolution,$6 as checkAllInterferences,mN as checkBoolean,Q6 as checkInterference,Sj as circle,HF as circularPattern,vk as classifyPointOnFace,vM as clearMeshCache,O8 as clone,pO as closedWire,uD as collect,QF as collectShapes,gA as colorFaces,hA as colorShape,VN as complexExtrude,fj as composeTransforms,Lj as compound,rJ as compoundSketchExtrude,tJ as compoundSketchFace,aJ as compoundSketchLoft,iJ as compoundSketchRevolve,vD as computationError,p6 as computeStraightSkeleton,vj as cone,A7 as construction,q3 as convexHull,_z as cornerFinder,ZF as countNodes,MF as createAssembly,GF as createAssemblyNode,FY as createBlueprint,_J as createCamera,DE as createCompound,IY as createCompoundBlueprint,_F as createDerivedFaceRef,cP as createDistanceQuery,xE as createEdge,eF as createEdgeRef,CE as createFace,eE as createHandle,YI as createHistory,rE as createKernelHandle,yM as createMeshCache,WO as createNamedPlane,TZ as createOperationRegistry,HO as createPlane,zP as createRef,rL as createRegistry,wE as createShell,TE as createSolid,_Z as createTaskQueue,bE as createVertex,cF as createVertexRef,SE as createWire,wZ as createWorkerClient,AZ as createWorkerHandler,jZ as createWorkerPool,M7 as csg,mo as currentQuality,DY as curve2dBoundingBox,PY as curve2dDistanceFrom,OY as curve2dFirstPoint,NY as curve2dIsOnCurve,kY as curve2dLastPoint,jY as curve2dParameter,AY as curve2dSplitAt,MY as curve2dTangentAt,tM as curveAxis,Zj as curveEndPoint,nM as curveIsClosed,rM as curveIsPeriodic,eM as curveLength,iM as curvePeriod,Qj as curvePointAt,Xj as curveStartPoint,$j as curveTangentAt,N8 as cut,rB as cut2D,F8 as cutAll,aN as cutAllBisect,Kz as cutBlueprints,bN as cutWithEvolution,gj as cylinder,cI as cylindricalJoint,kP as defaultScorer,yZ as dequeueTask,e5 as describe,eY as deserializeDrawing,uL as deserializeHistory,ak as deserializeShape,tk as downcast,Y8 as draft,nY as draw,sY as drawCircle,cY as drawEllipse,hY as drawFaceOutline,fY as drawParametricFunction,dY as drawPointsInterpolation,lY as drawPolysides,mY as drawProjection,iY as drawRectangle,rY as drawRoundedRectangle,aY as drawSingleCircle,oY as drawSingleEllipse,uY as drawText,xY as drawingChamfer,vY as drawingCut,bY as drawingFillet,_Y as drawingFuse,yY as drawingIntersect,gY as drawingToSketchOnPlane,u5 as drill,FL as edgeFinder,yP as edgesOfFace,Cj as ellipse,Ej as ellipseArc,bj as ellipsoid,vZ as enqueueTask,z as err,WF as exportAssemblySTEP,bX as exportDXF,sX as exportGlb,oX as exportGltf,DM as exportIGES,XY as exportOBJ,TM as exportSTEP,iZ as exportSTEPConfigured,EM as exportSTL,BX as exportThreeMF,WI as exportURDF,a5 as extrude,Uq as extrudeAll,Mj as face,_k as faceAxis,gk as faceCenter,RL as faceFinder,ck as faceGeomType,lk as faceOrientation,_P as facesOfEdge,vP as facesOfVertex,jQ as fieldBoolean,FQ as fieldContour,MQ as fieldOffset,PQ as fieldReinit,NQ as fieldShell,qk as fill,Nj as filledFace,W8 as fillet,SN as filletWithEvolution,iA as findFacesByTag,YF as findNode,QI as findStep,PN as fixSelfIntersection,MN as fixShape,YE as flatMap,nD as flatten,uk as flipFaceOrientation,oM as flipOrientation,uZ as fontMetrics,yI as forwardKinematics,n5 as fromBREP,P3 as fromKernelDir,N3 as fromKernelPnt,M3 as fromKernelVec,iD as fromNullable,M8 as fuse,tB as fuse2D,P8 as fuseAll,lN as fuseAllBisect,Gz as fuseBlueprints,yN as fuseWithEvolution,z5 as gearGeometry,XZ as getActiveVoxelId,rO as getBounds,LY as getBounds2D,YD as getCompSolids,Yj as getCurveType,JT as getDisposalStats,UD as getEdges,vA as getFaceColor,Ck as getFaceOrigins,aA as getFaceTags,WD as getFaces,uJ as getFont,Wj as getHashCode,$I as getHistoryShape,F as getKernel,FT as getKernelCapabilities,zT as getKernelTier,tN as getNurbsCurveData,nN as getNurbsSurfaceData,aM as getOrientation,RY as getOrientation2D,Co as getPerformanceStats,_A as getShapeColor,vE as getShapeKind,JD as getShells,VL as getSingleFace,qD as getSolids,sk as getSurfaceType,sA as getTagMetadata,KD as getVertices,YZ as getVoxel,GD as getWires,UF as gridPattern,KN as guidedSweep,X8 as heal,ON as healFace,DN as healSolid,kN as healWire,wj as helix,K3 as hull,i8 as importDXF,x8 as importGLB,sZ as importIGES,c8 as importOBJ,aZ as importSTEP,oZ as importSTL,rZ as importSVG,nZ as importSVGPathD,b8 as importThreeMF,JI as importURDF,UT as init,AT as initFromManifold,VT as initFromOC,ZZ as initVoxel,xk as innerWires,l2 as instance,d2 as instanceCount,u2 as instanceGrid,m2 as instancedMesh,sM as interpolateCurve,I8 as intersect,iB as intersect2D,qz as intersectBlueprints,xN as intersectWithEvolution,HD as invalidateShapeCache,NI as inverseKinematics,O7 as io,yD as ioError,fE as is2D,dE as is3D,mZ as isBatchRequest,BZ as isChamferRadius,lO as isClosedWire,ik as isCompSolid,PE as isCompound,bF as isDerivedFaceRef,pZ as isDisposeRequest,kE as isEdge,xF as isEdgeRef,i5 as isEmpty,qj as isEqualShape,B as isErr,gZ as isErrorResponse,jE as isFace,CF as isFaceRef,VZ as isFilletRadius,dZ as isInitRequest,zY as isInside2D,c2 as isInstanced,wF as isLineageRef,uE as isLive,dO as isManifoldShell,zZ as isNumber,GE as isOk,fZ as isOperationRequest,uO as isOrientedFace,_O as isPlanarFace,vO as isPlanarWire,mJ as isProjectionPlane,xZ as isQueueEmpty,Kj as isSameShape,IE as isShape1D,FE as isShape3D,ME as isShell,NE as isSolid,hZ as isSuccessResponse,r5 as isValid,fO as isValidSolid,OE as isVertex,SF as isVertexRef,AE as isWire,nO as iterCompSolids,XD as iterEdges,ZD as iterFaces,tO as iterShells,eO as iterSolids,$O as iterTopo,$D as iterVertices,QD as iterWires,FI as jointTrajectory,mI as jointTransform,RI as jointsFromDH,jD as kernelCall,MD as kernelCallRaw,ND as kernelCallScoped,U as kernelError,S$ as latticeInfill,C$ as latticeInfillShape,xj as line,VF as linearPattern,lJ as loadFont,j8 as locate,s5 as loft,JN as loftAll,NJ as makeBaseBox,c7 as makeExternalGear,l7 as makeInternalGear,KO as makePlane,d7 as makePlanetaryGear,gJ as makeProjectedEdges,hO as manifoldShell,KE as map,rD as mapBoth,qE as mapErr,lD as match,f2 as materialize,iP as measureArea,lP as measureCurvatureAt,uP as measureCurvatureAtMid,oP as measureDistance,sP as measureDistanceProps,aP as measureLength,nP as measureLinearProps,tP as measureSurfaceProps,rP as measureVolume,eP as measureVolumeProps,D7 as measurement,bI as mechanismDOF,Q8 as mesh,$8 as meshEdges,MM as meshLODs,PM as meshLODsProgressive,OM as meshMultiLOD,Z3 as minkowski,E8 as mirror,WY as mirror2D,TY as mirrorDrawing,p5 as mirrorJoin,T7 as modifiers,cL as modifyStep,_D as moduleInitError,GN as multiSectionSweep,hk as normalAt,q8 as offset,zj as offsetFace,pQ as offsetMesh,gQ as offsetShape,lM as offsetWire2D,R as ok,XE as or,ZE as orElse,ez as organiseBlueprints,mO as orientedFace,yk as outerWire,j7 as patterns,bZ as pendingCount,pD as pipeline,YO as pivotPlane,yO as planarFace,lI as planarJoint,bO as planarWire,r7 as planetPlacements,d5 as pocket,fk as pointOnSurface,nQ as pointsInside,Fj as polygon,Q3 as polyhedron,kJ as polysideInnerRadius,vz as polysidesBlueprint,TN as positionOnCurve,HT as prewarm,C7 as primitives,sI as prismaticJoint,bJ as projectEdges,mk as projectPointOnFace,k7 as query,bD as queryError,m5 as rectangularPattern,EZ as registerHandler,jT as registerKernel,RT as registerKernelTier,iL as registerOperation,nL as registerShape,JZ as registerVoxel,SZ as rejectAll,qF as removeChild,bk as removeHolesFromFace,aQ as repairMesh,sL as replayFrom,oL as replayHistory,YT as resetDisposalStats,wo as resetPerformanceStats,sj as resize,$ as resolve,S8 as resolve3D,vF as resolveDerivedFaceRef,wO as resolveDirection,tF as resolveEdgeRef,EF as resolveLineageRef,GO as resolvePlane,GP as resolveRef,OF as resolveRefIn,AF as resolveRefParams,lF as resolveVertexRef,EY as reverseCurve,oI as revoluteJoint,o5 as revolve,x6 as roof,T8 as rotate,HY as rotate2D,CY as rotateDrawing,yz as roundedRectangleBlueprint,D8 as scale,UY as scale2D,wY as scaleDrawing,ZQ as sdfBox,t$ as sdfCapsule,e$ as sdfCone,$Q as sdfCylinder,p$ as sdfFieldAxialRamp,g$ as sdfFieldClamp,f$ as sdfFieldConst,h$ as sdfFieldFromSdf,m$ as sdfFieldRadialRamp,s$ as sdfLattice,r$ as sdfPlane,QQ as sdfRoundedBox,XQ as sdfSphere,c$ as sdfStrutLattice,a$ as sdfSweep,n$ as sdfTorus,L8 as section,R8 as sectionToFace,lL as serializeHistory,fI as setJointValue,dI as setJointValues,Sk as setShapeOrigin,oA as setTagMetadata,Bj as sewShells,N5 as shape,sQ as shapeToMeshInput,ek as shapeType,TP as sharedEdges,K8 as shell,mQ as shellMesh,_Q as shellShape,wN as shellWithEvolution,Z8 as simplify,wJ as sketchCircle,TJ as sketchEllipse,Zq as sketchExtrude,Jq as sketchFace,AJ as sketchFaceOffset,MJ as sketchHelix,$q as sketchLoft,qY as sketchOnFace2D,KY as sketchOnPlane2D,jJ as sketchParametricFunction,OJ as sketchPolysides,EJ as sketchRectangle,Xq as sketchRevolve,DJ as sketchRoundedRectangle,Qq as sketchSweep,cZ as sketchText,Yq as sketchWires,gD as sketcherStateError,B8 as slice,Rj as solid,NN as solidFromShell,Z6 as solveAssembly,_j as sphere,uI as sphericalJoint,z8 as split,eL as stepCount,tL as stepsFrom,GY as stretch2D,Pj as subFace,BN as supportExtrude,FZ as supportsConstraintSketch,PZ as supportsProjection,V3 as surfaceFromGrid,W3 as surfaceFromImage,zN as sweep,rA as tagFaces,kj as tangentArc,eD as tap,tD as tapErr,fJ as textBlueprints,lZ as textMetrics,J8 as thicken,dL as thread,Tj as threePointArc,t5 as toBREP,FM as toBufferGeometryData,IM as toGroupedBufferGeometryData,k3 as toKernelVec,RM as toLODGeometryData,zM as toLODGeometryLevels,LM as toLineGeometryData,BY as toSVGPathD,SO as toVec2,xO as toVec3,yj as torus,w$ as tpmsLattice,A8 as transformCopy,E7 as transforms,C8 as translate,VY as translate2D,SY as translateDrawing,JO as translatePlane,dD as tryCatch,fD as tryCatchAsync,HN as twistExtrude,hD as typeCastError,ZI as undoLast,xD as unsupportedError,V as unwrap,cD as unwrapErr,oD as unwrapOr,sD as unwrapOrElse,JF as updateNode,VP as updateRoles,dk as uvBounds,pk as uvCoordinates,gO as validSolid,W5 as validatePlanetary,W as validationError,$M as variableFillet,TO as vecAdd,LO as vecAngle,AO as vecCross,NO as vecDistance,kO as vecDot,FO as vecEquals,IO as vecIsZero,jO as vecLength,MO as vecLengthSq,OO as vecNegate,PO as vecNormalize,RO as vecProjectToPlane,VO as vecRepr,zO as vecRotate,DO as vecScale,EO as vecSub,Ij as vertex,WZ as vertexFinder,cO as vertexPosition,SP as verticesOfEdge,bP as verticesOfFace,hQ as voxelBoolean,AQ as voxelBooleanField,LQ as voxelBooleanFieldShapes,vQ as voxelBooleanShapes,kQ as voxelField,IQ as voxelFieldFromShape,XF as walkAssembly,tQ as windingNumbers,Aj as wire,BL as wireFinder,jj as wireLoop,xP as wiresOfFace,PT as withKernel,L3 as withKernelDir,I3 as withKernelPnt,F3 as withKernelVec,IT as withQuality,aE as withScope,cE as withScopeResult,lE as withScopeResultAsync,BT as withTier,QE as zipResults};
|
|
59
|
+
</Relationships>`),c(`3D/3dmodel.model`,s)])}function VX(e){let t=[],n=/([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g,r;for(;(r=n.exec(e))!==null;){let e=r[1]??``,n=(r[2]??``).trim(),i=[];if(n){let e=/[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/g,t;for(;(t=e.exec(n))!==null;)i.push(parseFloat(t[0]))}t.push({command:e,args:i})}return t}function HX(e){return[e[0],-e[1]]}function UX(e,t,n,r){let i=0;for(;i<e.length;){let a=(n?t.cx:0)+(e[i]??0),o=(n?t.cy:0)+(e[i+1]??0);i===0?(t.sx=a,t.sy=o):r.push(nR(HX([t.cx,t.cy]),HX([a,o]))),t.cx=a,t.cy=o,i+=2}}function WX(e,t,n,r){let i=0;for(;i<e.length;){let a=(n?t.cx:0)+(e[i]??0),o=(n?t.cy:0)+(e[i+1]??0);r.push(nR(HX([t.cx,t.cy]),HX([a,o]))),t.cx=a,t.cy=o,i+=2}}function GX(e,t,n,r){for(let i of e){let e=n?t.cx+i:i;r.push(nR(HX([t.cx,t.cy]),HX([e,t.cy]))),t.cx=e}}function KX(e,t,n,r){for(let i of e){let e=n?t.cy+i:i;r.push(nR(HX([t.cx,t.cy]),HX([t.cx,e]))),t.cy=e}}function qX(e,t,n,r){let i=0;for(;i+5<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=a+(e[i]??0),c=o+(e[i+1]??0),l=a+(e[i+2]??0),u=o+(e[i+3]??0),d=a+(e[i+4]??0),f=o+(e[i+5]??0);r.push(cR(HX([t.cx,t.cy]),[HX([s,c]),HX([l,u])],HX([d,f]))),t.prevControlX=l,t.prevControlY=u,t.cx=d,t.cy=f,i+=6}}function JX(e,t,n,r){let i=0;for(;i+3<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=t.lastCmd,c=s===`C`||s===`S`?2*t.cx-t.prevControlX:t.cx,l=s===`C`||s===`S`?2*t.cy-t.prevControlY:t.cy,u=a+(e[i]??0),d=o+(e[i+1]??0),f=a+(e[i+2]??0),p=o+(e[i+3]??0);r.push(cR(HX([t.cx,t.cy]),[HX([c,l]),HX([u,d])],HX([f,p]))),t.prevControlX=u,t.prevControlY=d,t.cx=f,t.cy=p,t.lastCmd=`S`,i+=4}}function YX(e,t,n,r){let i=0;for(;i+3<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=a+(e[i]??0),c=o+(e[i+1]??0),l=a+(e[i+2]??0),u=o+(e[i+3]??0);r.push(cR(HX([t.cx,t.cy]),[HX([s,c])],HX([l,u]))),t.prevControlX=s,t.prevControlY=c,t.cx=l,t.cy=u,i+=4}}function XX(e,t,n,r){let i=0;for(;i+1<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=t.lastCmd,c=s===`Q`||s===`T`?2*t.cx-t.prevControlX:t.cx,l=s===`Q`||s===`T`?2*t.cy-t.prevControlY:t.cy,u=a+(e[i]??0),d=o+(e[i+1]??0);r.push(cR(HX([t.cx,t.cy]),[HX([c,l])],HX([u,d]))),t.prevControlX=c,t.prevControlY=l,t.cx=u,t.cy=d,t.lastCmd=`T`,i+=2}}function ZX(e,t,n,r,i){let a=Math.max(n,r),o=i?1:-1,s=t+2*o*a,c=[e-o*a,t+o*a],l=[e+o*a,t+o*a];try{return[rR(HX([e,t]),HX(c),HX([e,s])),rR(HX([e,s]),HX(l),HX([e,t]))]}catch{return[]}}function QX(e,t,n,r,i,a,o,s){let c=.5,l=e+c*(n-e),u=t+c*(r-t),d=n-e,f=r-t,p=Math.sqrt(d*d+f*f),m=Math.max(i,a),h=p/2,g=h<m?m-Math.sqrt(m*m-h*h):m,_=(o===s?-1:1)*(s?1:-1),v=-f/p,y=d/p,b=l+_*g*v,x=u+_*g*y;try{return[rR(HX([e,t]),HX([b,x]),HX([n,r]))]}catch{return[nR(HX([e,t]),HX([n,r]))]}}function $X(e,t,n,r){let i=0;for(;i+6<e.length;){let a=n?t.cx:0,o=n?t.cy:0,s=Math.abs(e[i]??0),c=Math.abs(e[i+1]??0),l=(e[i+3]??0)!==0,u=(e[i+4]??0)!==0,d=a+(e[i+5]??0),f=o+(e[i+6]??0);if(s===0||c===0)r.push(nR(HX([t.cx,t.cy]),HX([d,f])));else{let e=d-t.cx,n=f-t.cy;Math.sqrt(e*e+n*n)<1e-10?r.push(...ZX(t.cx,t.cy,s,c,u)):r.push(...QX(t.cx,t.cy,d,f,s,c,l,u))}t.cx=d,t.cy=f,i+=7}}function eZ(e,t){(Math.abs(e.cx-e.sx)>1e-10||Math.abs(e.cy-e.sy)>1e-10)&&t.push(nR(HX([e.cx,e.cy]),HX([e.sx,e.sy]))),e.cx=e.sx,e.cy=e.sy}function tZ(e){let t=VX(e),n=[],r={cx:0,cy:0,sx:0,sy:0,prevControlX:0,prevControlY:0,lastCmd:``};for(let{command:e,args:i}of t){let t=e===e.toLowerCase(),a=e.toUpperCase();switch(a){case`M`:UX(i,r,t,n);break;case`L`:WX(i,r,t,n);break;case`H`:GX(i,r,t,n);break;case`V`:KX(i,r,t,n);break;case`C`:qX(i,r,t,n);break;case`S`:JX(i,r,t,n);break;case`Q`:YX(i,r,t,n);break;case`T`:XX(i,r,t,n);break;case`A`:$X(i,r,t,n);break;case`Z`:eZ(r,n)}a!==`S`&&a!==`T`&&(r.lastCmd=a)}return n}function nZ(e){try{let t=tZ(e);return t.length===0?z(yD(`SVG_EMPTY_PATH`,`SVG path produced no curves`)):R(new ER(t))}catch(e){return z(yD(`SVG_PARSE_FAILED`,`Failed to parse SVG path: ${e instanceof Error?e.message:String(e)}`))}}function rZ(e){try{let t=/\bd\s*=\s*(?:"([^"]*)"|'([^']*)')/,n=[],r=e.toLowerCase(),i=0;for(;i<r.length;){let a=r.indexOf(`<path `,i);if(a===-1)break;let o=e.indexOf(`>`,a);if(o===-1)break;let s=e.slice(a,o+1);i=o+1;let c=t.exec(s),l=c?.[1]??c?.[2];if(!l)continue;let u=nZ(l);u.ok&&n.push(u.value)}return n.length===0?z(yD(`SVG_NO_PATHS`,`No <path> elements found in SVG`)):R(n)}catch(e){return z(yD(`SVG_IMPORT_FAILED`,`Failed to import SVG: ${e instanceof Error?e.message:String(e)}`))}}function iZ(e,t){try{let n=F(),r=e.map(e=>({shape:e.shape.wrapped,name:e.name,color:e.color?[...e.color]:void 0}));return R(n.exportSTEPConfigured(r,t))}catch(e){return z(yD(H.STEP_EXPORT_CONFIGURED_FAILED,`Configured STEP export failed`,e))}}async function aZ(e){try{let t=await e.arrayBuffer(),n=F().importSTEP(t);if(n.length===0)return z(yD(`STEP_IMPORT_FAILED`,`STEP file contains no valid geometry`));for(let e=1;e<n.length;e++){let t=n[e];t&&F().dispose(t)}return R(I(n[0]))}catch(e){return z(yD(`STEP_IMPORT_FAILED`,`Failed to load STEP file`,e))}}async function oZ(e){try{let t=await e.arrayBuffer(),n=F().importSTL(t);return n.IsNull()?z(yD(`STL_IMPORT_FAILED`,`Failed to create solid from STL mesh`)):R(I(n))}catch(e){return z(yD(`STL_IMPORT_FAILED`,`Failed to load STL file`,e))}}async function sZ(e){try{let t=await e.arrayBuffer(),n=F().importIGES(t);if(n.length===0)return z(yD(`IGES_IMPORT_FAILED`,`IGES file contains no valid geometry`));for(let e=1;e<n.length;e++){let t=n[e];t&&F().dispose(t)}return R(I(n[0]))}catch(e){return z(yD(`IGES_IMPORT_FAILED`,`Failed to load IGES file`,e))}}function cZ(e,t,n={}){let r=fJ(e,t);return new sJ((typeof n.plane==`string`||n.plane===void 0?r.sketchOnPlane(n.plane,n.origin):r.sketchOnPlane(n.plane)).map(e=>Array.isArray(e)?new Wq(e.map(Gq)):Gq(e)))}function lZ(e,t){let n=t?.fontSize??1,r=uJ(t?.fontFamily);if(!r)return z(W(H.NO_FONT_LOADED,`No font loaded. Call loadFont() first.`,void 0,void 0,`Load a font with loadFont() before calling textMetrics()`));let i=r.getAdvanceWidth(e,n),a=n/r.unitsPerEm,o=r.ascender*a,s=r.descender*a;return R({width:i,height:o-s,ascender:o,descender:s})}function uZ(e){let t=e?.fontSize??1,n=uJ(e?.fontFamily);if(!n)return z(W(H.NO_FONT_LOADED,`No font loaded. Call loadFont() first.`,void 0,void 0,`Load a font with loadFont() before calling fontMetrics()`));let r=t/n.unitsPerEm,i=n.ascender*r,a=n.descender*r,o=(n.tables?.os2?.sTypoLineGap??0)*r;return R({ascender:i,descender:a,unitsPerEm:n.unitsPerEm,lineHeight:i-a+o})}function dZ(e){return e.type===`init`}function fZ(e){return e.type===`operation`}function pZ(e){return e.type===`dispose`}function mZ(e){return e.type===`batch`}function hZ(e){return e.success}function gZ(e){return!e.success}function _Z(){return{pending:new Map}}function vZ(e,t){let n=new Map(e.pending);return n.set(t.id,t),{pending:n}}function yZ(e,t){let n=e.pending.get(t);if(!n)return{queue:e,task:void 0};let r=new Map(e.pending);return r.delete(t),{queue:{pending:r},task:n}}function bZ(e){return e.pending.size}function xZ(e){return e.pending.size===0}function SZ(e,t){for(let n of e.pending.values())n.reject(t);return{pending:new Map}}function CZ(e,t){let n=t.data,r=e.get(n.id);if(r){if(e.delete(n.id),hZ(n)){let e={};n.resultBrep!==void 0&&(e.resultBrep=n.resultBrep),n.resultData!==void 0&&(e.resultData=n.resultData),r.resolve(e)}else r.reject(Error(n.error))}}function wZ(e){let{worker:t,wasmUrl:n}=e,r=new Map,i=!1;function a(){return crypto.randomUUID()}function o(e){CZ(r,e)}t.addEventListener(`message`,o);function s(e){return i?Promise.reject(Error(`WorkerClient has been disposed`)):new Promise((n,i)=>{r.set(e.id,{resolve:n,reject:i}),t.postMessage(e)})}return{async init(){await s({id:a(),type:`init`,...n===void 0?{}:{wasmUrl:n}})},async execute(e,t,n){return s({id:a(),type:`operation`,operation:e,shapesBrep:t,parameters:n})},executeBatch(e){let t=e.length;return s({id:a(),type:`batch`,operations:e}).then(e=>{let n=e.resultData;if(!Array.isArray(n)||n.length!==t)throw Error(`Invalid batch response: expected ${t} results`);return n})},dispose(){i=!0;for(let e of r.values())e.reject(Error(`WorkerClient disposed`));r.clear(),t.removeEventListener(`message`,o);let e={id:a(),type:`dispose`};t.postMessage(e)}}}function TZ(){return{operations:new Map}}function EZ(e,t,n){let r=new Map(e.operations);return r.set(t,n),{operations:r}}function DZ(e){return e instanceof Error?e.message:String(e)}function OZ(e,t,n,r){let i=e.operations.get(t);if(!i)return{success:!1,error:`Unknown operation: ${t}`};try{let e=i(n,r);return{success:!0,...e.resultBrep===void 0?{}:{resultBrep:e.resultBrep},...e.resultData===void 0?{}:{resultData:e.resultData}}}catch(e){return{success:!1,error:DZ(e)}}}function kZ(e,t){return t.success?{id:e,success:!0,...t.resultBrep===void 0?{}:{resultBrep:t.resultBrep},...t.resultData===void 0?{}:{resultData:t.resultData}}:{id:e,success:!1,error:t.error??`operation failed`}}function AZ(e,t){let n=globalThis;n.onmessage=async r=>{let i=r.data;if(dZ(i)){try{await t(i.wasmUrl);let e={id:i.id,success:!0};n.postMessage(e)}catch(e){let t={id:i.id,success:!1,error:DZ(e)};n.postMessage(t)}return}if(fZ(i)){let t=OZ(e,i.operation,i.shapesBrep,i.parameters);n.postMessage(kZ(i.id,t));return}if(mZ(i)){let t=i.operations.map(t=>OZ(e,t.operation,t.shapesBrep,t.params)),r={id:i.id,success:!0,resultData:t};n.postMessage(r);return}if(pZ(i)){let e={id:i.id,success:!0};n.postMessage(e),n.close?.()}}}function jZ(e){let{workers:t,wasmUrl:n}=e;if(t.length===0)throw Error(`createWorkerPool requires at least one worker`);let r=t.map(e=>({client:wZ({worker:e,...n===void 0?{}:{wasmUrl:n}}),inFlight:0})),i=!1;function a(){return r.reduce((e,t)=>t.inFlight<e.inFlight?t:e)}function o(e,t,n){if(i)return Promise.reject(Error(`WorkerPool has been disposed`));let r=a();return r.inFlight+=1,r.client.execute(e,t,n).finally(()=>{--r.inFlight})}function s(){if(!i){i=!0;for(let e of r)e.client.dispose()}}return{size:r.length,async init(){try{await Promise.all(r.map(e=>e.client.init()))}catch(e){throw s(),e}},execute:o,executeBatch(e){return Promise.all(e.map(e=>o(e.operation,e.shapesBrep,e.params)))},inFlight(){return r.map(e=>e.inFlight)},dispose:s}}var MZ=Object.defineProperty,NZ=(e,t)=>{let n={};for(var r in e)MZ(n,r,{get:e[r],enumerable:!0});return t||MZ(n,Symbol.toStringTag,{value:`Module`}),n};function PZ(e){return`projectEdges`in e}function FZ(e){return`sketchNew`in e&&`sketchDof`in e}var IZ=1,LZ=2;function RZ(e,t){t===`commonFace`&&e.SetGlue(IZ),t===`sameFace`&&e.SetGlue(LZ)}function zZ(e){return typeof e==`number`}function BZ(e){if(typeof e==`number`)return!0;if(typeof e==`object`&&e){let t=e;return`distances`in t&&Array.isArray(t.distances)&&`selectedFace`in t||`distance`in t&&`angle`in t&&`selectedFace`in t}return!1}function VZ(e){return typeof e==`number`?!0:Array.isArray(e)&&e.length===2?e.every(zZ):!1}function HZ(e,t){let n=n=>{let r=e.findAll(n);if(r.length===0)return[];let i=0,a=NO(cO(jk(r)),t);for(let e=1;e<r.length;e++){let n=NO(cO(Ak(r,e)),t);n<a&&(a=n,i=e)}return[Ak(r,i)]},r=e=>{let t=n(e);return t.length===0?z(bD(`FINDER_NOT_UNIQUE`,`Finder expected a unique match but found 0 element(s)`)):R(jk(t))};return{...e,findAll:n,findUnique:r}}function UZ(e){return kL(`vertex`,e,UZ,(t,n)=>({nearestTo:t=>HZ(UZ(e),t),atPosition:(e,t=1e-4)=>n(n=>NO(cO(n),e)<t),withinBox:(e,t)=>n(n=>{let r=cO(n);return r[0]>=e[0]-1e-6&&r[0]<=t[0]+1e-6&&r[1]>=e[1]-1e-6&&r[1]<=t[1]+1e-6&&r[2]>=e[2]-1e-6&&r[2]<=t[2]+1e-6}),atDistance:(e,t=[0,0,0],r=1e-4)=>n(n=>{let i=cO(n);return Math.abs(NO(i,t)-e)<r})}))}function WZ(){return UZ([])}var GZ=new Map,KZ=null,qZ=null;function JZ(e,t){GZ.set(e,t),KZ||=e,e===KZ&&(qZ=t)}function YZ(e){if(!e&&qZ)return qZ;let t=e??KZ;if(!t)throw Error(`brepjs voxel engine not initialized. Call initVoxel() (or registerVoxel()) before using voxel operations.`);let n=GZ.get(t);if(!n)throw Error(`brepjs: voxel engine '${t}' is not registered.`);return n}function XZ(){return KZ}function ZZ(e,t=`voxel`){JZ(t,e),KZ=t,qZ=e}function QZ(e){if(e.vertices.length%3!=0)return W(`VOXEL_INVALID_MESH`,`mesh.vertices length must be a multiple of 3 (flat xyz).`);if(e.triangles.length%3!=0)return W(`VOXEL_INVALID_MESH`,`mesh.triangles length must be a multiple of 3.`);let t=e.vertices.length/3;for(let n=0;n<e.triangles.length;n++){let r=e.triangles[n];if(r===void 0||r>=t)return W(`VOXEL_INVALID_TRIANGLE_INDEX`,`triangle index ${r} at position ${n} is out of range for ${t} vertices.`)}return null}function $Z(e,t){return QZ(e)||(t.length%3==0?null:W(`VOXEL_INVALID_QUERIES`,`queries length must be a multiple of 3 (flat xyz).`))}function eQ(e){try{return R(YZ(e))}catch(e){return z(_D(`VOXEL_NOT_INITIALIZED`,e instanceof Error?e.message:`voxel engine not initialized`,e))}}function tQ(e,t,n){let r=$Z(e,t);if(r)return z(r);let i=eQ(n);return B(i)?i:R(i.value.winding_numbers(e.vertices,e.triangles,t))}function nQ(e,t,n){let r=$Z(e,t);if(r)return z(r);let i=eQ(n);if(B(i))return i;let a=i.value.points_inside(e.vertices,e.triangles,t);return R(Array.from(a,e=>e===1))}var rQ=48,iQ=2;function aQ(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`repairMesh requires a non-empty triangle mesh.`));let i=t?.resolution??rQ,a=t?.padding??iQ;if(!Number.isInteger(i)||i<1)return z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`));if(!Number.isInteger(a)||a<1)return z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`));let o=eQ(n);if(B(o))return o;try{try{var s=WT();let t=s.u(o.value.repair_mesh(e.vertices,e.triangles,i,a)),n=t.positions.length/3;return R({vertices:t.positions,normals:t.normals,triangles:t.indices,uvs:new Float32Array(n*2),faceGroups:[{start:0,count:t.indices.length/3,faceHash:0}]})}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_REPAIR_FAILED`,e instanceof Error?e.message:`voxel repair failed (grid too large?).`,e))}}var oQ=.001;function sQ(e,t=oQ){try{let n=bM(e,{tolerance:t});return n.vertices.length===0||n.triangles.length===0?z(vD(`VOXEL_SHAPE_MESH_EMPTY`,`shape tessellated to an empty triangle mesh.`)):R({vertices:n.vertices,triangles:n.triangles})}catch(e){return z(vD(`VOXEL_SHAPE_MESH_FAILED`,e instanceof Error?e.message:`failed to mesh shape for voxel op.`,e))}}var cQ=48,lQ=2,uQ={union:0,intersection:1,difference:2};function dQ(e){let t=e?.resolution??cQ,n=e?.padding??lQ;return!Number.isInteger(t)||t<1?z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function fQ(e){if(e.positions.length===0||e.indices.length===0)return z(vD(`VOXEL_DEGENERATE_RESULT`,`the voxel operation produced an empty mesh (over-shrunk offset or disjoint operands?).`));let t=e.positions.length/3;return R({vertices:e.positions,normals:e.normals,triangles:e.indices,uvs:new Float32Array(t*2),faceGroups:[{start:0,count:e.indices.length/3,faceHash:0}]})}function pQ(e,t,n,r){let i=QZ(e);if(i)return z(i);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`offsetMesh requires a non-empty triangle mesh.`));if(!Number.isFinite(t))return z(W(`VOXEL_INVALID_DISTANCE`,`distance must be a finite number.`));let a=dQ(n);if(B(a))return a;let o=eQ(r);if(B(o))return o;try{try{var s=WT();return fQ(s.u(o.value.offset_mesh(e.vertices,e.triangles,t,a.value.resolution,a.value.padding)))}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_OFFSET_FAILED`,e instanceof Error?e.message:`voxel offset failed (grid too large?).`,e))}}function mQ(e,t,n,r){let i=QZ(e);if(i)return z(i);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`shellMesh requires a non-empty triangle mesh.`));if(!Number.isFinite(t)||t<=0)return z(W(`VOXEL_INVALID_THICKNESS`,`thickness must be a finite number > 0.`));let a=dQ(n);if(B(a))return a;let o=eQ(r);if(B(o))return o;try{try{var s=WT();return fQ(s.u(o.value.shell_mesh(e.vertices,e.triangles,t,a.value.resolution,a.value.padding)))}catch(e){s.e=e}finally{s.d()}}catch(e){return z(vD(`VOXEL_SHELL_FAILED`,e instanceof Error?e.message:`voxel shell failed (grid too large?).`,e))}}function hQ(e,t,n,r,i){let a=QZ(e);if(a)return z(a);let o=QZ(t);if(o)return z(o);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBoolean requires a non-empty mesh for operand A.`));if(t.vertices.length===0||t.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBoolean requires a non-empty mesh for operand B.`));let s=uQ[n],c=dQ(r);if(B(c))return c;let l=eQ(i);if(B(l))return l;try{try{var u=WT();return fQ(u.u(l.value.voxel_boolean(e.vertices,e.triangles,t.vertices,t.triangles,s,c.value.resolution,c.value.padding)))}catch(e){u.e=e}finally{u.d()}}catch(e){return z(vD(`VOXEL_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel boolean failed (grid too large?).`,e))}}function gQ(e,t,n,r){let i=sQ(e);return B(i)?i:pQ(i.value,t,n,r)}function _Q(e,t,n,r){let i=sQ(e);return B(i)?i:mQ(i.value,t,n,r)}function vQ(e,t,n,r,i){let a=sQ(e);if(B(a))return a;let o=sQ(t);return B(o)?o:hQ(a.value,o.value,n,r,i)}var yQ=48,bQ=2,xQ={union:0,intersection:1,difference:2};function SQ(e){let t=e?.resolution??yQ,n=e?.padding??bQ;return!Number.isInteger(t)||t<1?z(W(`VOXEL_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`VOXEL_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function CQ(e){try{var t=WT();let n=e.contour(),{positions:r,normals:i,indices:a}=t.u({value:n,[Symbol.dispose](){n.free()}}).value;if(r.length===0||a.length===0)return z(vD(`VOXEL_DEGENERATE_RESULT`,`the voxel field contoured to an empty mesh (over-shrunk offset or disjoint operands?).`));let o=r.length/3;return R({vertices:r,normals:i,triangles:a,uvs:new Float32Array(o*2),faceGroups:[{start:0,count:a.length/3,faceHash:0}]})}catch(e){t.e=e}finally{t.d()}}function wQ(e){return{raw:e,delete(){e.free()}}}function TQ(e){return EQ(e)}function EQ(e){let t=rE(wQ(e)),n={get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()},boolean(e,t){return this.value.boolean(e.value,xQ[t]),n},offset(e){return this.value.offset(e),n},shell(e){return this.value.shell(e),n},reinit(){return this.value.reinit(),n},contour(){let e=CQ(this.value);if(B(e))throw Error(e.error.message);return e.value}};return n}function DQ(e){return!e.disposed}function OQ(){return z(W(`VOXEL_FIELD_DISPOSED`,`the voxel field handle has been disposed.`))}function kQ(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelField requires a non-empty triangle mesh.`));let i=SQ(t);if(B(i))return i;let a=eQ(n);if(B(a))return a;try{return R(EQ(new a.value.VoxelField(e.vertices,e.triangles,i.value.resolution,i.value.padding)))}catch(e){return z(vD(`VOXEL_FIELD_VOXELIZE_FAILED`,e instanceof Error?e.message:`voxel field voxelization failed (grid too large or non-dense?).`,e))}}function AQ(e,t,n,r,i){let a=QZ(e);if(a)return z(a);let o=QZ(t);if(o)return z(o);if(e.vertices.length===0||e.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBooleanField requires a non-empty mesh for operand A.`));if(t.vertices.length===0||t.triangles.length===0)return z(W(`VOXEL_EMPTY_MESH`,`voxelBooleanField requires a non-empty mesh for operand B.`));let s=SQ(r);if(B(s))return s;let c=eQ(i);if(B(c))return c;try{return R(EQ(c.value.VoxelField.boolean_of(e.vertices,e.triangles,t.vertices,t.triangles,xQ[n],s.value.resolution,s.value.padding)))}catch(e){return z(vD(`VOXEL_FIELD_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel field boolean failed (grid too large or non-dense?).`,e))}}function jQ(e,t,n){if(!DQ(e)||!DQ(t))return OQ();try{return e.value.boolean(t.value,xQ[n]),R(e)}catch(e){return z(vD(`VOXEL_FIELD_BOOLEAN_FAILED`,e instanceof Error?e.message:`voxel field boolean failed (dim mismatch?).`,e))}}function MQ(e,t){if(!DQ(e))return OQ();if(!Number.isFinite(t))return z(W(`VOXEL_INVALID_DISTANCE`,`distance must be a finite number.`));try{return e.value.offset(t),R(e)}catch(e){return z(vD(`VOXEL_FIELD_OFFSET_FAILED`,e instanceof Error?e.message:`voxel field offset failed.`,e))}}function NQ(e,t){if(!DQ(e))return OQ();if(!Number.isFinite(t)||t<=0)return z(W(`VOXEL_INVALID_THICKNESS`,`thickness must be a finite number > 0.`));try{return e.value.shell(t),R(e)}catch(e){return z(vD(`VOXEL_FIELD_SHELL_FAILED`,e instanceof Error?e.message:`voxel field shell failed.`,e))}}function PQ(e){if(!DQ(e))return OQ();try{return e.value.reinit(),R(e)}catch(e){return z(vD(`VOXEL_FIELD_REINIT_FAILED`,e instanceof Error?e.message:`voxel field reinit failed.`,e))}}function FQ(e){if(!DQ(e))return OQ();try{return CQ(e.value)}catch(e){return z(vD(`VOXEL_FIELD_CONTOUR_FAILED`,e instanceof Error?e.message:`voxel field contour failed.`,e))}}function IQ(e,t,n){let r=sQ(e);return B(r)?r:kQ(r.value,t,n)}function LQ(e,t,n,r,i){let a=sQ(e);if(B(a))return a;let o=sQ(t);return B(o)?o:AQ(a.value,o.value,n,r,i)}var RQ=48,zQ=2;function BQ(e){try{return R(YZ(e))}catch(e){return z(_D(`VOXEL_NOT_INITIALIZED`,e instanceof Error?e.message:`voxel engine not initialized`,e))}}function VQ(e){let t=e?.resolution??RQ,n=e?.padding??zQ;return!Number.isInteger(t)||t<1?z(W(`SDF_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(n)||n<1?z(W(`SDF_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({resolution:t,padding:n})}function HQ(e){return{raw:e,delete(){e.free()}}}var UQ={offsetField(e){return WQ(this.value.offset_field(e.value))},roundField(e){return WQ(this.value.round_field(e.value))},shellField(e){return WQ(this.value.shell_field(e.value))},smoothUnionField(e,t){return WQ(this.value.smooth_union_field(e.value,t.value))}};function WQ(e){let t=rE(HQ(e));return{get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()},union(e){return WQ(this.value.union(e.value))},intersection(e){return WQ(this.value.intersection(e.value))},difference(e){return WQ(this.value.difference(e.value))},smoothUnion(e,t){return WQ(this.value.smooth_union(e.value,t))},smoothIntersection(e,t){return WQ(this.value.smooth_intersection(e.value,t))},smoothDifference(e,t){return WQ(this.value.smooth_difference(e.value,t))},offset(e){return WQ(this.value.offset(e))},round(e){return WQ(this.value.round(e))},shell(e){return WQ(this.value.shell(e))},onion(e){return WQ(this.value.onion(e))},...UQ,translate(e,t,n){return WQ(this.value.translate(e,t,n))},rotate(e,t,n,r){return WQ(this.value.rotate(e,t,n,r))},scale(e){return WQ(this.value.scale(e))},rasterize(e){return GQ(this.value,e)},rasterizeIn(e,t){return KQ(this.value,e,t)}}}function GQ(e,t){let n=VQ(t);if(B(n))return n;try{return R(TQ(e.rasterize(n.value.resolution,n.value.padding)))}catch(e){return qQ(e)}}function KQ(e,t,n){let r=VQ(n);if(B(r))return r;let i=JQ(t);if(i)return z(i);try{return R(TQ(e.rasterize_in(t.min[0],t.min[1],t.min[2],t.max[0],t.max[1],t.max[2],r.value.resolution,r.value.padding)))}catch(e){return qQ(e)}}function qQ(e){return z(vD(`SDF_RASTERIZE_FAILED`,e instanceof Error?e.message:`SDF rasterization failed (grid too large?).`,e))}function JQ(e){if(![...e.min,...e.max].every(e=>Number.isFinite(e)))return W(`SDF_INVALID_BOUNDS`,`bounds must be finite numbers.`);for(let t=0;t<3;t++)if(e.max[t]<=e.min[t])return W(`SDF_INVALID_BOUNDS`,`bounds max must exceed min on every axis.`);return null}function YQ(e,t){let n=BQ(t);if(B(n))return n;try{return R(WQ(e(n.value)))}catch(e){return z(vD(`SDF_BUILD_FAILED`,e instanceof Error?e.message:`SDF primitive construction failed.`,e))}}function XQ(e,t){return YQ(t=>t.Sdf.sphere(e),t)}function ZQ(e,t,n,r){return YQ(r=>r.Sdf.box_(e,t,n),r)}function QQ(e,t,n,r,i){return YQ(i=>i.Sdf.rounded_box(e,t,n,r),i)}function $Q(e,t,n){return YQ(n=>n.Sdf.cylinder(e,t),n)}function e$(e,t,n){return YQ(n=>n.Sdf.cone(e,t),n)}function t$(e,t,n,r){return YQ(r=>r.Sdf.capsule(e[0],e[1],e[2],t[0],t[1],t[2],n),r)}function n$(e,t,n){return YQ(n=>n.Sdf.torus(e,t),n)}function r$(e,t,n){return YQ(n=>n.Sdf.plane(e[0],e[1],e[2],t),n)}function i$(e){if(e.length<2)return z(W(`SDF_INVALID_SPINE`,`sweep spine needs at least 2 points.`));let t=new Float64Array(e.length*3);for(let n=0;n<e.length;n++){let r=e[n];if(!r.every(e=>Number.isFinite(e)))return z(W(`SDF_INVALID_SPINE`,`sweep spine coordinates must be finite.`));t[n*3]=r[0],t[n*3+1]=r[1],t[n*3+2]=r[2]}return R(t)}function a$(e,t,n,r){let i=i$(e);if(B(i))return i;let a=n?.closed??!1;return YQ(e=>e.Sdf.sweep(i.value,t.value,a),r)}var o$={gyroid:0,schwarzP:1,diamond:2};function s$(e,t,n,r){let i=o$[e];return i===void 0?z(W(`SDF_INVALID_LATTICE_KIND`,`unknown lattice kind: ${e}`)):YQ(e=>e.Sdf.lattice(i,t.value,n.value),r)}function c$(e,t,n){return YQ(n=>n.Sdf.strut_lattice(e,t.value),n)}function l$(e){return{raw:e,delete(){e.free()}}}function u$(e){let t=rE(l$(e));return{get value(){return t.value.raw},get disposed(){return t.disposed},[Symbol.dispose](){t[Symbol.dispose]()}}}function d$(e,t){let n=BQ(t);if(B(n))return n;try{return R(u$(e(n.value)))}catch(e){return z(vD(`SDF_FIELD_BUILD_FAILED`,e instanceof Error?e.message:`scalar field construction failed.`,e))}}function f$(e,t){return d$(t=>t.ScalarField.constant(e),t)}function p$(e,t,n,r,i,a){return d$(a=>a.ScalarField.axial_ramp(e,t,n,r,i),a)}function m$(e,t,n,r,i,a,o){return d$(o=>o.ScalarField.radial_ramp(e[0],e[1],e[2],t,n,r,i,a),o)}function h$(e,t,n,r){return d$(r=>r.ScalarField.from_sdf(e.value,t,n),r)}function g$(e,t,n,r){return d$(r=>r.ScalarField.clamp(e.value,t,n),r)}var _$={gyroid:0,schwarzP:1,diamond:2},v$=48,y$=2;function b$(e){let t=_$[e.type];if(t===void 0)return z(W(`LATTICE_INVALID_TYPE`,`lattice type must be one of gyroid, schwarzP, diamond (got '${e.type}').`));if(!(e.period>0))return z(W(`LATTICE_INVALID_PERIOD`,`period must be > 0.`));if(!(e.thickness>0))return z(W(`LATTICE_INVALID_THICKNESS`,`thickness must be > 0.`));let n=e.resolution??v$,r=e.padding??y$;return!Number.isInteger(n)||n<1?z(W(`LATTICE_INVALID_RESOLUTION`,`resolution must be an integer >= 1.`)):!Number.isInteger(r)||r<1?z(W(`LATTICE_INVALID_PADDING`,`padding must be an integer >= 1.`)):R({tag:t,period:e.period,thickness:e.thickness,resolution:n,padding:r})}function x$(e){let t=e.positions.length/3;return{vertices:e.positions,normals:e.normals,triangles:e.indices,uvs:new Float32Array(t*2),faceGroups:[{start:0,count:e.indices.length/3,faceHash:0}]}}function S$(e,t,n){let r=QZ(e);if(r)return z(r);if(e.vertices.length===0||e.triangles.length===0)return z(W(`LATTICE_EMPTY_MESH`,`latticeInfill requires a non-empty triangle mesh.`));let i=b$(t);if(B(i))return i;let a=eQ(n);if(B(a))return a;let{tag:o,period:s,thickness:c,resolution:l,padding:u}=i.value;try{try{var d=WT();return R(x$(d.u(a.value.lattice_infill(e.vertices,e.triangles,l,u,o,s,c))))}catch(e){d.e=e}finally{d.d()}}catch(e){return z(vD(`LATTICE_INFILL_FAILED`,e instanceof Error?e.message:`lattice infill failed (grid too large?).`,e))}}function C$(e,t,n){let r=sQ(e);return B(r)?r:S$(r.value,t,n)}function w$(e,t,n){for(let t=0;t<3;t++){let n=e.min[t],r=e.max[t];if(n===void 0||r===void 0||!(n<r))return z(W(`LATTICE_INVALID_BOUNDS`,`bounds.min must be strictly less than bounds.max on every axis (axis ${t}).`))}let r=b$(t);if(B(r))return r;let i=eQ(n);if(B(i))return i;let{tag:a,period:o,thickness:s,resolution:c,padding:l}=r.value,[u,d,f]=e.min,[p,m,h]=e.max;try{try{var g=WT();return R(x$(g.u(i.value.tpms_box(u,d,f,p,m,h,c,l,a,o,s))))}catch(e){g.e=e}finally{g.d()}}catch(e){return z(vD(`TPMS_LATTICE_FAILED`,e instanceof Error?e.message:`tpms lattice failed (grid too large?).`,e))}}var T$=14695981039346656037n,E$=1099511628211n,D$=18446744073709551615n;function O$(){return T$}function k$(e,t){return(e^BigInt(t&255))*E$&D$}function A$(e,t){let n=e;for(let e=0;e<t.length;e++)n=k$(n,t[e]??0);return n}var j$=new TextEncoder;function M$(e,t){return A$(e,j$.encode(t))}var N$=new ArrayBuffer(8),P$=new DataView(N$),F$=new Uint8Array(N$);function I$(e,t){return P$.setFloat64(0,Object.is(t,-0)?0:t),A$(e,F$)}function L$(e,t){let n=e,r=t&D$;for(let e=0;e<8;e++)n=k$(n,Number(r&255n)),r>>=8n;return n}function R$(e,t){let n=e,r=t|0;for(let e=0;e<4;e++)n=k$(n,r&255),r>>>=8;return n}function z$(e,t){return k$(e,+!!t)}function B$(e){return(e&D$).toString(16).padStart(16,`0`)}var V$=new Set;function H$(e){return M$(O$(),e)}function U$(e){return{kind:`NumLit`,value:e,structuralHash:I$(H$(`NumLit`),e),freeParams:V$}}function W$(e){let t=H$(`Vec3Lit`);for(let n of e)t=I$(t,n);return{kind:`Vec3Lit`,value:e,structuralHash:t,freeParams:V$}}function G$(e){let t=H$(`Vec2Lit`);for(let n of e)t=I$(t,n);return{kind:`Vec2Lit`,value:e,structuralHash:t,freeParams:V$}}function K$(e){return{kind:`Param`,name:e,structuralHash:M$(H$(`Param`),e),freeParams:new Set([e])}}function q$(e,t,n){let r=M$(H$(`BinOp`),e);return r=L$(r,t.structuralHash),r=L$(r,n.structuralHash),{kind:`BinOp`,op:e,a:t,b:n,structuralHash:r,freeParams:r1(t.freeParams,n.freeParams)}}function J$(e,t){let n=M$(H$(`UnaryOp`),e);return n=L$(n,t.structuralHash),{kind:`UnaryOp`,op:e,arg:t,structuralHash:n,freeParams:t.freeParams}}function Y$(e,t){let n=R$(H$(`Component`),t);return n=L$(n,e.structuralHash),{kind:`Component`,vec:e,index:t,structuralHash:n,freeParams:e.freeParams}}function X$(e,t){let n=R$(H$(`BuildVec`),e),r=new Set;for(let e of t){n=L$(n,e.structuralHash);for(let t of e.freeParams)r.add(t)}return{kind:`BuildVec`,dim:e,components:t,structuralHash:n,freeParams:r}}var Z$=(e,t)=>q$(`+`,e,t),Q$=(e,t)=>q$(`*`,e,t);function $$(e){return typeof e==`number`?U$(e):e}function e1(e,t){if(!Array.isArray(e))return e;let n=e;return n.every(e=>typeof e==`number`)?t===3?W$([n[0],n[1],n[2]]):G$([n[0],n[1]]):X$(t,n.map($$))}function t1(e){return e1(e,3)}function n1(e){return e1(e,2)}function r1(e,t){if(e.size===0)return t;if(t.size===0)return e;let n=new Set(e);for(let e of t)n.add(e);return n}function i1(e){return typeof e==`number`}function a1(e,t){return i1(e)?R(e):z(W(H.NULL_SHAPE_INPUT,`${t}: expected number, got ${Array.isArray(e)?`vector(${e.length})`:typeof e}`))}function o1(e,t,n){return Array.isArray(e)&&e.length===t?R(e):z(W(H.NULL_SHAPE_INPUT,`${n}: expected Vec${t}, got ${i1(e)?`number`:`vector(${e.length})`}`))}function s1(e,t){switch(e.kind){case`NumLit`:return R(e.value);case`Vec3Lit`:return R(e.value);case`Vec2Lit`:return R(e.value);case`Param`:{let n=t[e.name];return n===void 0?z(W(H.NULL_SHAPE_INPUT,`unbound param: ${e.name}`)):R(n)}case`BinOp`:return c1(e,t);case`UnaryOp`:return l1(e,t);case`Component`:return u1(e,t);case`BuildVec`:return d1(e,t)}}function c1(e,t){let n=s1(e.a,t);if(!n.ok)return n;let r=s1(e.b,t);if(!r.ok)return r;let i=a1(n.value,`BinOp(${e.op}).a`);if(!i.ok)return i;let a=a1(r.value,`BinOp(${e.op}).b`);if(!a.ok)return a;switch(e.op){case`+`:return R(i.value+a.value);case`-`:return R(i.value-a.value);case`*`:return R(i.value*a.value);case`/`:return a.value===0?z(W(H.NULL_SHAPE_INPUT,`BinOp(/): division by zero`)):R(i.value/a.value)}}function l1(e,t){let n=s1(e.arg,t);if(!n.ok)return n;let r=a1(n.value,`UnaryOp(${e.op})`);if(!r.ok)return r;let i=r.value;switch(e.op){case`neg`:return R(-i);case`sin`:return R(Math.sin(i));case`cos`:return R(Math.cos(i));case`sqrt`:return R(Math.sqrt(i));case`abs`:return R(Math.abs(i))}}function u1(e,t){let n=s1(e.vec,t);if(!n.ok)return n;if(i1(n.value))return z(W(H.NULL_SHAPE_INPUT,`Component: cannot index a scalar`));let r=n.value,i=r[e.index];return i===void 0?z(W(H.NULL_SHAPE_INPUT,`Component: index ${e.index} out of range for Vec${r.length}`)):R(i)}function d1(e,t){if(e.components.length!==e.dim)return z(W(H.NULL_SHAPE_INPUT,`BuildVec(${e.dim}): expected ${e.dim} components, got ${e.components.length}`));let n=[];for(let r of e.components){let e=s1(r,t);if(!e.ok)return e;let i=a1(e.value,`BuildVec.component`);if(!i.ok)return i;n.push(i.value)}return R(e.dim===2?[n[0],n[1]]:[n[0],n[1],n[2]])}function f1(e,t,n){let r=s1(e,t);return r.ok?a1(r.value,n):r}function p1(e,t,n){let r=s1(e,t);if(!r.ok)return r;let i=o1(r.value,3,n);if(!i.ok)return i;let[a,o,s]=i.value;return R([a,o,s])}function m1(e,t,n){let r=s1(e,t);if(!r.ok)return r;let i=o1(r.value,2,n);if(!i.ok)return i;let[a,o]=i.value;return R([a,o])}function h1(e,t){if(t.size===0)return Object.freeze({});let n={};for(let r of t){let t=e[r];t!==void 0&&(n[r]=t)}return Object.freeze(n)}function g1(e){return{kind:`Line`,to:n1(e)}}function _1(e,t,n){return{kind:`Arc`,to:n1(e),radius:$$(t),largeArc:n?.largeArc??!1,clockwise:n?.clockwise??!1}}function v1(e,t){return{kind:`Bezier`,controls:e.map(n1),to:n1(t)}}function y1(e,t,n){return{kind:`EllipseArc`,to:n1(e),radii:n1(t),rotation:$$(n?.rotation??0),largeArc:n?.largeArc??!1,clockwise:n?.clockwise??!1}}function b1(e,t){return{start:n1(e),segments:[...t]}}function x1(e,t){let n=R$(e,t.length),r=(e,t)=>L$(e,t.structuralHash);for(let e of t)if(n=M$(n,e.kind),n=r(n,e.to),e.kind===`Arc`)n=r(n,e.radius),n=z$(z$(n,e.largeArc),e.clockwise);else if(e.kind===`Bezier`){n=R$(n,e.controls.length);for(let t of e.controls)n=r(n,t)}else e.kind===`EllipseArc`&&(n=r(n,e.radii),n=r(n,e.rotation),n=z$(z$(n,e.largeArc),e.clockwise));return n}function S1(e){let t=[];for(let n of e)t.push(n.to),n.kind===`Arc`?t.push(n.radius):n.kind===`Bezier`?t.push(...n.controls):n.kind===`EllipseArc`&&t.push(n.radii,n.rotation);return t}function C1(e,t){return x1(L$(e,t.start.structuralHash),t.segments)}function w1(e){return[e.start,...S1(e.segments)]}function T1(e,t){return{start:t(e.start),segments:e.segments.map(e=>E1(e,t))}}function E1(e,t){switch(e.kind){case`Line`:return g1(t(e.to));case`Arc`:return _1(t(e.to),t(e.radius),{largeArc:e.largeArc,clockwise:e.clockwise});case`Bezier`:return v1(e.controls.map(t),t(e.to));case`EllipseArc`:return y1(t(e.to),t(e.radii),{rotation:t(e.rotation),largeArc:e.largeArc,clockwise:e.clockwise})}}var D1=new Set;function O1(e){return M$(O$(),e)}function k1(e,t){return L$(e,t.structuralHash)}function A1(e,t){return t===void 0?z$(e,!1):k1(z$(e,!0),t)}function j1(e,t){return t===void 0?z$(e,!1):I$(z$(e,!0),t)}function M1(...e){let t=new Set;for(let n of e)if(n)for(let e of n.freeParams)t.add(e);return t.size===0?D1:t}function N1(e,t,n){let r=$$(e),i=$$(t),a=$$(n),o=O1(`Box`);return o=k1(k1(k1(o,r),i),a),{kind:`Box`,x:r,y:i,z:a,structuralHash:o,freeParams:M1(r,i,a)}}function P1(e){let t=$$(e);return{kind:`Sphere`,radius:t,structuralHash:k1(O1(`Sphere`),t),freeParams:t.freeParams}}function F1(e,t){let n=$$(e),r=$$(t);return{kind:`Cylinder`,radius:n,height:r,structuralHash:k1(k1(O1(`Cylinder`),n),r),freeParams:M1(n,r)}}function I1(e,t,n){let r=$$(e),i=$$(t),a=$$(n),o=O1(`Cone`);return o=k1(k1(k1(o,r),i),a),{kind:`Cone`,radius1:r,radius2:i,height:a,structuralHash:o,freeParams:M1(r,i,a)}}function L1(e,t){let n=$$(e),r=$$(t);return{kind:`Torus`,majorRadius:n,minorRadius:r,structuralHash:k1(k1(O1(`Torus`),n),r),freeParams:M1(n,r)}}function R1(e){let t=e.map(t1),n=R$(O1(`Polygon`),t.length);for(let e of t)n=k1(n,e);return{kind:`Polygon`,points:t,structuralHash:n,freeParams:M1(...t)}}function z1(e){let t=$$(e);return{kind:`Circle`,radius:t,structuralHash:k1(O1(`Circle`),t),freeParams:t.freeParams}}function B1(e,t){let n=t1(e),r=t1(t);return{kind:`Line`,from:n,to:r,structuralHash:k1(k1(O1(`Line`),n),r),freeParams:M1(n,r)}}function V1(e){let t=t1(e);return{kind:`Vertex`,point:t,structuralHash:k1(O1(`Vertex`),t),freeParams:t.freeParams}}function H1(e){return{kind:`Empty`,output:e,structuralHash:M$(O1(`Empty`),e),freeParams:D1}}function U1(){return H1(`Solid`)}function W1(){return H1(`Face`)}function G1(){return H1(`Wire`)}function K1(e,t,n,r){return j1(k1(k1(O1(e),t),n),r)}function q1(e,t,n){return{kind:`Fuse`,a:e,b:t,tolerance:n,structuralHash:K1(`Fuse`,e,t,n),freeParams:M1(e,t)}}function J1(e,t,n){return{kind:`Cut`,a:e,b:t,tolerance:n,structuralHash:K1(`Cut`,e,t,n),freeParams:M1(e,t)}}function Y1(e,t,n){return{kind:`Intersect`,a:e,b:t,tolerance:n,structuralHash:K1(`Intersect`,e,t,n),freeParams:M1(e,t)}}function X1(e,t){let n=[...e],r=R$(O1(`FuseAll`),n.length);for(let e of n)r=k1(r,e);return r=j1(r,t),{kind:`FuseAll`,shapes:n,tolerance:t,structuralHash:r,freeParams:M1(...n)}}function Z1(e,t,n){let r=[...t],i=k1(O1(`CutAll`),e);i=R$(i,r.length);for(let e of r)i=k1(i,e);return i=j1(i,n),{kind:`CutAll`,base:e,tools:r,tolerance:n,structuralHash:i,freeParams:M1(e,...r)}}function Q1(e){return e===void 0?void 0:t1(e)}function $1(e,t){let n=t1(t);return{kind:`Translate`,target:e,vector:n,structuralHash:k1(k1(O1(`Translate`),e),n),freeParams:M1(e,n)}}function e0(e,t,n){let r=$$(t),i=Q1(n?.axis),a=Q1(n?.at),o=k1(k1(O1(`Rotate`),e),r);return o=A1(o,i),o=A1(o,a),{kind:`Rotate`,target:e,angle:r,axis:i,at:a,structuralHash:o,freeParams:M1(e,r,i,a)}}function t0(e,t,n){let r=$$(t),i=Q1(n?.center),a=k1(k1(O1(`Scale`),e),r);return a=A1(a,i),{kind:`Scale`,target:e,factor:r,center:i,structuralHash:a,freeParams:M1(e,r,i)}}function n0(e,t){let n=Q1(t?.normal),r=Q1(t?.at),i=k1(O1(`Mirror`),e);return i=A1(i,n),i=A1(i,r),{kind:`Mirror`,target:e,normal:n,at:r,structuralHash:i,freeParams:M1(e,n,r)}}function r0(e,t){let n=t1(t);return{kind:`Extrude`,profile:e,vector:n,structuralHash:k1(k1(O1(`Extrude`),e),n),freeParams:M1(e,n)}}function i0(e,t){let n=M$(e,t.origin);n=M$(n,t.faceRoles[0]),n=M$(n,t.faceRoles[1]);let r=t.hint;if(n=z$(n,r.length!==void 0),r.length!==void 0&&(n=I$(n,r.length)),n=z$(n,r.midpoint!==void 0),r.midpoint)for(let e of r.midpoint)n=I$(n,e);return n}function a0(e){return{origin:e.origin,faceRoles:[e.faceRoles[0],e.faceRoles[1]],hint:{entityType:`edge`,length:e.hint.length,midpoint:e.hint.midpoint?[...e.hint.midpoint]:void 0}}}function o0(e,t,n){let r=a0(t),i=$$(n),a=k1(O1(`Fillet`),e);return a=i0(a,r),a=k1(a,i),{kind:`Fillet`,target:e,ref:r,radius:i,structuralHash:a,freeParams:M1(e,i)}}function s0(e,t,n){let r=a0(t),i=$$(n),a=k1(O1(`Chamfer`),e);return a=i0(a,r),a=k1(a,i),{kind:`Chamfer`,target:e,ref:r,distance:i,structuralHash:a,freeParams:M1(e,i)}}function c0(e,t){let n=mA(t).map(e=>Math.min(1,Math.max(0,e))),r=k1(O1(`Color`),e);for(let e of n)r=I$(r,e);return{kind:`Color`,target:e,color:n,structuralHash:r,freeParams:e.freeParams}}function l0(e,t=[]){let n=[...t],r=C1(O1(`Profile`),e);r=R$(r,n.length);for(let e of n)r=C1(r,e);return{kind:`Profile`,outline:e,holes:n,structuralHash:r,freeParams:M1(...w1(e),...n.flatMap(e=>w1(e)))}}function u0(e,t,n){let r=n?.frenet??!1,i=k1(k1(O1(`Sweep`),e),t);return i=z$(i,r),{kind:`Sweep`,profile:e,spine:t,frenet:r,structuralHash:i,freeParams:M1(e,t)}}function d0(e,t){let n=n1(e),r=[...t],i=k1(O1(`Path`),n);return i=x1(i,r),{kind:`Path`,start:n,segments:r,structuralHash:i,freeParams:M1(n,...S1(r))}}function f0(e,t){let n=[...e],r=t?.ruled??!0,i=R$(O1(`Loft`),n.length);for(let e of n)i=k1(i,e);return i=z$(i,r),{kind:`Loft`,sections:n,ruled:r,structuralHash:i,freeParams:M1(...n)}}function p0(e,t=360,n){let r=$$(t),i=Q1(n?.axis),a=Q1(n?.at),o=k1(k1(O1(`Revolve`),e),r);return o=A1(o,i),o=A1(o,a),{kind:`Revolve`,profile:e,angle:r,axis:i,at:a,structuralHash:o,freeParams:M1(e,r,i,a)}}function m0(e){let t=[...e],n=R$(O1(`Compound`),t.length);for(let e of t)n=k1(n,e);return{kind:`Compound`,children:t,structuralHash:n,freeParams:M1(...t)}}function h0(e,t,n=!1){let r=t.map(e=>e.map(e=>[...e])),i=R$(z$(k1(O1(`Instance`),e),n),r.length);for(let e of r)for(let t of e.flat())i=I$(i,t);return{kind:`Instance`,source:e,placements:r,fuse:n,structuralHash:i,freeParams:M1(e)}}function g0(e){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:return`Solid`;case`Polygon`:return`Face`;case`Circle`:case`Line`:return`Edge`;case`Vertex`:return`Vertex`;case`Empty`:return e.output;case`Fuse`:case`Cut`:case`Intersect`:return g0(e.a);case`FuseAll`:return e.shapes[0]?g0(e.shapes[0]):`Solid`;case`CutAll`:return g0(e.base);case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:case`Color`:return g0(e.target);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Fillet`:case`Chamfer`:return`Solid`;case`Profile`:return`Face`;case`Path`:return`Wire`;case`Compound`:return`Compound`;case`Instance`:return e.fuse?`Solid`:`Compound`}}function _0(e){let t=1/0,n=-1/0,r=1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.max(n,a),r=Math.min(r,o),i=Math.max(i,o);let a=(t+n)/2,o=(r+i)/2,s=e.map(([e,t])=>[e-a,t-o]);return b1(s[0]??[0,0],s.slice(1).map(e=>g1(e)))}function v0(e,t=0,n=0){return b1([t-e,n],[_1([t+e,n],e),_1([t-e,n],e)])}function y0(e,t){let n=e/2,r=t/2;return l0(_0([[-n,-r],[n,-r],[n,r],[-n,r]]))}function b0(e){return l0(v0(e))}function x0(e){let t=e.overallWidth,n=e.overallDepth,r=e.flangeThickness,i=e.webThickness,a=(t-i)/2,o=(t+i)/2;return l0(_0([[0,0],[t,0],[t,r],[o,r],[o,n-r],[t,n-r],[t,n],[0,n],[0,n-r],[a,n-r],[a,r],[0,r]]))}function S0(e){let t=e.overallDepth,n=e.webThickness,r=e.bottomFlangeWidth,i=e.bottomFlangeThickness,a=e.topFlangeWidth,o=e.topFlangeThickness,s=Math.max(r,a)/2;return l0(_0([[s-r/2,0],[s+r/2,0],[s+r/2,i],[s+n/2,i],[s+n/2,t-o],[s+a/2,t-o],[s+a/2,t],[s-a/2,t],[s-a/2,t-o],[s-n/2,t-o],[s-n/2,i],[s-r/2,i]]))}function C0(e){let t=e.legThickness;return l0(_0([[0,0],[e.width,0],[e.width,t],[t,t],[t,e.depth],[0,e.depth]]))}function w0(e){let t=e.flangeWidth,n=e.depth,r=e.flangeThickness,i=e.webThickness;return l0(_0([[(t-i)/2,0],[(t+i)/2,0],[(t+i)/2,n-r],[t,n-r],[t,n],[0,n],[0,n-r],[(t-i)/2,n-r]]))}function T0(e){let t=e.flangeWidth,n=e.depth,r=e.flangeThickness,i=e.webThickness;return l0(_0([[0,0],[t,0],[t,r],[i,r],[i,n-r],[t,n-r],[t,n],[0,n]]))}function E0(e){let t=e.flangeWidth/2,n=e.depth/2,r=e.webThickness/2,i=e.flangeThickness;return l0(_0([[-t,-n],[r,-n],[r,n-i],[t,n-i],[t,n],[-r,n],[-r,-n+i],[-t,-n+i]]))}function D0(e){let t=e.width,n=e.depth,r=e.wallThickness,i=e.girth;return l0(_0([[0,0],[t,0],[t,i],[t-r,i],[t-r,r],[r,r],[r,n-r],[t-r,n-r],[t-r,n-i],[t,n-i],[t,n],[0,n]]))}function O0(e,t){let n=e;return l0(b1([-n,0],[y1([n,0],[n,t]),y1([-n,0],[n,t])]))}function k0(e){let t=e.bottomXDim/2,n=e.yDim/2,r=-e.topXDim/2+e.topXOffset,i=e.topXDim/2+e.topXOffset;return l0(b1([-t,-n],[g1([t,-n]),g1([i,n]),g1([r,n])]))}function A0(e){let t=e.xDim/2,n=e.yDim/2,r=e.wallThickness;return l0(_0([[-t,-n],[t,-n],[t,n],[-t,n]]),[_0([[-(t-r),-(n-r)],[t-r,-(n-r)],[t-r,n-r],[-(t-r),n-r]])])}function j0(e){return l0(v0(e.radius),[v0(e.radius-e.wallThickness)])}function M0(e){return l0(b1(e[0]??[0,0],e.slice(1).map(e=>g1(e))))}function N0(e,t){return l0(b1(e[0]??[0,0],e.slice(1).map(e=>g1(e))),t.map(e=>b1(e[0]??[0,0],e.slice(1).map(e=>g1(e)))))}function P0(e,t){let n=f1(e.x,t.env,`Box.x`);if(!n.ok)return n;let r=f1(e.y,t.env,`Box.y`);if(!r.ok)return r;let i=f1(e.z,t.env,`Box.z`);return i.ok?R(hj(n.value,r.value,i.value)):i}function F0(e,t){let n=f1(e.radius,t.env,`Sphere.radius`);return n.ok?R(_j(n.value)):n}function I0(e,t){let n=f1(e.radius,t.env,`Cylinder.radius`);if(!n.ok)return n;let r=f1(e.height,t.env,`Cylinder.height`);return r.ok?R(gj(n.value,r.value)):r}function L0(e,t){let n=f1(e.radius1,t.env,`Cone.radius1`);if(!n.ok)return n;let r=f1(e.radius2,t.env,`Cone.radius2`);if(!r.ok)return r;let i=f1(e.height,t.env,`Cone.height`);return i.ok?R(vj(n.value,r.value,i.value)):i}function R0(e,t){let n=f1(e.majorRadius,t.env,`Torus.majorRadius`);if(!n.ok)return n;let r=f1(e.minorRadius,t.env,`Torus.minorRadius`);return r.ok?R(yj(n.value,r.value)):r}function z0(e,t){let n=[];for(let r of e.points){let e=p1(r,t.env,`Polygon.point`);if(!e.ok)return e;n.push(e.value)}return Fj(n)}function B0(e,t){let n=f1(e.radius,t.env,`Circle.radius`);return n.ok?R(Sj(n.value)):n}function V0(e,t){let n=p1(e.from,t.env,`Line.from`);if(!n.ok)return n;let r=p1(e.to,t.env,`Line.to`);return r.ok?R(xj(n.value,r.value)):r}function H0(e,t){let n=p1(e.point,t.env,`Vertex.point`);return n.ok?R(Ij(n.value)):n}function U0(e){return z(vD(H.NULL_SHAPE_INPUT,`${e}: empty result has no kernel representation`))}function W0(e,t,n){let r=e.evalNode(t);return r.ok?FE(r.value)?R(r.value):z(hD(H.CSG_NOT_3D,`${n}: operand did not produce a 3D shape`)):r}function G0(e,t){return{unsafe:!0,fuzzyValue:e.tolerance??t.tolerance}}function K0(e,t){if(e.a.kind===`Empty`)return t.evalNode(e.b);if(e.b.kind===`Empty`)return t.evalNode(e.a);let n=W0(t,e.a,`Fuse.a`);if(!n.ok)return n;let r=W0(t,e.b,`Fuse.b`);return r.ok?DA(n.value,r.value,G0(e,t)):r}function q0(e,t){if(e.a.kind===`Empty`)return U0(`Cut`);if(e.b.kind===`Empty`)return t.evalNode(e.a);let n=W0(t,e.a,`Cut.a`);if(!n.ok)return n;let r=W0(t,e.b,`Cut.b`);return r.ok?OA(n.value,r.value,G0(e,t)):r}function J0(e,t){if(e.a.kind===`Empty`||e.b.kind===`Empty`)return U0(`Intersect`);let n=W0(t,e.a,`Intersect.a`);if(!n.ok)return n;let r=W0(t,e.b,`Intersect.b`);return r.ok?kA(n.value,r.value,G0(e,t)):r}function Y0(e,t,n){let r=[];for(let i of t){let t=W0(e,i,n);if(!t.ok)return t;r.push(t.value)}return R(r)}function X0(e,t){let n=e.shapes.filter(e=>e.kind!==`Empty`);if(n.length===0)return U0(`FuseAll`);if(n.length===1&&n[0])return t.evalNode(n[0]);let r=Y0(t,n,`FuseAll.operand`);return r.ok?jA(r.value,G0(e,t)):r}function Z0(e,t){if(e.base.kind===`Empty`)return U0(`CutAll`);let n=e.tools.filter(e=>e.kind!==`Empty`);if(n.length===0)return t.evalNode(e.base);let r=W0(t,e.base,`CutAll.base`);if(!r.ok)return r;let i=Y0(t,n,`CutAll.tool`);return i.ok?MA(r.value,i.value,G0(e,t)):i}function Q0(e){return z(vD(H.NULL_SHAPE_INPUT,`${e}: cannot transform an Empty node`))}function $0(e,t,n,r){return e?p1(e,t,n):R(r)}function e2(e,t){let n=F(),{handle:r,dispose:i}=n.composeTransform(t),a;try{a=LE(n.locate(e.wrapped,r))}finally{i()}return bA(e)&&wA(e,a),a}function t2(e,t){if(e.target.kind===`Empty`)return Q0(`Translate`);let n=p1(e.vector,t.env,`Translate.vector`);if(!n.ok)return n;let r=t.evalNode(e.target);return r.ok?R(e2(r.value,[{type:`translate`,x:n.value[0],y:n.value[1],z:n.value[2]}])):r}function n2(e,t){if(e.target.kind===`Empty`)return Q0(`Rotate`);let n=f1(e.angle,t.env,`Rotate.angle`);if(!n.ok)return n;let r=$0(e.axis,t.env,`Rotate.axis`,[0,0,1]);if(!r.ok)return r;let i=$0(e.at,t.env,`Rotate.at`,[0,0,0]);if(!i.ok)return i;let a=t.evalNode(e.target);return a.ok?R(e2(a.value,[{type:`rotate`,angle:n.value,axis:r.value,center:i.value}])):a}function r2(e,t){if(e.target.kind===`Empty`)return Q0(`Scale`);let n=f1(e.factor,t.env,`Scale.factor`);if(!n.ok)return n;let r=$0(e.center,t.env,`Scale.center`,[0,0,0]);if(!r.ok)return r;let i=t.evalNode(e.target);return i.ok?R(oj(i.value,n.value,r.value)):i}function i2(e,t){if(e.target.kind===`Empty`)return Q0(`Mirror`);let n=$0(e.normal,t.env,`Mirror.normal`,[1,0,0]);if(!n.ok)return n;let r=$0(e.at,t.env,`Mirror.at`,[0,0,0]);if(!r.ok)return r;let i=t.evalNode(e.target);return i.ok?R(aj(i.value,n.value,r.value)):i}function a2(e,t){let n=e.children.filter(e=>e.kind!==`Empty`);if(n.length===0)return z(vD(H.NULL_SHAPE_INPUT,`Compound: cannot materialize a compound with zero non-empty children`));let r=[];for(let e of n){let n=t.evalNode(e);if(!n.ok)return n;r.push(n.value)}return R(Lj(r))}function o2(){return z(vD(H.NULL_SHAPE_INPUT,`Empty: cannot materialize an Empty node directly — only valid as boolean/transform operand`))}function s2(e){return[[1,0,0,e[0]],[0,1,0,e[1]],[0,0,1,e[2]],[0,0,0,1]]}function c2(e){let t=e[0];return t!==void 0&&typeof t[0]==`number`}function l2(e,t,n){return{__instanced:!0,source:e,placements:t,grid:n,[Symbol.dispose](){e[Symbol.dispose]()}}}function u2(e){return typeof e==`object`&&!!e&&e.__instanced===!0}function d2(e,t){return l2(e,c2(t)?t.map(s2):t.map(e=>e.map(e=>[...e])))}function f2(e,t){let{cols:n,rows:r,pitchX:i,pitchY:a}=t;if(!Number.isInteger(n)||!Number.isInteger(r)||n<1||r<1)throw RangeError(`instanceGrid: cols and rows must be positive integers, got ${n}x${r}`);let o=[];for(let e=0;e<n;e++)for(let t=0;t<r;t++)o.push(s2([e*i,t*a,0]));return l2(e,o,{cols:n,rows:r,pitchX:i,pitchY:a})}function p2(e){return e.placements.length}function m2(e,t={}){let{source:n,placements:r,grid:i}=e;return r.length===0?z(W(`INSTANCE_EMPTY`,`materialize: instance has no placements`)):t.fuse?FE(n)?i?UF(n,[1,0,0],[0,1,0],i.cols,i.rows,i.pitchX,i.pitchY):h2(n,r,!0):z(W(`MATERIALIZE_NOT_3D`,`materialize({fuse:true}) requires a 3D source shape`)):h2(n,r,!1)}function h2(e,t,n){let r=[];for(let n of t){let t=dj(e,n);if(!t.ok){for(let e of r)e[Symbol.dispose]();return t}r.push(t.value)}let i=n?jA(r,{unsafe:!0}):R(tj(r));for(let e of r)(!i.ok||e!==i.value)&&e[Symbol.dispose]();return i}function g2(e,t){return{geometry:bM(e.source,t),instances:e.placements}}function _2(e,t){let n=t.evalNode(e.source);return n.ok?m2(d2(n.value,e.placements),{fuse:e.fuse}):n}function v2(e,t,n){let r=e.evalNode(t);if(!r.ok)return r;if(!jE(r.value))return z(hD(`CSG_NOT_FACE`,`${n}: node did not produce a Face`));let i=mO(r.value);return i.ok?_O(i.value)?R(i.value):z(hD(`CSG_NOT_FACE`,`${n}: face is not planar`)):z(hD(`CSG_NOT_FACE`,`${n}: ${i.error}`))}function y2(e,t){let n=p1(e.vector,t.env,`Extrude.vector`);if(!n.ok)return n;let r=v2(t,e.profile,`Extrude.profile`);return r.ok?Vq(r.value,n.value):r}function b2(e,t){let n=f1(e.angle,t.env,`Revolve.angle`);if(!n.ok)return n;if(!Number.isFinite(n.value)||n.value<=0)return z(W(`CSG_REVOLVE_ANGLE`,`Revolve.angle must be positive (degrees), got ${n.value}`));let r=Math.min(n.value,360),i=e.axis?p1(e.axis,t.env,`Revolve.axis`):R([0,0,1]);if(!i.ok)return i;let a=e.at?p1(e.at,t.env,`Revolve.at`):R([0,0,0]);if(!a.ok)return a;let o=v2(t,e.profile,`Revolve.profile`);return o.ok?Hq(o.value,a.value,i.value,r*Math.PI/180):o}function x2(e,t){try{var n=WT();if(e.sections.length<2)return z(W(`CSG_LOFT_SECTIONS`,`Loft requires at least 2 sections, got ${e.sections.length}`));let r=n.u(new iE),i=[];for(let[n,a]of e.sections.entries()){let e=v2(t,a,`Loft.sections[${n}]`);if(!e.ok)return e;let o=yk(e.value);r.register(o),i.push(o)}return qN(i,{ruled:e.ruled})}catch(e){n.e=e}finally{n.d()}}var S2=1e-9;function C2(e){return[e[0],e[1],0]}function w2(e){return z(W(`CSG_PATH_SEGMENT`,`contour segment: ${e}`))}function T2(e,t,n,r,i){let[a,o]=e,[s,c]=t,l=s-a,u=c-o,d=Math.hypot(l,u);if(d<S2)return w2(`Arc: coincident endpoints`);if(d>2*n+1e-6)return w2(`Arc: radius ${n} too small for chord ${d}`);let f=Math.sqrt(Math.max(0,n*n-d/2*(d/2))),p=l/d,m=u/d,h=i===r?1:-1,g=(a+s)/2+h*f*-m,_=(o+c)/2+h*f*p,v=Math.atan2(o-_,a-g),y=Math.atan2(c-_,s-g);if(i)for(;y>=v-S2;)y-=2*Math.PI;else for(;y<=v+S2;)y+=2*Math.PI;let b=(v+y)/2;return R([g+n*Math.cos(b),_+n*Math.sin(b)])}function E2(e,t,n,r,i,a){let o=!a,[s,c]=n;if(s<=0||c<=0)return w2(`EllipseArc: non-positive radius`);let l=Math.cos(r),u=Math.sin(r),d=(e[0]-t[0])/2,f=(e[1]-t[1])/2,p=l*d+u*f,m=-u*d+l*f,h=p*p/(s*s)+m*m/(c*c);if(h>1){let e=Math.sqrt(h);s*=e,c*=e}let g=s*s*c*c-s*s*m*m-c*c*p*p,_=s*s*m*m+c*c*p*p;if(_<S2)return w2(`EllipseArc: coincident endpoints`);let v=(i===o?-1:1)*Math.sqrt(Math.max(0,g/_)),y=v*(s*m/c),b=v*(-(c*p)/s),x=l*y-u*b+(e[0]+t[0])/2,S=u*y+l*b+(e[1]+t[1])/2,C=Math.atan2((m-b)/c,(p-y)/s),w=Math.atan2((-m-b)/c,(-p-y)/s)-C;!o&&w>0&&(w-=2*Math.PI),o&&w<0&&(w+=2*Math.PI);let ee=w>=0?C:C+w,te=w>=0?C+w:C;return R({center:[x,S],theta1:ee,theta2:te,rx:s,ry:c})}function D2(e,t,n){if(t.kind!==`EllipseArc`)return w2(`internal: not an ellipse segment`);let r=m1(t.to,n.env,`Path.EllipseArc.to`);if(!r.ok)return r;let i=m1(t.radii,n.env,`Path.EllipseArc.radii`);if(!i.ok)return i;let a=f1(t.rotation,n.env,`Path.EllipseArc.rotation`);if(!a.ok)return a;let o=a.value*Math.PI/180,s=E2(e,r.value,i.value,o,t.largeArc,t.clockwise);if(!s.ok)return s;let{center:c,theta1:l,theta2:u,rx:d,ry:f}=s.value,p,m;if(d>=f?(p=Bk(d,f,l,u,C2(c),[0,0,1]),m=o):(p=Bk(f,d,l-Math.PI/2,u-Math.PI/2,C2(c),[0,0,1]),m=o+Math.PI/2),!p.ok)return p;let h=p.value;if(Math.abs(m)>S2)try{var g=WT();let e=O2(g.u(h),m*180/Math.PI,c);if(!e.ok)return e;h=e.value}catch(e){g.e=e}finally{g.d()}if(t.clockwise)try{var _=WT();h=oM(_.u(h))}catch(e){_.e=e}finally{_.d()}return R(h)}function O2(e,t,n){let r=F(),{handle:i,dispose:a}=r.composeTransform([{type:`rotate`,angle:t,axis:[0,0,1],center:[n[0],n[1],0]}]);try{return R(LE(r.locate(e.wrapped,i)))}catch(e){return z(U(`CSG_PATH_ELLIPSE_ROTATE`,`Path: kernel cannot relocate ellipse-arc edges`,e,{operation:`evalPath`}))}finally{a()}}function k2(e,t){return m1(e.to,t.env,`Path.${e.kind}.to`)}function A2(e,t,n){switch(t.kind){case`Line`:{let r=k2(t,n);return r.ok?Math.hypot(r.value[0]-e[0],r.value[1]-e[1])<S2?w2(`Line: zero length`):R(Fk(C2(e),C2(r.value))):r}case`Arc`:{let r=k2(t,n);if(!r.ok)return r;let i=f1(t.radius,n.env,`Path.Arc.radius`);if(!i.ok)return i;let a=T2(e,r.value,i.value,t.largeArc,t.clockwise);return a.ok?R(zk(C2(e),C2(a.value),C2(r.value))):a}case`Bezier`:{let r=k2(t,n);if(!r.ok)return r;let i=[];for(let e of t.controls){let t=m1(e,n.env,`Path.Bezier.control`);if(!t.ok)return t;i.push(C2(t.value))}return Uk([C2(e),...i,C2(r.value)])}case`EllipseArc`:return D2(e,t,n)}}function j2(e,t,n,r,i,a){if(t.length===0)return z(W(`CSG_PATH_SEGMENT`,`${a}: at least one segment required`));let o=m1(e,n.env,`${a}.start`);if(!o.ok)return o;let s=[],c=o.value;for(let e of t){let t=A2(c,e,n);if(!t.ok)return t;r.register(t.value),s.push(t.value);let i=k2(e,n);if(!i.ok)return i;c=i.value}if(i&&Math.hypot(c[0]-o.value[0],c[1]-o.value[1])>S2){let e=Fk(C2(c),C2(o.value));r.register(e),s.push(e)}return Gk(s)}function M2(e,t){try{var n=WT();let r=n.u(new iE);return j2(e.start,e.segments,t,r,!1,`Path`)}catch(e){n.e=e}finally{n.d()}}function N2(e,t){try{var n=WT();let r=v2(t,e.profile,`Sweep.profile`);if(!r.ok)return r;let i=t.evalNode(e.spine);if(!i.ok)return i;let a=n.u(new iE),o;if(AE(i.value))o=i.value;else if(kE(i.value)){let e=Gk([i.value]);if(!e.ok)return e;a.register(e.value),o=e.value}else return z(hD(`CSG_SWEEP_SPINE`,`Sweep.spine: node did not produce a Wire or Edge`));let s=yk(r.value);a.register(s);let c=zN(s,o,{frenet:e.frenet});if(!c.ok)return c;if(Array.isArray(c.value)){for(let e of c.value)e[Symbol.dispose]();return z(hD(`CSG_SWEEP_SPINE`,`Sweep: unexpected shell-mode result`))}return R(c.value)}catch(e){n.e=e}finally{n.d()}}function P2(e,t){let n=pO(e);return n.ok?vO(n.value)?R(n.value):z(W(`CSG_PROFILE_CONTOUR`,`${t}: contour is not planar`)):z(W(`CSG_PROFILE_CONTOUR`,`${t}: ${n.error}`))}function F2(e,t){try{var n=WT();let r=n.u(new iE),i=(e,n)=>{let i=j2(e.start,e.segments,t,r,!0,n);return i.ok?(r.register(i.value),P2(i.value,n)):i},a=i(e.outline,`Profile.outline`);if(!a.ok)return a;let o=[];for(let[t,n]of e.holes.entries()){let e=i(n,`Profile.holes[${t}]`);if(!e.ok)return e;o.push(e.value)}return Mj(a.value,o.length>0?o:void 0)}catch(e){n.e=e}finally{n.d()}}function I2(e,t){let n=t.evalNode(e.target);if(!n.ok)return n;let r=F(),{handle:i,dispose:a}=r.composeTransform([{type:`translate`,x:0,y:0,z:0}]),o;try{o=I(r.locate(n.value.wrapped,i))}finally{a()}return bA(n.value)&&wA(n.value,o),R(hA(o,[...e.color]))}function L2(e,t){let n=f1(e.radius,t.env,`Fillet.radius`);if(!n.ok)return n;if(!Number.isFinite(n.value)||n.value<=0)return z(W(`CSG_FILLET_RADIUS`,`Fillet.radius must be positive, got ${n.value}`));let r=t.evalNode(e.target);if(!r.ok)return r;if(!NE(r.value))return z(W(`CSG_FILLET_TARGET`,`Fillet.target did not produce a Solid`));let i=gO(r.value);if(!i.ok)return z(W(`CSG_FILLET_TARGET`,i.error));let a=OF(e.ref,r.value);return a.ok?kE(a.entity)?qM(i.value,[a.entity],n.value):z(W(`CSG_FILLET_REF`,`Fillet.ref resolved to a non-edge`)):z(W(`CSG_FILLET_REF`,`Fillet.ref did not resolve: ${a.reason}`))}function R2(e,t){let n=f1(e.distance,t.env,`Chamfer.distance`);if(!n.ok)return n;if(!Number.isFinite(n.value)||n.value<=0)return z(W(`CSG_CHAMFER_DISTANCE`,`Chamfer.distance must be positive, got ${n.value}`));let r=t.evalNode(e.target);if(!r.ok)return r;if(!NE(r.value))return z(W(`CSG_CHAMFER_TARGET`,`Chamfer.target did not produce a Solid`));let i=gO(r.value);if(!i.ok)return z(W(`CSG_CHAMFER_TARGET`,i.error));let a=OF(e.ref,r.value);return a.ok?kE(a.entity)?JM(i.value,[a.entity],n.value):z(W(`CSG_CHAMFER_REF`,`Chamfer.ref resolved to a non-edge`)):z(W(`CSG_CHAMFER_REF`,`Chamfer.ref did not resolve: ${a.reason}`))}function z2(e,t){switch(e.kind){case`Box`:return P0(e,t);case`Sphere`:return F0(e,t);case`Cylinder`:return I0(e,t);case`Cone`:return L0(e,t);case`Torus`:return R0(e,t);case`Polygon`:return z0(e,t);case`Circle`:return B0(e,t);case`Line`:return V0(e,t);case`Vertex`:return H0(e,t);case`Empty`:return o2();case`Fuse`:return K0(e,t);case`Cut`:return q0(e,t);case`Intersect`:return J0(e,t);case`FuseAll`:return X0(e,t);case`CutAll`:return Z0(e,t);case`Translate`:return t2(e,t);case`Rotate`:return n2(e,t);case`Scale`:return r2(e,t);case`Mirror`:return i2(e,t);case`Compound`:return a2(e,t);case`Instance`:return _2(e,t);case`Extrude`:case`Revolve`:case`Loft`:case`Path`:case`Sweep`:case`Profile`:case`Color`:case`Fillet`:case`Chamfer`:return B2(e,t)}}function B2(e,t){switch(e.kind){case`Extrude`:return y2(e,t);case`Revolve`:return b2(e,t);case`Loft`:return x2(e,t);case`Path`:return M2(e,t);case`Sweep`:return N2(e,t);case`Profile`:return F2(e,t);case`Color`:return I2(e,t);case`Fillet`:return L2(e,t);case`Chamfer`:return R2(e,t)}}function V2(e,t){if(typeof t==`number`)return I$(z$(e,!1),t);let n=z$(e,!0);n=R$(n,t.length);for(let e of t)n=I$(n,e);return n}function H2(e,t){if(t.size===0)return O$();let n=h1(e,t),r=Object.keys(n).sort(),i=O$();for(let e of r){i=M$(i,e);let t=n[e];t!==void 0&&(i=V2(i,t))}return i}function U2(e,t,n,r){let i=H2(t,e.freeParams),a=r===void 0?`d`:I$(O$(),r).toString(16);return`${B$(e.structuralHash)}:${n}:${B$(i)}:${a}`}var W2=[1,0,0,0];function G2(e,t){let n=f1(e.angle,t,`evaluateMesh.peelRigid`);if(!n.ok)return null;let r=e.axis?p1(e.axis,t,`evaluateMesh.peelRigid`):R([0,0,1]);if(!r.ok)return null;let i=e.at?p1(e.at,t,`evaluateMesh.peelRigid`):R([0,0,0]);return i.ok?{angle:n.value,axis:r.value,center:i.value}:null}function K2(e,t){let n=e,r=W2,i=[0,0,0];for(;;)if(n.kind===`Translate`){let e=p1(n.vector,t,`evaluateMesh.peelRigid`);if(!e.ok)break;let a=LF(r,e.value);i=[i[0]+a[0],i[1]+a[1],i[2]+a[2]],n=n.target}else if(n.kind===`Rotate`){let e=G2(n,t);if(!e)break;let a=RF(e.axis,e.angle*Math.PI/180),o=BF(r,a),s=LF(r,e.center),c=LF(o,e.center);i=[i[0]+s[0]-c[0],i[1]+s[1]-c[1],i[2]+s[2]-c[2]],r=o,n=n.target}else break;return{inner:n,rot:r,trans:i}}function q2(e){return e[0]===1&&e[1]===0&&e[2]===0&&e[3]===0}function J2(e,t,n,r,i,a,o,s,c){for(let l=0;l<t.length;l+=3){let u=t[l]??0,d=t[l+1]??0,f=t[l+2]??0,p=2*(i*f-a*d),m=2*(a*u-r*f),h=2*(r*d-i*u);e[l]=u+n*p+(i*h-a*m)+o,e[l+1]=d+n*m+(a*p-r*h)+s,e[l+2]=f+n*h+(r*m-i*p)+c}}function Y2(e,t,n){let[r,i,a]=n,o=q2(t);if(o&&r===0&&i===0&&a===0)return e;let s=e.vertices,c=new Float32Array(s.length);if(o){for(let e=0;e<s.length;e+=3)c[e]=(s[e]??0)+r,c[e+1]=(s[e+1]??0)+i,c[e+2]=(s[e+2]??0)+a;return{...e,vertices:c}}let[l,u,d,f]=t;J2(c,s,l,u,d,f,r,i,a);let p=e.normals,m=new Float32Array(p.length);return J2(m,p,l,u,d,f,0,0,0),{...e,vertices:c,normals:m}}function X2(e,t,n){let r=new Map,i=Math.min(t.length,n.length);for(let e=0;e<i;e++){let i=t[e],a=n[e];i!==void 0&&a!==void 0&&r.set(i,a)}return e.map(e=>({...e,faceId:r.get(e.faceId)??e.faceId}))}var Z2=class{cache=new Map;refCounts=new Map;evaluating=!1;pendingKeys=[];kernelId;defaultTolerance;maxCacheEntries;maxMeshCacheEntries;meshCache=new Map;onStep;hits=0;misses=0;evictions=0;constructor(e={}){this.kernelId=e.kernel??NT()??`unregistered`,this.defaultTolerance=e.tolerance,e.onStep&&(this.onStep=e.onStep);let t=e.maxCacheEntries;if(t!==void 0&&(!Number.isInteger(t)||t<1))throw RangeError(`Evaluator: maxCacheEntries must be a positive integer, got ${String(t)}`);this.maxCacheEntries=t;let n=e.maxMeshCacheEntries;if(n!==void 0&&(!Number.isInteger(n)||n<1))throw RangeError(`Evaluator: maxMeshCacheEntries must be a positive integer, got ${String(n)}`);this.maxMeshCacheEntries=n}evaluate(e,t={}){if(this.maxCacheEntries!==void 0&&this.evaluating)throw Error(`Evaluator.evaluate() is not reentrant when maxCacheEntries is set — do not call it from an onStep callback.`);return PT(this.kernelId,()=>{this.evaluating=!0;let n=!1;try{let r=this.evaluateInner(e,t);return this.maxCacheEntries!==void 0&&r.ok&&this.trimCache(this.maxCacheEntries),n=r.ok,r}finally{!n&&this.maxCacheEntries!==void 0&&this.rollbackPending(),this.pendingKeys.length=0,this.evaluating=!1}})}evaluateMesh(e,t={},n={}){n.signal?.throwIfAborted();let r=n.cache??!0,i=ho(),a=n.tolerance??i.tolerance,o=n.angularTolerance??i.angularTolerance,s=`${U2(e,t,this.kernelId,this.defaultTolerance)}|${uM(a,o,n.skipNormals??!1,n.includeUVs??!1)}`;if(r){let r=this.meshCache.get(s);if(r!==void 0)return this.maxMeshCacheEntries!==void 0&&(this.meshCache.delete(s),this.meshCache.set(s,r)),R(r);let{inner:i,rot:a,trans:o}=K2(e,t);if(i!==e){let r=this.evaluateMesh(i,t,n);if(!r.ok)return r;let c=this.evaluate(i,t);if(!c.ok)return c;let l=WD(c.value).map(Wj),u=this.evaluate(e,t);if(!u.ok)return u;let d=WD(u.value).map(Wj),f=Y2(r.value,a,o),p=X2(f.faceGroups,l,d),m=new Set(d);if(p.every(e=>m.has(e.faceId))){let e={...f,faceGroups:p};return this.meshCache.set(s,e),this.maxMeshCacheEntries!==void 0&&this.trimMeshCache(this.maxMeshCacheEntries),R(e)}}}let c=this.evaluate(e,t);if(!c.ok)return c;let l=PT(this.kernelId,()=>bM(c.value,n));return r&&(this.meshCache.set(s,l),this.maxMeshCacheEntries!==void 0&&this.trimMeshCache(this.maxMeshCacheEntries)),R(l)}evaluateInner(e,t){let n=U2(e,t,this.kernelId,this.defaultTolerance),r=this.cache.get(n);if(r!==void 0)return this.hits++,this.maxCacheEntries!==void 0&&(this.cache.delete(n),this.cache.set(n,r)),this.onStep?.({node:e,cacheKey:n,cacheHit:!0}),R(r);this.misses++;let i=z2(e,{env:t,tolerance:this.defaultTolerance,evalNode:e=>this.evaluateInner(e,t)});if(!i.ok)return i;let a=i.value;return this.refCounts.set(a,(this.refCounts.get(a)??0)+1),this.cache.set(n,a),this.maxCacheEntries!==void 0&&this.pendingKeys.push(n),this.onStep?.({node:e,cacheKey:n,cacheHit:!1}),i}releaseShape(e){let t=(this.refCounts.get(e)??1)-1;t<=0?(this.refCounts.delete(e),e[Symbol.dispose]()):this.refCounts.set(e,t)}trimCache(e){for(;this.cache.size>e;){let e=this.cache.keys().next();if(e.done)break;let t=e.value,n=this.cache.get(t);this.cache.delete(t),this.evictions++,n!==void 0&&this.releaseShape(n)}}trimMeshCache(e){for(;this.meshCache.size>e;){let e=this.meshCache.keys().next();if(e.done)break;this.meshCache.delete(e.value)}}rollbackPending(){for(let e of this.pendingKeys){let t=this.cache.get(e);t!==void 0&&(this.cache.delete(e),this.releaseShape(t))}}cacheStats(){return{hits:this.hits,misses:this.misses,entries:this.cache.size,evictions:this.evictions}}resetStats(){this.hits=0,this.misses=0,this.evictions=0}[Symbol.dispose](){for(let e of this.refCounts.keys())e[Symbol.dispose]();this.refCounts.clear(),this.cache.clear(),this.meshCache.clear()}};function Q2(e,t){try{var n=WT();let r=t(n.u(new Z2(e)));if(r instanceof Promise)throw Error(`withEvaluator() callback returned a Promise. Async code must construct an Evaluator directly and dispose it manually — borrowed shapes would otherwise be freed before the Promise resolves.`);return r}catch(e){n.e=e}finally{n.d()}}var $2=1;function e4(e){return{csgVersion:6,root:l4(e)}}function t4(e){switch(e.kind){case`NumLit`:return{kind:`NumLit`,value:e.value};case`Vec3Lit`:return{kind:`Vec3Lit`,value:[e.value[0],e.value[1],e.value[2]]};case`Vec2Lit`:return{kind:`Vec2Lit`,value:[e.value[0],e.value[1]]};case`Param`:return{kind:`Param`,name:e.name};case`BinOp`:return{kind:`BinOp`,op:e.op,a:t4(e.a),b:t4(e.b)};case`UnaryOp`:return{kind:`UnaryOp`,op:e.op,arg:t4(e.arg)};case`Component`:return{kind:`Component`,vec:t4(e.vec),index:e.index};case`BuildVec`:return{kind:`BuildVec`,dim:e.dim,components:e.components.map(t4)}}}function n4(e){switch(e.kind){case`Box`:return{kind:`Box`,x:t4(e.x),y:t4(e.y),z:t4(e.z)};case`Sphere`:return{kind:`Sphere`,radius:t4(e.radius)};case`Cylinder`:return{kind:`Cylinder`,radius:t4(e.radius),height:t4(e.height)};case`Cone`:return{kind:`Cone`,radius1:t4(e.radius1),radius2:t4(e.radius2),height:t4(e.height)};case`Torus`:return{kind:`Torus`,majorRadius:t4(e.majorRadius),minorRadius:t4(e.minorRadius)};case`Polygon`:return{kind:`Polygon`,points:e.points.map(t4)};case`Circle`:return{kind:`Circle`,radius:t4(e.radius)};case`Line`:return{kind:`Line`,from:t4(e.from),to:t4(e.to)};case`Vertex`:return{kind:`Vertex`,point:t4(e.point)};case`Empty`:return{kind:`Empty`,output:e.output};default:return}}function r4(e){switch(e.kind){case`Fuse`:case`Cut`:case`Intersect`:return{kind:e.kind,a:l4(e.a),b:l4(e.b),tolerance:e.tolerance};case`FuseAll`:return{kind:`FuseAll`,shapes:e.shapes.map(l4),tolerance:e.tolerance};case`CutAll`:return{kind:`CutAll`,base:l4(e.base),tools:e.tools.map(l4),tolerance:e.tolerance};default:return}}function i4(e){return e?t4(e):void 0}function a4(e){switch(e.kind){case`Line`:return{kind:`Line`,to:t4(e.to)};case`Arc`:return{kind:`Arc`,to:t4(e.to),radius:t4(e.radius),largeArc:e.largeArc,clockwise:e.clockwise};case`Bezier`:return{kind:`Bezier`,controls:e.controls.map(t4),to:t4(e.to)};case`EllipseArc`:return{kind:`EllipseArc`,to:t4(e.to),radii:t4(e.radii),rotation:t4(e.rotation),largeArc:e.largeArc,clockwise:e.clockwise}}}function o4(e){return{origin:e.origin,faceRoles:[...e.faceRoles],hint:{entityType:`edge`,length:e.hint.length,midpoint:e.hint.midpoint?[...e.hint.midpoint]:void 0}}}function s4(e){return{start:t4(e.start),segments:e.segments.map(a4)}}function c4(e){switch(e.kind){case`Translate`:return{kind:`Translate`,target:l4(e.target),vector:t4(e.vector)};case`Rotate`:return{kind:`Rotate`,target:l4(e.target),angle:t4(e.angle),axis:i4(e.axis),at:i4(e.at)};case`Scale`:return{kind:`Scale`,target:l4(e.target),factor:t4(e.factor),center:i4(e.center)};case`Mirror`:return{kind:`Mirror`,target:l4(e.target),normal:i4(e.normal),at:i4(e.at)};default:return}}function l4(e){return e.kind===`Extrude`?{kind:`Extrude`,profile:l4(e.profile),vector:t4(e.vector)}:e.kind===`Revolve`?{kind:`Revolve`,profile:l4(e.profile),angle:t4(e.angle),axis:i4(e.axis),at:i4(e.at)}:e.kind===`Loft`?{kind:`Loft`,sections:e.sections.map(l4),ruled:e.ruled}:e.kind===`Path`?{kind:`Path`,start:t4(e.start),segments:e.segments.map(a4)}:e.kind===`Sweep`?{kind:`Sweep`,profile:l4(e.profile),spine:l4(e.spine),frenet:e.frenet}:e.kind===`Profile`?{kind:`Profile`,outline:s4(e.outline),holes:e.holes.map(s4)}:e.kind===`Color`?{kind:`Color`,target:l4(e.target),color:[...e.color]}:e.kind===`Fillet`?{kind:`Fillet`,target:l4(e.target),ref:o4(e.ref),radius:t4(e.radius)}:e.kind===`Chamfer`?{kind:`Chamfer`,target:l4(e.target),ref:o4(e.ref),distance:t4(e.distance)}:e.kind===`Compound`?{kind:`Compound`,children:e.children.map(l4)}:e.kind===`Instance`?{kind:`Instance`,source:l4(e.source),placements:e.placements,fuse:e.fuse}:n4(e)??r4(e)??c4(e)}function u4(e){return z(W(H.NULL_SHAPE_INPUT,`csg.fromJSON: ${e}`))}function d4(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f4(e){return typeof e==`number`&&Number.isFinite(e)}function p4(e){return typeof e==`string`}function m4(e,t){if(!Array.isArray(e)||e.length!==3)return u4(`${t}: expected Vec3 array`);let[n,r,i]=e;return!f4(n)||!f4(r)||!f4(i)?u4(`${t}: Vec3 contains non-number`):R([n,r,i])}function h4(e,t){if(!Array.isArray(e)||e.length!==2)return u4(`${t}: expected Vec2 array`);let[n,r]=e;return!f4(n)||!f4(r)?u4(`${t}: Vec2 contains non-number`):R([n,r])}function g4(e){if(!d4(e))return u4(`input is not an object`);let t=e.csgVersion;if(typeof t!=`number`||!Number.isInteger(t)||t<$2||t>6)return u4(`unsupported csgVersion ${String(t)} (expected ${$2}..6)`);let n=e.root;return w4(n)}function _4(e){if(!d4(e))return u4(`expression: not an object`);let t=e.kind;switch(t){case`NumLit`:return f4(e.value)?R(U$(e.value)):u4(`NumLit.value`);case`Vec3Lit`:{let t=m4(e.value,`Vec3Lit.value`);return t.ok?R(W$(t.value)):t}case`Vec2Lit`:{let t=h4(e.value,`Vec2Lit.value`);return t.ok?R(G$(t.value)):t}case`Param`:return p4(e.name)?R(K$(e.name)):u4(`Param.name`);case`BinOp`:return v4(e);case`UnaryOp`:return y4(e);case`Component`:return b4(e);case`BuildVec`:return x4(e);default:return u4(`unknown expression kind: ${String(t)}`)}}function v4(e){let t=e.op;if(t!==`+`&&t!==`-`&&t!==`*`&&t!==`/`)return u4(`BinOp.op: ${String(t)}`);let n=_4(e.a);if(!n.ok)return n;let r=_4(e.b);return r.ok?R(q$(t,n.value,r.value)):r}function y4(e){let t=e.op;if(!p4(t)||![`neg`,`sin`,`cos`,`sqrt`,`abs`].includes(t))return u4(`UnaryOp.op: ${String(t)}`);let n=_4(e.arg);return n.ok?R(J$(t,n.value)):n}function b4(e){let t=e.index;if(t!==0&&t!==1&&t!==2)return u4(`Component.index: ${String(t)}`);let n=_4(e.vec);return n.ok?R(Y$(n.value,t)):n}function x4(e){let t=e.dim;if(t!==2&&t!==3)return u4(`BuildVec.dim: ${String(t)}`);let n=e.components;if(!Array.isArray(n))return u4(`BuildVec.components: not array`);if(n.length!==t)return u4(`BuildVec.components: expected ${t} components, got ${n.length}`);let r=[];for(let e of n){let t=_4(e);if(!t.ok)return t;r.push(t.value)}return R(X$(t,r))}function S4(e,t){if(!Array.isArray(e))return u4(`${t}: not array`);let n=[];for(let t of e){let e=w4(t);if(!e.ok)return e;n.push(e.value)}return R(n)}function C4(e){let t=e.tolerance;return t==null?R(void 0):f4(t)?R(t):u4(`tolerance: not a finite number`)}function w4(e){if(!d4(e))return u4(`node: not an object`);let t=e.kind;switch(t){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:return E4(t,e);case`Fuse`:case`Cut`:case`Intersect`:return P4(t,e);case`FuseAll`:case`CutAll`:return F4(t,e);case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:return I4(t,e);case`Compound`:return t3(e);case`Instance`:return r3(e);case`Extrude`:return H4(e);case`Revolve`:return U4(e);case`Loft`:return W4(e);case`Path`:return e3(e);case`Sweep`:return $4(e);case`Profile`:return Q4(e);case`Color`:return Z4(e);case`Fillet`:return Y4(e);case`Chamfer`:return X4(e);default:return u4(`unknown node kind: ${String(t)}`)}}function T4(e,t,n){let r=_4(e[t]);return r.ok?R(n(r.value)):r}function E4(e,t){switch(e){case`Box`:return D4(t);case`Sphere`:return T4(t,`radius`,P1);case`Cylinder`:return O4(t);case`Cone`:return k4(t);case`Torus`:return A4(t);case`Polygon`:return j4(t);case`Circle`:return T4(t,`radius`,z1);case`Line`:return M4(t);case`Vertex`:return T4(t,`point`,V1);case`Empty`:return N4(t)}return u4(`unhandled primitive: ${e}`)}function D4(e){let t=_4(e.x);if(!t.ok)return t;let n=_4(e.y);if(!n.ok)return n;let r=_4(e.z);return r.ok?R(N1(t.value,n.value,r.value)):r}function O4(e){let t=_4(e.radius);if(!t.ok)return t;let n=_4(e.height);return n.ok?R(F1(t.value,n.value)):n}function k4(e){let t=_4(e.radius1);if(!t.ok)return t;let n=_4(e.radius2);if(!n.ok)return n;let r=_4(e.height);return r.ok?R(I1(t.value,n.value,r.value)):r}function A4(e){let t=_4(e.majorRadius);if(!t.ok)return t;let n=_4(e.minorRadius);return n.ok?R(L1(t.value,n.value)):n}function j4(e){let t=e.points;if(!Array.isArray(t))return u4(`Polygon.points: not array`);let n=[];for(let e of t){let t=_4(e);if(!t.ok)return t;n.push(t.value)}return R(R1(n))}function M4(e){let t=_4(e.from);if(!t.ok)return t;let n=_4(e.to);return n.ok?R(B1(t.value,n.value)):n}function N4(e){let t=e.output;switch(t){case`Solid`:return R(U1());case`Face`:return R(W1());case`Wire`:return R(G1());default:return u4(`Empty.output: ${String(t)}`)}}function P4(e,t){let n=w4(t.a);if(!n.ok)return n;let r=w4(t.b);if(!r.ok)return r;let i=C4(t);if(!i.ok)return i;switch(e){case`Fuse`:return R(q1(n.value,r.value,i.value));case`Cut`:return R(J1(n.value,r.value,i.value));case`Intersect`:return R(Y1(n.value,r.value,i.value))}}function F4(e,t){let n=C4(t);if(!n.ok)return n;if(e===`FuseAll`){let e=S4(t.shapes,`FuseAll.shapes`);return e.ok?R(X1(e.value,n.value)):e}let r=w4(t.base);if(!r.ok)return r;let i=S4(t.tools,`CutAll.tools`);return i.ok?R(Z1(r.value,i.value,n.value)):i}function I4(e,t){let n=w4(t.target);if(!n.ok)return n;switch(e){case`Translate`:return L4(t,n.value);case`Rotate`:return z4(t,n.value);case`Scale`:return B4(t,n.value);case`Mirror`:return V4(t,n.value)}}function L4(e,t){let n=_4(e.vector);return n.ok?R($1(t,n.value)):n}function R4(e,t){if(e[t]===void 0)return R(void 0);let n=_4(e[t]);return n.ok?R(n.value):n}function z4(e,t){let n=_4(e.angle);if(!n.ok)return n;let r=R4(e,`axis`);if(!r.ok)return r;let i=R4(e,`at`);return i.ok?R(e0(t,n.value,{axis:r.value,at:i.value})):i}function B4(e,t){let n=_4(e.factor);if(!n.ok)return n;let r=R4(e,`center`);return r.ok?R(t0(t,n.value,{center:r.value})):r}function V4(e,t){let n=R4(e,`normal`);if(!n.ok)return n;let r=R4(e,`at`);return r.ok?R(n0(t,{normal:n.value,at:r.value})):r}function H4(e){let t=w4(e.profile);if(!t.ok)return t;let n=_4(e.vector);return n.ok?R(r0(t.value,n.value)):n}function U4(e){let t=w4(e.profile);if(!t.ok)return t;let n=_4(e.angle);if(!n.ok)return n;let r=R4(e,`axis`);if(!r.ok)return r;let i=R4(e,`at`);return i.ok?R(p0(t.value,n.value,{axis:r.value,at:i.value})):i}function W4(e){let t=S4(e.sections,`Loft.sections`);if(!t.ok)return t;let n=e.ruled;return n!==void 0&&typeof n!=`boolean`?u4(`Loft.ruled: not a boolean`):R(f0(t.value,{ruled:n}))}function G4(e,t){let n=e[t];return n===void 0?R(!1):typeof n==`boolean`?R(n):u4(`${t}: not a boolean`)}function K4(e){if(!d4(e))return u4(`segment: not an object`);let t=_4(e.to);if(!t.ok)return t;let n=e.kind;switch(n){case`Line`:return R(g1(t.value));case`Arc`:{let n=_4(e.radius);if(!n.ok)return n;let r=G4(e,`largeArc`);if(!r.ok)return r;let i=G4(e,`clockwise`);return i.ok?R(_1(t.value,n.value,{largeArc:r.value,clockwise:i.value})):i}case`Bezier`:{let n=e.controls;if(!Array.isArray(n))return u4(`Bezier.controls: not array`);let r=[];for(let e of n){let t=_4(e);if(!t.ok)return t;r.push(t.value)}return R(v1(r,t.value))}case`EllipseArc`:{let n=_4(e.radii);if(!n.ok)return n;let r=_4(e.rotation);if(!r.ok)return r;let i=G4(e,`largeArc`);if(!i.ok)return i;let a=G4(e,`clockwise`);return a.ok?R(y1(t.value,n.value,{rotation:r.value,largeArc:i.value,clockwise:a.value})):a}default:return u4(`unknown segment kind: ${String(n)}`)}}function q4(e,t){if(!d4(e))return u4(`${t}: not an object`);let n=_4(e.start);if(!n.ok)return n;let r=e.segments;if(!Array.isArray(r))return u4(`${t}.segments: not array`);let i=[];for(let e of r){let t=K4(e);if(!t.ok)return t;i.push(t.value)}return R(b1(n.value,i))}function J4(e,t){if(!d4(e))return u4(`${t}: not an object`);let n=e.origin;if(!p4(n))return u4(`${t}.origin: not a string`);let r=e.faceRoles;if(!Array.isArray(r)||r.length!==2||!r.every(p4))return u4(`${t}.faceRoles: expected two role strings`);let i=e.hint;if(!d4(i))return u4(`${t}.hint: not an object`);let a=i.length;if(a!==void 0&&!f4(a))return u4(`${t}.hint.length`);let o;if(i.midpoint!==void 0){let e=m4(i.midpoint,`${t}.hint.midpoint`);if(!e.ok)return e;o=e.value}return R({origin:n,faceRoles:[r[0],r[1]],hint:{entityType:`edge`,length:a,midpoint:o}})}function Y4(e){let t=w4(e.target);if(!t.ok)return t;let n=_4(e.radius);if(!n.ok)return n;let r=J4(e.ref,`Fillet.ref`);return r.ok?R(o0(t.value,r.value,n.value)):r}function X4(e){let t=w4(e.target);if(!t.ok)return t;let n=_4(e.distance);if(!n.ok)return n;let r=J4(e.ref,`Chamfer.ref`);return r.ok?R(s0(t.value,r.value,n.value)):r}function Z4(e){let t=w4(e.target);if(!t.ok)return t;let n=e.color;return!Array.isArray(n)||n.length!==4||!n.every(e=>f4(e)&&e>=0&&e<=1)?u4(`Color.color: expected an RGBA array of 4 numbers in [0, 1]`):R(c0(t.value,[n[0],n[1],n[2],n[3]]))}function Q4(e){let t=q4(e.outline,`Profile.outline`);if(!t.ok)return t;let n=e.holes;if(n!==void 0&&!Array.isArray(n))return u4(`Profile.holes: not array`);let r=[];for(let[e,t]of(Array.isArray(n)?n:[]).entries()){let n=q4(t,`Profile.holes[${e}]`);if(!n.ok)return n;r.push(n.value)}return R(l0(t.value,r))}function $4(e){let t=w4(e.profile);if(!t.ok)return t;let n=w4(e.spine);if(!n.ok)return n;let r=G4(e,`frenet`);return r.ok?R(u0(t.value,n.value,{frenet:r.value})):r}function e3(e){let t=_4(e.start);if(!t.ok)return t;let n=e.segments;if(!Array.isArray(n))return u4(`Path.segments: not array`);let r=[];for(let e of n){let t=K4(e);if(!t.ok)return t;r.push(t.value)}return R(d0(t.value,r))}function t3(e){let t=S4(e.children,`Compound.children`);return t.ok?R(m0(t.value)):t}function n3(e){return Array.isArray(e)&&e.length===4&&e.every(e=>Array.isArray(e)&&e.length===4&&e.every(f4))}function r3(e){let t=w4(e.source);if(!t.ok)return t;let n=e.placements;return!Array.isArray(n)||!n.every(n3)?u4(`Instance.placements must be an array of 4x4 number matrices`):R(h0(t.value,n,e.fuse===!0))}function i3(e){return s3(e)}function a3(e){switch(e.kind){case`NumLit`:case`Vec3Lit`:case`Vec2Lit`:case`Param`:return e;case`BinOp`:{let t=a3(e.a),n=a3(e.b);if(t.kind===`NumLit`&&n.kind===`NumLit`)switch(e.op){case`+`:return U$(t.value+n.value);case`-`:return U$(t.value-n.value);case`*`:return U$(t.value*n.value);case`/`:return U$(t.value/n.value)}return t!==e.a||n!==e.b?q$(e.op,t,n):e}case`UnaryOp`:{let t=a3(e.arg);if(t.kind===`NumLit`){let n=t.value;switch(e.op){case`neg`:return U$(-n);case`sin`:return U$(Math.sin(n));case`cos`:return U$(Math.cos(n));case`sqrt`:return U$(Math.sqrt(n));case`abs`:return U$(Math.abs(n))}}return t===e.arg?e:J$(e.op,t)}case`Component`:{let t=a3(e.vec);return t.kind===`Vec3Lit`||t.kind===`Vec2Lit`&&(e.index===0||e.index===1)?U$(t.value[e.index]):t===e.vec?e:Y$(t,e.index)}case`BuildVec`:{let t=e.components.map(a3);return o3(e.dim,t)||(t.some((t,n)=>t!==e.components[n])?X$(e.dim,t):e)}}}function o3(e,t){if(t.length!==e)return;let n=[];for(let e of t){if(e.kind!==`NumLit`)return;n.push(e.value)}return e===2?G$([n[0],n[1]]):W$([n[0],n[1],n[2]])}function s3(e){switch(e.kind){case`Box`:return N1(a3(e.x),a3(e.y),a3(e.z));case`Sphere`:return P1(a3(e.radius));case`Cylinder`:return F1(a3(e.radius),a3(e.height));case`Cone`:return I1(a3(e.radius1),a3(e.radius2),a3(e.height));case`Torus`:return L1(a3(e.majorRadius),a3(e.minorRadius));case`Polygon`:return R1(e.points.map(a3));case`Circle`:return z1(a3(e.radius));case`Line`:return B1(a3(e.from),a3(e.to));case`Vertex`:return V1(a3(e.point));case`Empty`:return e;case`Fuse`:return u3(e.a,e.b,e.tolerance);case`Cut`:return d3(e.a,e.b,e.tolerance);case`Intersect`:return f3(e.a,e.b,e.tolerance);case`FuseAll`:return p3(e.shapes,e.tolerance);case`CutAll`:return m3(e.base,e.tools,e.tolerance);case`Translate`:return h3(e.target,e.vector);case`Rotate`:case`Scale`:case`Mirror`:return l3(e);case`Compound`:return m0(e.children.map(s3).filter(e=>e.kind!==`Empty`));case`Instance`:return h0(s3(e.source),e.placements,e.fuse);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Profile`:case`Path`:case`Color`:case`Fillet`:case`Chamfer`:return c3(e)}}function c3(e){switch(e.kind){case`Extrude`:return r0(s3(e.profile),a3(e.vector));case`Revolve`:return p0(s3(e.profile),a3(e.angle),{axis:e.axis?a3(e.axis):void 0,at:e.at?a3(e.at):void 0});case`Loft`:return f0(e.sections.map(s3),{ruled:e.ruled});case`Sweep`:return u0(s3(e.profile),s3(e.spine),{frenet:e.frenet});case`Profile`:return l0(T1(e.outline,a3),e.holes.map(e=>T1(e,a3)));case`Path`:return d0(a3(e.start),e.segments.map(e=>E1(e,a3)));case`Color`:return c0(s3(e.target),[...e.color]);case`Fillet`:return o0(s3(e.target),e.ref,a3(e.radius));case`Chamfer`:return s0(s3(e.target),e.ref,a3(e.distance))}}function l3(e){switch(e.kind){case`Rotate`:return e0(s3(e.target),a3(e.angle),{axis:e.axis?a3(e.axis):void 0,at:e.at?a3(e.at):void 0});case`Scale`:return t0(s3(e.target),a3(e.factor),{center:e.center?a3(e.center):void 0});case`Mirror`:return n0(s3(e.target),{normal:e.normal?a3(e.normal):void 0,at:e.at?a3(e.at):void 0})}}function u3(e,t,n){let r=s3(e),i=s3(t);return r.kind===`Empty`?i:i.kind===`Empty`?r:q1(r,i,n)}function d3(e,t,n){let r=s3(e),i=s3(t);return i.kind===`Empty`||r.kind===`Empty`?r:J1(r,i,n)}function f3(e,t,n){let r=s3(e),i=s3(t);return r.kind===`Empty`?r:i.kind===`Empty`?i:Y1(r,i,n)}function p3(e,t){let n=e.map(s3).filter(e=>e.kind!==`Empty`);return n.length===0?U1():n.length===1?n[0]:X1(n,t)}function m3(e,t,n){let r=s3(e);if(r.kind===`Empty`)return r;let i=t.map(s3).filter(e=>e.kind!==`Empty`);return i.length===0?r:Z1(r,i,n)}function h3(e,t){let n=s3(e),r=a3(t);if(r.kind!==`Vec3Lit`)return $1(n,r);let[i,a,o]=r.value;if(i===0&&a===0&&o===0)return n;if(n.kind===`Translate`){let e=a3(n.vector);if(e.kind===`Vec3Lit`)return $1(n.target,[e.value[0]+i,e.value[1]+a,e.value[2]+o])}return $1(n,r)}function g3(e,t,n){return _3(e,t,n)}function _3(e,t,n){return t(e)?n:v3(e,t,n)}function v3(e,t,n){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:case`Path`:case`Profile`:return e;case`Fuse`:return q1(_3(e.a,t,n),_3(e.b,t,n),e.tolerance);case`Cut`:return J1(_3(e.a,t,n),_3(e.b,t,n),e.tolerance);case`Intersect`:return Y1(_3(e.a,t,n),_3(e.b,t,n),e.tolerance);case`FuseAll`:return X1(e.shapes.map(e=>_3(e,t,n)),e.tolerance);case`CutAll`:return Z1(_3(e.base,t,n),e.tools.map(e=>_3(e,t,n)),e.tolerance);case`Translate`:return $1(_3(e.target,t,n),e.vector);case`Rotate`:return e0(_3(e.target,t,n),e.angle,{axis:e.axis,at:e.at});case`Scale`:return t0(_3(e.target,t,n),e.factor,{center:e.center});case`Mirror`:return n0(_3(e.target,t,n),{normal:e.normal,at:e.at});case`Compound`:return m0(e.children.map(e=>_3(e,t,n)));case`Instance`:return h0(_3(e.source,t,n),e.placements,e.fuse);case`Extrude`:case`Revolve`:case`Loft`:case`Sweep`:case`Color`:case`Fillet`:case`Chamfer`:return y3(e,t,n)}}function y3(e,t,n){switch(e.kind){case`Extrude`:return r0(_3(e.profile,t,n),e.vector);case`Revolve`:return p0(_3(e.profile,t,n),e.angle,{axis:e.axis,at:e.at});case`Loft`:return f0(e.sections.map(e=>_3(e,t,n)),{ruled:e.ruled});case`Sweep`:return u0(_3(e.profile,t,n),_3(e.spine,t,n),{frenet:e.frenet});case`Color`:return c0(_3(e.target,t,n),[...e.color]);case`Fillet`:return o0(_3(e.target,t,n),e.ref,e.radius);case`Chamfer`:return s0(_3(e.target,t,n),e.ref,e.distance)}}function b3(e,t){t(e);for(let n of x3(e))b3(n,t)}function x3(e){switch(e.kind){case`Box`:case`Sphere`:case`Cylinder`:case`Cone`:case`Torus`:case`Polygon`:case`Circle`:case`Line`:case`Vertex`:case`Empty`:case`Path`:case`Profile`:return[];case`Fuse`:case`Cut`:case`Intersect`:return[e.a,e.b];case`FuseAll`:return e.shapes;case`CutAll`:return[e.base,...e.tools];case`Translate`:case`Rotate`:case`Scale`:case`Mirror`:case`Color`:case`Fillet`:case`Chamfer`:return[e.target];case`Compound`:return e.children;case`Instance`:return[e.source];case`Extrude`:case`Revolve`:return[e.profile];case`Loft`:return e.sections;case`Sweep`:return[e.profile,e.spine]}}function S3(e){let t=0;return b3(e,()=>{t++}),t}var C3=1e-6;function w3(e){return[e[0]??0,e[1]??0]}function T3(e,t){return Math.hypot(e[0]-t[0],e[1]-t[1])<C3}function E3(e){return z(W(`BLUEPRINT_CONTOUR`,`blueprintToContour: ${e}`))}function D3(e){return w3(e.value((e.firstParameter+e.lastParameter)/2))}function O3(e,t,n){let[r,i]=e,[a,o]=t,[s,c]=n,l=2*(r*(o-c)+a*(c-i)+s*(i-o));if(Math.abs(l)<1e-12)return E3(`arc: collinear sample points`);let u=r*r+i*i,d=a*a+o*o,f=s*s+c*c,p=(u*(o-c)+d*(c-i)+f*(i-o))/l,m=(u*(s-a)+d*(r-s)+f*(a-r))/l,h=Math.hypot(r-p,i-m),g=(e,t)=>e[0]*t[1]-e[1]*t[0],_=g([a-r,o-i],[s-a,c-o])<0,v=[s-r,c-i];return R(_1(n,h,{largeArc:g(v,[a-r,o-i])*g(v,[p-r,m-i])>0,clockwise:_}))}function k3(e,t){let n=Math.cos(t),r=Math.sin(t);return[n*e[0]+r*e[1],-r*e[0]+n*e[1]]}function A3(e,t,n,r){let{a:i,b:a}=r,o=r.phi,s=k3(e,o),c=k3(t,o),l=k3(n,o),u=(s[0]-c[0])/2,d=(s[1]-c[1])/2,f=u*u/(i*i)+d*d/(a*a);if(f>1){let e=Math.sqrt(f);i*=e,a*=e}let p=i*i*a*a-i*i*d*d-a*a*u*u,m=i*i*d*d+a*a*u*u;if(m<1e-12)return E3(`ellipse: coincident endpoints`);let h=Math.sqrt(Math.max(0,p/m)),g=(s[0]+c[0])/2,_=(s[1]+c[1])/2,v=[[g+h*i*d/a,_-h*a*u/i],[g-h*i*d/a,_+h*a*u/i]],y=e=>{let t=(l[0]-e[0])/i,n=(l[1]-e[1])/a;return Math.abs(t*t+n*n-1)},b=y(v[0])<=y(v[1])?v[0]:v[1],x=e=>Math.atan2((e[1]-b[1])/a,(e[0]-b[0])/i),S=2*Math.PI,C=x(s),w=((x(l)-C)%S+S)%S,ee=((x(c)-C)%S+S)%S,te=w<ee,ne=te?ee:S-ee;return R(y1(t,[r.a,r.b],{rotation:o*180/Math.PI,largeArc:ne>Math.PI,clockwise:!te}))}function j3(e,t){let n=MT(),r=w3(e.firstPoint);if(e.geomType===`CIRCLE`){let i=n.getCurve2dCircleData(e.wrapped);if(!i)return E3(`circle: kernel returned no circle data`);let a=[2*i.cx-r[0],2*i.cy-r[1]],o=!i.isDirect;return t.push(_1(a,i.radius,{clockwise:o}),_1(r,i.radius,{clockwise:o})),R(r)}let i=n.getCurve2dEllipseData(e.wrapped);if(!i)return E3(`ellipse: kernel returned no ellipse data`);let a=w3(e.boundingBox.center),o=[2*a[0]-r[0],2*a[1]-r[1]],s=!i.isDirect,c=i.xAxisAngle*180/Math.PI,l=[i.majorRadius,i.minorRadius];return t.push(y1(o,l,{rotation:c,clockwise:s}),y1(r,l,{rotation:c,clockwise:s})),R(r)}function M3(e,t,n,r){let i=e.geomType;if(i===`LINE`)return R(g1(n));if(i===`CIRCLE`)return O3(t,D3(e),n);if(i===`BEZIER_CURVE`){let t=MT().getCurve2dBezierPoles(e.wrapped);if(!t)return E3(`bezier: kernel returned no poles`);let i=t.map(w3);r&&i.reverse();let a=i.slice(1,-1);return a.length===0?R(g1(n)):a.length>2?E3(`bezier: unsupported degree ${i.length-1}`):R(v1(a,n))}if(i===`ELLIPSE`){let r=MT().getCurve2dEllipseData(e.wrapped);return r?A3(t,n,D3(e),{a:r.majorRadius,b:r.minorRadius,phi:r.xAxisAngle}):E3(`ellipse: kernel returned no ellipse data`)}return E3(`unsupported curve type: ${i}`)}var N3=new Set([`LINE`,`CIRCLE`,`BEZIER_CURVE`,`ELLIPSE`]);function P3(e,t){let n=t?.tolerance??1e-4,r=e.curves[0];if(!r)return E3(`blueprint has no curves`);let i=w3(r.firstPoint),a=i,o=[];for(let t of e.curves){let e=N3.has(t.geomType)?[t]:tR([t],{tolerance:n,continuity:`C0`,maxSegments:300}),r=e[0]!==t;try{let t=e[0];e.length>1&&t!==void 0&&!T3(w3(t.firstPoint),a)&&!T3(w3(t.lastPoint),a)&&e.reverse();for(let t of e){let e=F3(t,a,o);if(!e.ok)return e;a=e.value}}finally{if(r)for(let t of e)t.delete()}}return R(b1(i,o))}function F3(e,t,n){let r=w3(e.firstPoint),i=w3(e.lastPoint);if(T3(r,i)&&(e.geomType===`CIRCLE`||e.geomType===`ELLIPSE`))return j3(e,n);let a,o;if(T3(r,t))a=i,o=!1;else if(T3(i,t))a=r,o=!0;else return E3(`curve is not chained to the current point (${e.geomType})`);let s=M3(e,t,a,o);return s.ok?(n.push(s.value),R(a)):s}function I3(e){return F().createVector3d(e[0],e[1],e[2])}function L3(e){return F().createPoint3d(e[0],e[1],e[2])}function R3(e){return F().createDirection3d(e[0],e[1],e[2])}function z3(e){return[e.X(),e.Y(),e.Z()]}function B3(e){return[e.X(),e.Y(),e.Z()]}function V3(e){return[e.X(),e.Y(),e.Z()]}function H3(e,t){let n=I3(e);try{return t(n)}finally{n.delete()}}function U3(e,t){let n=L3(e);try{return t(n)}finally{n.delete()}}function W3(e,t){let n=R3(e);try{return t(n)}finally{n.delete()}}var G3=.299,K3=.587,q3=.114;function J3(e,t={}){if(e.length<2)return z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromGrid: need at least 2 rows, got ${e.length}`));let n=e.length,r=e[0]?.length??0;if(r<2)return z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromGrid: need at least 2 columns, got ${r}`));for(let t=0;t<n;t++){let n=e[t];if(!n||n.length!==r)return z(W(H.SURFACE_GRID_JAGGED,`surfaceFromGrid: row ${t} has ${n?.length??0} columns, expected ${r}`))}let{width:i=r-1,depth:a=n-1,scaleZ:o=1}=t,s=i/(r-1),c=a/(n-1);try{return Y3(e,n,r,s,c,o)}catch{}try{return X3(e,n,r,s,c,o)}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.SURFACE_FAILED,`surfaceFromGrid failed: ${t}`,e))}}function Y3(e,t,n,r,i,a){let o=[];for(let s=0;s<t;s++)for(let t=0;t<n;t++){let n=e[s],c=(n?n[t]??0:0)*a;o.push([t*r,s*i,c])}let s=I(F().bsplineSurface(o,t,n));return jE(s)?R(s):(L(s),z(U(H.SURFACE_FAILED,`B-spline surface did not produce a face`)))}function X3(e,t,n,r,i,a){let o=[];for(let s=0;s<t;s++)for(let t=0;t<n;t++){let n=e[s],c=(n?n[t]??0:0)*a;o.push([t*r,s*i,c])}let s=I(F().triangulatedSurface(o,t,n));return jE(s)||ME(s)?R(s):(L(s),z(U(H.SURFACE_FAILED,`surfaceFromGrid: unexpected shape type from sewing`)))}async function Z3(e,t={}){let n=t.channel??`luminance`,r=Math.max(1,Math.round(t.downsample??1));if(typeof createImageBitmap!=`function`)return z(yD(H.SURFACE_FAILED,`surfaceFromImage requires createImageBitmap (not available in this environment)`));let i;try{i=await createImageBitmap(e)}catch(e){return z(yD(H.SURFACE_FAILED,`surfaceFromImage: failed to decode image — ${e instanceof Error?e.message:String(e)}`))}let a=i.width,o=i.height;if(a<2||o<2)return i.close(),z(W(H.SURFACE_GRID_TOO_SMALL,`surfaceFromImage: image too small (${a}x${o}), need at least 2x2`));if(typeof OffscreenCanvas!=`function`)return i.close(),z(yD(H.SURFACE_FAILED,`surfaceFromImage requires OffscreenCanvas (not available in this environment)`));let s=new OffscreenCanvas(a,o).getContext(`2d`);if(!s)return i.close(),z(yD(H.SURFACE_FAILED,`surfaceFromImage: could not get 2D canvas context`));s.drawImage(i,0,0),i.close();let c=s.getImageData(0,0,a,o).data,l=[];for(let e=0;e<o;e+=r){let t=[];for(let i=0;i<a;i+=r){let r=(e*a+i)*4,o=c[r]??0,s=c[r+1]??0,l=c[r+2]??0,u;switch(n){case`r`:u=o/255;break;case`g`:u=s/255;break;case`b`:u=l/255;break;default:u=(G3*o+K3*s+q3*l)/255}t.push(u)}l.push(t)}let u={};return t.width!==void 0&&(u.width=t.width),t.depth!==void 0&&(u.depth=t.depth),t.scaleZ!==void 0&&(u.scaleZ=t.scaleZ),J3(l,u)}function Q3(e,t){return F().isNull(e.wrapped)?z(W(H.NULL_SHAPE_INPUT,`${t} is a null shape`)):R(void 0)}function $3(e,t={}){if(e.length===0)return z(W(H.HULL_EMPTY_INPUT,`hull: at least one shape is required`,void 0,void 0,`Provide one or more shapes to compute a convex hull`));for(let[t,n]of e.entries()){let e=Q3(n,`hull: shapes[${t}]`);if(B(e))return e}let n=t.tolerance??.1;try{let t=F(),r=e.map(e=>e.wrapped),i=I(t.hull(r,n));return NE(i)?R(i):(L(i),z(U(H.HULL_NOT_3D,`Hull result is not a solid; input may be degenerate`)))}catch(e){let t=e instanceof Error?e.message:String(e);return t.includes(`coplanar`)||t.includes(`fewer than`)||t.includes(`degenerate`)?z(U(H.HULL_DEGENERATE,`Hull degenerate: ${t}`,e)):z(U(H.HULL_FAILED,`Hull operation failed: ${t}`,e))}}function e6(e){if(e.length<4)return z(W(H.HULL_EMPTY_INPUT,`convexHull: at least 4 points required, got ${e.length}`,void 0,void 0,`Provide 4 or more non-coplanar 3D points`));try{let t=F(),n=e.map(e=>({x:e[0],y:e[1],z:e[2]})),r=I(t.hullFromPoints(n,.1));return NE(r)?R(r):(L(r),z(U(H.HULL_NOT_3D,`convexHull result is not a solid; points may be coplanar`)))}catch(e){let t=e instanceof Error?e.message:String(e);return t.includes(`coplanar`)||t.includes(`fewer than`)||t.includes(`degenerate`)?z(U(H.HULL_DEGENERATE,`convexHull degenerate: ${t}`,e)):z(U(H.HULL_FAILED,`convexHull failed: ${t}`,e))}}function t6(e){let n=WD(e);if(n.length!==1)return null;let r=t(n,0);if(aO(r)!==`sphere`)return null;let i=F().area(r.wrapped);return Math.sqrt(i/(4*Math.PI))}function n6(e,t,n){try{let r=I(F().offset(e.wrapped,t,n));return FE(r)?R(r):(L(r),z(hD(H.MINKOWSKI_NOT_3D,`Minkowski sphere offset did not produce a 3D shape`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.MINKOWSKI_FAILED,`Minkowski sphere offset failed: ${t}`,e,{operation:`minkowski`,fastPath:`sphere`}))}}function r6(e,t,n){let r=F();try{let i=KD(e),a=KD(t);if(i.length===0||a.length===0)return z(U(H.MINKOWSKI_FAILED,`Minkowski sum: one or both shapes have no vertices`,void 0,{operation:`minkowski`}));let o=[];for(let e of i){let[t,n,i]=r.vertexPosition(e.wrapped);for(let e of a){let[a,s,c]=r.vertexPosition(e.wrapped);o.push({x:t+a,y:n+s,z:i+c})}}let s=I(r.hullFromPoints(o,n));return FE(s)?R(s):(L(s),z(hD(H.MINKOWSKI_NOT_3D,`Minkowski hull did not produce a 3D shape`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.MINKOWSKI_FAILED,`Minkowski general path failed: ${t}`,e,{operation:`minkowski`}))}}function i6(e,t,n={}){let{tolerance:r=1e-6}=n;if(F().isNull(e.wrapped))return z(W(H.NULL_SHAPE_INPUT,`minkowski: shape is a null shape`));if(F().isNull(t.wrapped))return z(W(H.MINKOWSKI_NULL_TOOL,`minkowski: tool is a null shape`));if(!FE(e)||!FE(t))return z(W(H.MINKOWSKI_NOT_3D,`minkowski: both shape and tool must be 3D`));let i=t6(t);return i===null?r6(e,t,r):n6(e,i,r)}function a6(e,t,n={}){let{tolerance:r=1e-6}=n;if(e.length<4)return z(W(H.POLYHEDRON_INSUFFICIENT_POINTS,`polyhedron: need at least 4 points, got ${e.length}`));if(t.length<4)return z(W(H.POLYHEDRON_INSUFFICIENT_FACES,`polyhedron: need at least 4 faces, got ${t.length}`));let i=[];for(let[n,r]of t.entries()){for(let t of r)if(t<0||t>=e.length)return z(W(H.POLYHEDRON_INVALID_INDEX,`polyhedron: face ${n} has out-of-range index ${t} (${e.length} points)`));if(r.length<3)continue;let t=r[0];for(let e=1;e<r.length-1;e++)i.push([t,r[e],r[e+1]])}try{let t=F(),n=e.map(([e,t,n])=>({x:e,y:t,z:n})),a=I(t.buildSolidFromFaces(n,i,r));return NE(a)?R(a):(L(a),z(U(H.POLYHEDRON_FAILED,`Polyhedron did not produce a solid`)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.POLYHEDRON_FAILED,`Polyhedron failed: ${t}`,e))}}var o6=1e-10;function s6(e,t,n,r){return e*r-t*n}function c6(e,t,n,r){return e*n+t*r}function l6(e,t){return Math.sqrt(e*e+t*t)}function u6(e,t){let n=e[(t%e.length+e.length)%e.length];if(!n)throw Error(`Invalid polygon index ${t} for length ${e.length}`);return n}function d6(e){let t=0;for(let n=0;n<e.length;n++){let r=u6(e,n),i=u6(e,n+1);t+=r.x*i.y-i.x*r.y}return t<0?[...e].reverse():e}function f6(e,t){let n=u6(e,t-1),r=u6(e,t),i=u6(e,t+1),a=r.x-n.x,o=r.y-n.y,s=l6(a,o),c=i.x-r.x,l=i.y-r.y,u=l6(c,l);if(s<o6||u<o6)return{dx:0,dy:0};let d=-o/s,f=a/s,p=-l/u,m=c/u,h=d+p,g=f+m,_=l6(h,g);if(_<o6)return{dx:d,dy:f};h/=_,g/=_;let v=c6(h,g,d,f),y=Math.abs(v)>o6?1/v:1;return{dx:h*y,dy:g*y}}function p6(e){return!e.prev||!e.next?!1:s6(e.x-e.prev.x,e.y-e.prev.y,e.next.x-e.x,e.next.y-e.y)<-1e-10}function m6(e){let t=e.map((t,n)=>{let r=f6(e,n);return{x:t.x,y:t.y,bx:r.dx,by:r.dy,origIdx:n,prev:null,next:null,active:!0}});for(let e=0;e<t.length;e++){let n=t[e],r=t[(e-1+t.length)%t.length],i=t[(e+1)%t.length];n&&r&&i&&(n.prev=r,n.next=i)}return t}function h6(e,t){let n=e;for(let e=0;e<t&&n;e++)n.active=!1,n=n.next}function g6(e){let t=1,n=e.next;for(;n!==e&&(t++,n=n.next,!(t>1e4)););return t}function _6(e,t){let n=e.bx-t.bx,r=e.by-t.by,i=t.x-e.x,a=t.y-e.y;if(Math.abs(n)<o6&&Math.abs(r)<o6)return null;let o;if(o=Math.abs(n)>Math.abs(r)?i/n:a/r,o<o6)return null;let s=Math.abs(n)>Math.abs(r)?r:n,c=Math.abs(n)>Math.abs(r)?a:i;if(Math.abs(s)>o6){let e=c/s;if(Math.abs(o-e)>1e-4*Math.max(1,Math.abs(o)))return null}return o}function v6(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=l6(r,i);if(a<o6)return null;let o=-i/a,s=r/a,c=(e.x-t.x)*o+(e.y-t.y)*s,l=e.bx-(t.bx+n.bx)/2,u=e.by-(t.by+n.by)/2,d=l*o+u*s;if(Math.abs(d)<o6)return null;let f=-c/d;if(f<o6)return null;let p=e.x+f*e.bx,m=e.y+f*e.by,h=t.x+f*t.bx,g=t.y+f*t.by,_=n.x+f*n.bx,v=n.y+f*n.by,y=_-h,b=v-g,x=l6(y,b);if(x<o6)return f;let S=c6(p-h,m-g,y,b)/(x*x);return S<-.01||S>1.01?null:f}function y6(e){let t=[];for(let n of e){if(!n.active||!n.next)continue;let e=_6(n,n.next);if(e!==null&&e>o6){let r=n.x+e*n.bx,i=n.y+e*n.by;t.push({time:e,x:r,y:i,nodeA:n,nodeB:n.next,type:`edge`})}if(p6(n)){let e=n.next.next,r=0;for(;e!==n.prev&&e!==n&&r<1e3;){let i=v6(n,e,e.next);if(i!==null&&i>o6){let r=n.x+i*n.bx,a=n.y+i*n.by;t.push({time:i,x:r,y:a,nodeA:n,nodeB:e,type:`split`})}e=e.next,r++}}}return t.sort((e,t)=>e.time-t.time),t}function b6(e){if(e.length<3)return R({nodes:[],faces:[]});try{return R(x6(e))}catch(e){return z(vD(H.STRAIGHT_SKELETON_FAILED,e instanceof Error?e.message:String(e),e))}}function x6(e){let t=d6(e),n=t.length,r=[],i=Array.from({length:n},()=>[]),a=m6(t),o=0,s=n*n*2;for(;o<s;){o++;let e=a.find(e=>e.active);if(!e)break;let t=g6(e);if(t<=3){if(t===3){let t=e,n=t.next,a=n.next,o=_6(t,n),s=o!==null&&o>o6?o:0,c=(t.x+n.x+a.x)/3+s*(t.bx+n.bx+a.bx)/3,l=(t.y+n.y+a.y)/3+s*(t.by+n.by+a.by)/3,u=r.length;r.push({x:c,y:l,height:s});let d=i[t.origIdx],f=i[n.origIdx],p=i[a.origIdx];d&&d.push(u),f&&f.push(u),p&&p.push(u),t.active=!1,n.active=!1,a.active=!1}else h6(e,t);continue}let n=a.filter(e=>e.active),s=y6(n);if(s.length===0){for(let e of n)e.active=!1;break}let c=s[0];if(!c)break;if(c.type===`edge`){let e=c.nodeA,t=c.nodeB;if(!e.active||!t.active)continue;let n=r.length;r.push({x:c.x,y:c.y,height:c.time});let a=i[e.origIdx],o=i[t.origIdx];a&&a.push(n),o&&o.push(n),e.x=c.x,e.y=c.y,e.next=t.next,t.next.prev=e,t.active=!1;let s=[],l=e;do s.push({x:l.x,y:l.y}),l=l.next;while(l!==e);let u=f6(s,0);e.bx=u.dx,e.by=u.dy}else{let e=c.nodeA,t=c.nodeB;if(!e.active||!t.active)continue;let n=r.length;r.push({x:c.x,y:c.y,height:c.time});let o=i[e.origIdx];o&&o.push(n);let s=i[t.origIdx];s&&s.push(n);let l={x:c.x,y:c.y,bx:0,by:0,origIdx:e.origIdx,prev:null,next:null,active:!0};a.push(l),e.x=c.x,e.y=c.y;let u=e.next,d=t.next;e.next=d,d.prev=e,l.next=u,u.prev=l,l.prev=t,t.next=l;let f=e=>{let t=[],n=e;do t.push({x:n.x,y:n.y}),n=n.next;while(n!==e);return t},p=f6(f(e),0);e.bx=p.dx,e.by=p.dy;let m=f6(f(l),0);l.bx=m.dx,l.by=m.dy}}let c=[];for(let e=0;e<n;e++){let a=(e+1)%n,o=[u6(t,e),u6(t,a)],s=[0,0],l=i[a],u=i[e];if(l)for(let e of l){let t=r[e];t&&(o.push({x:t.x,y:t.y}),s.push(t.height))}if(u)for(let e=u.length-1;e>=0;e--){let t=u[e];if(t===void 0)continue;let n=r[t];if(!n)continue;let i=o[o.length-1];i&&l6(n.x-i.x,n.y-i.y)>o6&&(o.push({x:n.x,y:n.y}),s.push(n.height))}o.length>=3&&c.push({vertices:o,heights:s})}let l=[];for(let e of r)l.some(t=>Math.abs(t.x-e.x)<.01&&Math.abs(t.y-e.y)<.01)||l.push(e);return{nodes:l,faces:c}}function S6(e){let t=UD(e).map(e=>{let t=Xj(e);return{x:t[0],y:t[1]}}),n=t[0],r=t[t.length-1];return t.length>1&&n&&r&&Math.abs(n.x-r.x)<1e-10&&Math.abs(n.y-r.y)<1e-10&&t.pop(),t}function C6(e){let t=[];for(let n=1;n<e-1;n++)t.push([0,n,n+1]);return t}function w6(e,t,n,r,i,a){return(n-e)*(a-t)-(r-t)*(i-e)}function T6(e,t,n,r,i,a,o,s){let c=w6(n,r,i,a,e,t),l=w6(i,a,o,s,e,t),u=w6(o,s,n,r,e,t);return!((c<0||l<0||u<0)&&(c>0||l>0||u>0))}function E6(e){let t=e.length;if(t<3)return[];if(t===3)return[[0,1,2]];let n=0;for(let r=0;r<t;r++){let i=e[r],a=e[(r+1)%t];i&&a&&(n+=i.x*a.y-a.x*i.y)}let r=[],i=Array.from({length:t},(e,t)=>t);n<0&&i.reverse();let a=(t,n,r)=>{let a=e[t],o=e[n],s=e[r];if(!a||!o||!s||w6(a.x,a.y,o.x,o.y,s.x,s.y)<=0)return!1;for(let c of i){if(c===t||c===n||c===r)continue;let i=e[c];if(i&&T6(i.x,i.y,a.x,a.y,o.x,o.y,s.x,s.y))return!1}return!0};for(;i.length>3;){let e=!1;for(let t=0;t<i.length;t++){let n=i[(t-1+i.length)%i.length],o=i[t],s=i[(t+1)%i.length];if(n!==void 0&&o!==void 0&&s!==void 0&&a(n,o,s)){r.push([n,o,s]),i.splice(t,1),e=!0;break}}if(!e)break}if(i.length===3){let[e,t,n]=i;e!==void 0&&t!==void 0&&n!==void 0&&r.push([e,t,n])}return r}function D6(e,t,n){let r=[];for(let i of e.faces){let e=i.vertices.map((e,n)=>[e.x,e.y,(i.heights[n]??0)*t]),a=C6(e.length);for(let[t,i,o]of a){let a=e[t],s=e[i],c=e[o];if(!a||!s||!c)continue;let l=s[0]-a[0],u=s[1]-a[1],d=s[2]-a[2],f=c[0]-a[0],p=c[1]-a[1],m=c[2]-a[2],h=u*m-d*p,g=d*f-l*m,_=l*p-u*f;if(h*h+g*g+_*_<1e-20)continue;let v=n.buildTriFace(a,s,c);v!==null&&r.push(v)}}return r}function O6(e,t){let n=(t?.angle??45)*CD,r=Math.tan(n);try{let t=S6(e);if(t.length<3)return z(U(H.ROOF_FAILED,`Wire must have at least 3 edges for roof generation`));let n=b6(t);if(!n.ok)return n;let i=n.value;if(i.faces.length===0)return z(U(H.ROOF_FAILED,`Straight skeleton computation produced no faces`));let a=F(),o=D6(i,r,a);for(let[e,n,r]of E6(t)){let i=t[e],s=t[n],c=t[r];if(!i||!s||!c)continue;let l=[i.x,i.y,0],u=[s.x,s.y,0],d=[c.x,c.y,0],f=a.buildTriFace(l,d,u);f!==null&&o.push(f)}if(o.length===0)return z(U(H.ROOF_FAILED,`No valid triangular faces could be built`));try{let e=a.sewAndSolidify(o,1e-6),t=a.fixShape(e);return t!==e&&a.dispose(e),R(TE(t))}catch(e){try{let t=TE(a.sew(o,1e-6));return fO(t)?R(t):z(U(H.ROOF_FAILED,`Sew fallback produced invalid solid`,e))}catch(e){return z(U(H.ROOF_FAILED,`Failed to sew roof faces`,e))}}finally{for(let e of o)a.dispose(e)}}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.ROOF_FAILED,`Roof generation failed: ${t}`,e))}}var k6={coincident:3,concentric:4,distance:1,angle:1},A6=[1,0,0,0];function j6(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]}function M6(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function N6(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function P6(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function F6(e,t){return[e[0]*t,e[1]*t,e[2]*t]}function I6(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function L6(e){return I6(P6(e,Math.abs(e[0])<.9?[1,0,0]:[0,1,0]))}function R6(e,t){let n=j6(LF(t.rotation,e.origin),t.position);return{type:e.type,origin:n,...e.normal?{normal:LF(t.rotation,e.normal)}:{},...e.direction?{direction:LF(t.rotation,e.direction)}:{}}}function z6(e,t,n){let r=e.normal??[0,0,1];return{position:F6(r,N6(r,M6(e.origin,t.origin))+n),rotation:A6}}function B6(e,t){let n=e.direction??[0,0,1],r=zF(t.direction??[0,0,1],n),i=LF(r,t.origin);return{position:M6(e.origin,i),rotation:r}}function V6(e,t,n){let r=I6(e.normal??[0,0,1]),i=I6(t.normal??[0,0,1]),a=Math.acos(Math.max(-1,Math.min(1,N6(i,r)))),o=P6(i,r);return{position:[0,0,0],rotation:RF(Math.hypot(o[0],o[1],o[2])<1e-9?L6(i):o,a-n)}}function H6(e,t,n){let r=M6(t,e),i=Math.hypot(r[0],r[1],r[2]);return{position:M6(j6(e,F6(i<1e-9?[1,0,0]:F6(r,1/i),n)),t),rotation:A6}}function U6(e,t,n,r){let i=I6(e);return{position:F6(i,N6(i,M6(t,n))-r),rotation:A6}}function W6(e,t,n){let r=I6(e.direction??[0,0,1]),i=j6(e.origin,F6(r,N6(r,M6(t,e.origin))));if(n===0)return{position:M6(i,t),rotation:A6};let a=M6(t,i),o=Math.hypot(a[0],a[1],a[2]);return{position:M6(j6(i,F6(o<1e-9?L6(r):F6(a,1/o),n)),t),rotation:A6}}function G6(e,t,n){let r=I6(t.direction??[0,0,1]),i=M6(t.origin,e),a=M6(i,F6(r,N6(r,i))),o=Math.hypot(a[0],a[1],a[2]);return n===0?{position:F6(a,-1),rotation:A6}:{position:M6(F6(o<1e-9?L6(r):F6(a,1/o),n),a),rotation:A6}}function K6(e,t,n){let r=I6(e.direction??[0,0,1]),i=zF(I6(t.direction??[0,0,1]),r),a=M6(LF(i,t.origin),e.origin),o=M6(a,F6(r,N6(r,a))),s=Math.hypot(o[0],o[1],o[2]);return{position:M6(F6(s<1e-9?L6(r):F6(o,1/s),n),o),rotation:i}}var q6=new Set([`plane-plane`,`plane-point`,`point-plane`,`point-point`,`axis-axis`,`axis-point`,`point-axis`]),J6={angle:`plane`,concentric:`axis`},Y6=new Set([`coincident`,`distance`,`angle`,`concentric`]);function X6(e,t,n){let r=J6[e];return r?t===r&&n===r:q6.has(`${t}-${n}`)}function Z6(e,t,n){switch(`${e.type}-${t.type}`){case`plane-plane`:case`plane-point`:return z6(e,t,n);case`point-plane`:return U6(t.normal??[0,0,1],e.origin,t.origin,n);case`point-point`:return H6(e.origin,t.origin,n);case`axis-axis`:return n===0?B6(e,t):K6(e,t,n);case`axis-point`:return W6(e,t.origin,n);case`point-axis`:return G6(e.origin,t,n);default:return null}}function Q6(e,t,n){switch(e.type){case`concentric`:return B6(t,n);case`angle`:return V6(t,n,(e.value??0)*Math.PI/180);default:{let r=Z6(t,n,e.type===`distance`?e.value??0:0);if(!r)throw Error(`solveMate: unsupported entity pair escaped filter: ${t.type}-${n.type}`);return r}}}function $6(e,t){let n=new Map;for(let t of e)n.set(t,{position:[0,0,0],rotation:A6});let r=[],i=t.filter(e=>Y6.has(e.type)&&e.entityA&&e.entityB),a=new Set;for(let e of i)e.entityB&&a.add(e.entityB.node);let o=new Set;for(let t of e)a.has(t)||o.add(t);for(let e of t)e.type===`fixed`&&e.entityA&&o.add(e.entityA.node);let s=[];for(let e of i){if(!e.entityA||!e.entityB)continue;let t=e.entityA.entity.type,n=e.entityB.entity.type;if(!X6(e.type,t,n)){r.push(`${e.type}(${t}-${n})`);continue}s.push(e)}let c=!0;for(;c&&s.length>0;){c=!1;for(let e=s.length-1;e>=0;e--){let t=s[e];if(!t?.entityA||!t.entityB)continue;let r=t.entityA,i=t.entityB;if(!o.has(r.node)||(s.splice(e,1),c=!0,o.has(i.node)))continue;let a=n.get(r.node)??{position:[0,0,0],rotation:A6},l=R6(r.entity,a);n.set(i.node,Q6(t,l,i.entity)),o.add(i.node)}}for(let e of s)r.push(`${e.type}(unanchored)`);return{transforms:n,dof:r.reduce((e,t)=>e+(k6[t]??k6[t.split(`(`)[0]??``]??0),0),converged:r.length===0,unsupported:r}}function e8(e){if(e.face){let t=_k(e.face);return t?{type:`axis`,origin:t.origin,direction:t.direction}:{type:`plane`,origin:gk(e.face),normal:hk(e.face)}}if(e.edge){if(Yj(e.edge)===`LINE`)return{type:`axis`,origin:Xj(e.edge),direction:$j(e.edge)};let t=tM(e.edge);return t?{type:`axis`,origin:t.origin,direction:t.direction}:null}return e.point?{type:`point`,origin:e.point}:null}function t8(e,t){let n=e8(e),r=e8(t);return!n||!r?z(W(H.ASSEMBLY_MATE_INVALID,`solveAssembly: could not extract geometry from mate entities`)):R({entityA:{node:e.node,entity:n},entityB:{node:t.node,entity:r}})}function n8(e){switch(e.type){case`fixed`:return R({type:`fixed`,entityA:{node:e.entity.node,entity:{type:`point`,origin:[0,0,0]}}});case`coincident`:{let t=t8(e.entityA,e.entityB);return t.ok?R({type:`coincident`,...t.value}):t}case`distance`:{let t=t8(e.entityA,e.entityB);return t.ok?R({type:`distance`,...t.value,value:e.distance}):t}case`angle`:{let t=t8(e.entityA,e.entityB);return t.ok?R({type:`angle`,...t.value,value:e.angle}):t}case`concentric`:{let t=t8(e.axisA,e.axisB);return t.ok?R({type:`concentric`,...t.value}):t}}}function r8(e,t){let n=e.mates??[];return{...e,mates:[...n,t]}}function i8(e){let t=e.mates;if(!t||t.length===0)return z(W(H.ASSEMBLY_MATE_INVALID,`solveAssembly: no mates defined`));try{let n=[];XF(e,e=>{n.push(e.name)});let r=[];for(let e of t){let t=n8(e);if(!t.ok)return t;r.push(t.value)}let i=$6(n,r);if(!i.converged){let e=i.unsupported.length>0?`Unsupported constraint types: ${i.unsupported.join(`, `)} (${i.dof} DOF unresolved)`:`Assembly constraint solver did not converge`;return z(U(H.ASSEMBLY_NOT_CONVERGED,e))}return R({transforms:i.transforms,dof:i.dof,converged:i.converged})}catch(e){let t=e instanceof Error?e.message:String(e);return z(U(H.ASSEMBLY_SOLVE_FAILED,`Assembly solve failed: ${t}`,e))}}function a8(e,t,n=1e-6){return F().isNull(e.wrapped)?z(W(H.NULL_SHAPE_INPUT,`checkInterference: first shape is a null shape`)):F().isNull(t.wrapped)?z(W(H.NULL_SHAPE_INPUT,`checkInterference: second shape is a null shape`)):nE(()=>{let r=F().distance(e.wrapped,t.wrapped);return R({hasInterference:r.value<=n,minDistance:r.value,pointOnShape1:r.point1,pointOnShape2:r.point2})})}function o8(e,n=1e-6){let r=[],i=e.map(e=>rO(e));return e.forEach((a,o)=>{for(let s=o+1;s<e.length;s++){if(s8(t(i,o),t(i,s),n))continue;let c=V(a8(a,t(e,s),n));c.hasInterference&&r.push({i:o,j:s,result:c})}}),r}function s8(e,t,n){return e.xMax+n<t.xMin||t.xMax+n<e.xMin||e.yMax+n<t.yMin||t.yMax+n<e.yMin||e.zMax+n<t.zMin||t.zMax+n<e.zMin}function c8(e){let t=e.split(/\r?\n/),n=[],r=!1,i;for(let e=0;e<t.length-1;e+=2){let a=t[e],o=t[e+1];if(a===void 0||o===void 0)continue;let s=parseInt(a.trim(),10),c=o.trim();if(!isNaN(s)){if(s===2&&c===`ENTITIES`){r=!0;continue}if(r){if(s===0){if(c===`ENDSEC`||c===`EOF`){i&&n.push(i);break}i&&n.push(i),i={type:c,layer:`0`,data:new Map};continue}i&&(s===8?i.layer=c:i.data.set(s,c))}}}return n}function l8(e,t,n=0){let r=e.get(t);if(r===void 0)return n;let i=parseFloat(r);return isNaN(i)?n:i}function u8(e){let{type:t,data:n}=e,r=F();if(t===`LINE`)return r.makeLineEdge([l8(n,10),l8(n,20),l8(n,30)],[l8(n,11),l8(n,21),l8(n,31)]);if(t===`CIRCLE`)return r.makeCircleEdge([l8(n,10),l8(n,20),l8(n,30)],[0,0,1],l8(n,40));if(t===`ARC`){let e=l8(n,50)*Math.PI/180,t=l8(n,51)*Math.PI/180;return r.makeCircleArc([l8(n,10),l8(n,20),l8(n,30)],[0,0,1],l8(n,40),e,t)}}async function d8(e,t){let n;try{n=await e.text()}catch(e){return z(yD(H.DXF_IMPORT_FAILED,`Failed to read DXF blob`,e))}let r=c8(n),i=t?.layer===void 0?r:r.filter(e=>e.layer===t.layer);if(i.length===0)return R([]);let a=[];try{for(let e of i){let t=u8(e);t!==void 0&&a.push(t)}return a.length===0?R([]):R([SE(F().makeWire(a))])}catch(e){return z(yD(H.DXF_IMPORT_FAILED,`Failed to convert DXF entities to geometry`,e))}finally{for(let e of a)e.delete()}}function f8(e,t,n=1e-6){let r=F(),i=[];for(let[t,n,a]of e){let e=r.buildTriFace(t,n,a);e!==null&&i.push(e)}if(i.length===0)return z(yD(t,`No valid triangular faces could be built`));try{let e=I(r.sewAndSolidify(i,n));for(let e of i)r.dispose(e);return R(e)}catch{try{return R(LE(r.sew(i,n)))}catch(e){return z(yD(t,`Failed to sew triangular faces`,e))}}}function p8(e){let t=e.split(/\s+/),n=parseFloat(t[1]??``),r=parseFloat(t[2]??``),i=parseFloat(t[3]??``);return isNaN(n)||isNaN(r)||isNaN(i)?null:[n,r,i]}function m8(e){return e.split(/\s+/).slice(1).map(e=>parseInt(e.split(`/`)[0]??``,10)).filter(e=>!isNaN(e))}async function h8(e){let t=(await e.text()).split(`
|
|
60
|
+
`),n=[],r=[];for(let e of t){let t=e.trim();if(t.startsWith(`v `)){let e=p8(t);e&&n.push(e)}else if(t.startsWith(`f `)){let e=m8(t);e.length>=3&&r.push(e)}}if(n.length===0||r.length===0)return z(yD(H.OBJ_IMPORT_FAILED,`OBJ file contains no valid geometry`));try{return g8(n,r)}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.OBJ_IMPORT_FAILED,`OBJ import failed: ${t}`,e))}}function g8(e,t){let n=[];for(let r of t)for(let t=1;t<r.length-1;t++){let i=r[0]??0,a=r[t]??0,o=r[t+1]??0,s=i>0?i-1:e.length+i,c=a>0?a-1:e.length+a,l=o>0?o-1:e.length+o,u=e[s],d=e[c],f=e[l];!u||!d||!f||n.push([u,d,f])}return f8(n,H.OBJ_IMPORT_FAILED)}function _8(e,t){let n=-1;for(let t=e.length-22;t>=0;t--)if(e[t]===80&&e[t+1]===75&&e[t+2]===5&&e[t+3]===6){n=t;break}if(n<0)return null;let r=new DataView(e.buffer,e.byteOffset,e.byteLength),i=r.getUint32(n+16,!0),a=i+r.getUint32(n+12,!0),o=i,s=new TextDecoder;for(;o<a&&r.getUint32(o,!0)===33639248;){let n=r.getUint16(o+28,!0),i=r.getUint16(o+30,!0),a=r.getUint16(o+32,!0),c=r.getUint32(o+42,!0);if(s.decode(e.subarray(o+46,o+46+n))===t){if(r.getUint16(c+8,!0)!==0)return null;let t=r.getUint16(c+26,!0),n=r.getUint16(c+28,!0),i=r.getUint32(c+18,!0),a=c+30+t+n;return e.subarray(a,a+i)}o+=46+n+i+a}return null}function v8(e){return e>=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57||e===95}function y8(e){let t={},n=0;for(;n<e.length;){let r=e.indexOf(`="`,n);if(r<0)break;let i=r;for(;i>0&&v8(e.charCodeAt(i-1));)i--;if(i===r){n=r+2;continue}let a=e.slice(i,r),o=r+2,s=e.indexOf(`"`,o);if(s<0)break;t[a]=e.slice(o,s),n=s+1}return t}function b8(e,t){let n=[],r=`<${t} `,i=0;for(;i<e.length;){let t=e.indexOf(r,i);if(t<0)break;let a=e.indexOf(`>`,t);if(a<0)break;n.push(e.slice(t,a+1)),i=a+1}return n}function x8(e,t){let n=e.indexOf(`<${t}`);if(n<0)return null;let r=e.indexOf(`</${t}>`,n);return r<0?null:e.slice(n,r+t.length+3)}function S8(e){let t=e.startsWith(`#`)?e.slice(1):e;return[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255,t.length>=8?parseInt(t.slice(6,8),16)/255:1]}function C8(e){let t=new Map,n=0;for(;n<e.length;){let r=e.indexOf(`<colorgroup`,n);if(r<0)break;let i=e.indexOf(`</colorgroup>`,r);if(i<0)break;let a=e.slice(r,i+13);n=i+13;let o=e.indexOf(`>`,r);if(o<0)continue;let s=y8(e.slice(r,o+1)).id;if(s===void 0)continue;let c=parseInt(s,10),l=[];for(let e of b8(a,`color`)){let t=y8(e).color;t!==void 0&&l.push(S8(t))}t.set(c,l)}let r=0;for(;r<e.length;){let n=e.indexOf(`<basematerials`,r);if(n<0)break;let i=e.indexOf(`</basematerials>`,n);if(i<0)break;let a=e.slice(n,i+16);r=i+16;let o=e.indexOf(`>`,n);if(o<0)continue;let s=y8(e.slice(n,o+1)).id;if(s===void 0)continue;let c=parseInt(s,10),l=[];for(let e of b8(a,`base`)){let t=y8(e).displaycolor;t===void 0?l.push([0,0,0,1]):l.push(S8(t))}t.set(c,l)}return t}function w8(e){let t=[],n=[],r=[],i=C8(e);for(let n of b8(e,`vertex`)){let e=y8(n);e.x!==void 0&&e.y!==void 0&&e.z!==void 0&&t.push([parseFloat(e.x),parseFloat(e.y),parseFloat(e.z)])}let a=null,o=null,s=x8(e,`object`);if(s!==null){let e=s.indexOf(`>`);if(e>=0){let t=y8(s.slice(0,e+1));t.pid!==void 0&&(a=parseInt(t.pid,10)),t.pindex!==void 0&&(o=parseInt(t.pindex,10))}}for(let t of b8(e,`triangle`)){let e=y8(t);if(e.v1!==void 0&&e.v2!==void 0&&e.v3!==void 0){n.push([parseInt(e.v1,10),parseInt(e.v2,10),parseInt(e.v3,10)]);let t=null,s=e.pid??(a===null?void 0:String(a)),c=e.p1??(o===null?void 0:String(o));if(s!==void 0&&c!==void 0){let e=parseInt(s,10),n=parseInt(c,10),r=i.get(e);r!==void 0&&n<r.length&&(t=r[n]??null)}r.push(t)}}return{vertices:t,triangles:n,triangleColors:r}}function T8(e){let t=new Map;for(let n of e){if(n===null)continue;let e=n.join(`,`),r=t.get(e);r===void 0?t.set(e,{count:1,color:n}):r.count++}let n=null;for(let e of t.values())(n===null||e.count>n.count)&&(n=e);return n===null?null:n.color}function E8(e){let t=F(),n=e.vertices.map(([e,t,n])=>({x:e,y:t,z:n})),r=e.triangles;try{return R(I(t.buildSolidFromFaces(n,r,1e-6)))}catch{let t=[];for(let[n,r,i]of e.triangles){let a=e.vertices[n],o=e.vertices[r],s=e.vertices[i];!a||!o||!s||t.push([a,o,s])}return f8(t,H.THREEMF_IMPORT_FAILED)}}async function D8(e){try{let t=await e.arrayBuffer(),n=_8(new Uint8Array(t),`3D/3dmodel.model`);if(!n)return z(yD(H.THREEMF_IMPORT_FAILED,`3MF archive does not contain 3D/3dmodel.model (or uses unsupported compression)`));let r=w8(new TextDecoder().decode(n));if(r.vertices.length===0||r.triangles.length===0)return z(yD(H.THREEMF_IMPORT_FAILED,`3MF model contains no valid geometry`));let i=E8(r);if(i.ok){let e=T8(r.triangleColors);e!==null&&hA(i.value,e)}return i}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.THREEMF_IMPORT_FAILED,`3MF import failed: ${t}`,e))}}async function O8(e){try{let t=await e.arrayBuffer();return R(I(F().importGLB(t)))}catch(e){let t=e instanceof Error?e.message:String(e);return z(yD(H.GLB_IMPORT_FAILED,`Failed to import GLB: ${t}`,e))}}function $(e){return`__wrapped`in e?e.val:e}function k8(e){return $(e)}function A8(e,t){return rj($(e),t)}function j8(e,t){if(Array.isArray(e))throw Error(`${t}() expects an options object, e.g. ${t}(shape, { ... }), not an array of coordinates.`)}function M8(e,t,n){j8(n,`rotate`);let r=n?.at;return ij($(e),t,r,n?.axis)}function N8(e,t){j8(t,`mirror`);let n=t?.at;return aj($(e),t?.normal??[1,0,0],n)}function P8(e,t,n){return oj($(e),t,n?.center)}function F8(e){return Hj($(e))}function I8(e,t){return dj($(e),t)}function L8(e,t){return mj($(e),t)}function R8(e,t){return pj($(e),t)}function z8(e,t,n){return DA($(e),$(t),{...n,unsafe:!0})}function B8(e,t,n){return OA($(e),$(t),{...n,unsafe:!0})}function V8(e,t){return jA(e.map(e=>$(e)),{...t,unsafe:!0})}function H8(e,t,n){return MA($(e),t.map(e=>$(e)),{...n,unsafe:!0})}function U8(e,t,n){return kA($(e),$(t),{...n,unsafe:!0})}function W8(e,t,n){return FA($(e),t,n)}function G8(e,t,n){return VA($(e),t,n)}function K8(e,t){return HA($(e),t)}function q8(e,t,n){return UA($(e),t,n)}function J8(e,t){if(e!==void 0)return Array.isArray(e)?e:typeof e==`object`&&`findAll`in e?e.findAll(t):e(FL()).findAll(t)}function Y8(e,t){return Array.isArray(e)?e:typeof e==`object`&&`findAll`in e?e.findAll(t):e(RL()).findAll(t)}function X8(e){return typeof e==`object`&&!Array.isArray(e)&&typeof e!=`function`?{mode:`distAngle`,distance:e.distance,angle:e.angle}:typeof e==`function`?{mode:`standard`,distance:t=>{let n=e(t);return n===null?null:typeof n==`object`&&!Array.isArray(n)?n.distance:n}}:{mode:`standard`,distance:e}}function Z8(e,t,n){let r=$(e),i,a;return n===void 0?(i=void 0,a=t):(i=J8(t,r),a=n),qM(r,i,a)}function Q8(e,t,n){let r=$(e),i,a;n===void 0?(i=void 0,a=t):(i=J8(t,r),a=n);let o=X8(a);return o.mode===`distAngle`?eN(r,[...i??UD(r)],o.distance,o.angle):JM(r,i,o.distance)}function $8(e,t,n,r){let i=$(e);return YM(i,Y8(t,i),n,r?.tolerance)}function e5(e,t,n){return XM($(e),t,n?.tolerance)}function t5(e,t){return GM($(e),t)}function n5(e,t,n){let r=$(e);return QM(r,Y8(t,r),n.pullDirection,n.neutralPlane,n.angle)}function r5(e){return AN($(e))}function i5(e){return Jj($(e))}function a5(e,t){return bM($(e),t)}function o5(e,t){return xM($(e),t)}function s5(e){return sO($(e))}function c5(e){return Uj($(e))}function l5(e){return ak(e)}function u5(e){return EN($(e))}function d5(e){return Gj($(e))}function f5(e,t){return Vq($(e),typeof t==`number`?[0,0,t]:t)}function p5(e,t){let n=t?.at??[0,0,0];return Hq($(e),n,t?.axis??[0,0,1],t?.angle??2*Math.PI)}function m5(e,t){return qN(e.map(e=>$(e)),t)}function h5(e,n){if(n===void 0){let t=WD(e);if(t.length===0)return z(W(H.COMPOUND_NO_FACES,`compoundOps: shape has no faces`));let n=jk(t),r=gk(n)[2];for(let e=1;e<t.length;e++){let i=Ak(t,e),a=gk(i)[2];a>r&&(n=i,r=a)}return R(n)}if(typeof n==`function`){let r=n(RL()).findAll(e);return r.length===0?z(bD(H.COMPOUND_FACE_NOT_FOUND,`compoundOps: face finder matched no faces`)):R(t(r,0))}return R(n)}function g5(e){return`sketchOnPlane`in e&&typeof e.sketchOnPlane==`function`?{wire:e.sketchOnPlane(`XY`).wire,owned:!0}:{wire:e,owned:!1}}function _5(e,t){let n=$(e),{at:r,radius:i,axis:a}=t,o=a??[0,0,1];if(i<=0)return z(W(`DRILL_INVALID_RADIUS`,`Drill radius must be positive`));if(IO(o))return z(W(`DRILL_ZERO_AXIS`,`Drill axis cannot be zero`));let s=PO(o),c=r.length===2?[r[0],r[1],0]:[r[0],r[1],r[2]],l;if(t.depth!==void 0)l=JA(i,t.depth,c,s);else{let e=rO(n),t=[[e.xMin,e.yMin,e.zMin],[e.xMax,e.yMin,e.zMin],[e.xMin,e.yMax,e.zMin],[e.xMax,e.yMax,e.zMin],[e.xMin,e.yMin,e.zMax],[e.xMax,e.yMin,e.zMax],[e.xMin,e.yMax,e.zMax],[e.xMax,e.yMax,e.zMax]],r=1/0,a=-1/0;for(let e of t){let t=(e[0]-c[0])*s[0]+(e[1]-c[1])*s[1]+(e[2]-c[2])*s[2];t<r&&(r=t),t>a&&(a=t)}--r,a+=1,l=JA(i,a-r,[c[0]+s[0]*r,c[1]+s[1]*r,c[2]+s[2]*r],s)}try{return OA(n,l,{unsafe:!0})}finally{l[Symbol.dispose]()}}function v5(e,t){try{var n=WT();let r=$(e),{profile:i,depth:a}=t;if(a<=0)return z(W(`POCKET_INVALID_DEPTH`,`Pocket depth must be positive`));let o=h5(r,t.face);if(B(o))return o;let s=o.value,c=hk(s),l=gk(s),u=n.u(new iE),{wire:d,owned:f}=g5(i);f&&u.register(d);let p=Kk(d);if(B(p))return p;u.register(p.value);let m=Vq(u.register(rj(p.value,l)),DO(PO(c),-a));return B(m)?m:(u.register(m.value),OA(r,m.value,{unsafe:!0}))}catch(e){n.e=e}finally{n.d()}}function y5(e,t){try{var n=WT();let r=$(e),{profile:i,height:a}=t;if(a<=0)return z(W(`BOSS_INVALID_HEIGHT`,`Boss height must be positive`));let o=h5(r,t.face);if(B(o))return o;let s=o.value,c=hk(s),l=gk(s),u=n.u(new iE),{wire:d,owned:f}=g5(i);f&&u.register(d);let p=Kk(d);if(B(p))return p;u.register(p.value);let m=Vq(u.register(rj(p.value,l)),DO(PO(c),a));return B(m)?m:(u.register(m.value),DA(r,m.value,{unsafe:!0}))}catch(e){n.e=e}finally{n.d()}}function b5(e,t){try{var n=WT();let r=$(e),i=t?.normal??[1,0,0],a=t?.at;return IO(i)?z(W(`MIRROR_ZERO_NORMAL`,`Mirror plane normal cannot be zero`)):DA(r,n.u(aj(r,i,a)),{unsafe:!0})}catch(e){n.e=e}finally{n.d()}}function x5(e,t){let n=$(e),{xDir:r,xCount:i,xSpacing:a,yDir:o,yCount:s,ySpacing:c}=t;if(i<1||s<1)return z(W(`PATTERN_INVALID_COUNT`,`Pattern counts must be at least 1`));if(IO(r))return z(W(`PATTERN_ZERO_DIRECTION`,`X direction cannot be zero`));if(IO(o))return z(W(`PATTERN_ZERO_DIRECTION`,`Y direction cannot be zero`));if(i===1&&s===1)return R(n);let l=PO(r),u=PO(o),d=[n],f=[];for(let e=0;e<i;e++)for(let t=0;t<s;t++){if(e===0&&t===0)continue;let r=rj(n,[l[0]*a*e+u[0]*c*t,l[1]*a*e+u[1]*c*t,l[2]*a*e+u[2]*c*t]);d.push(r),f.push(r)}try{return jA(d,{unsafe:!0})}finally{for(let e of f)e[Symbol.dispose]()}}var S5=class extends Error{code;kind;suggestion;metadata;constructor(e){let t=e.suggestion?`${e.message}\nSuggestion: ${e.suggestion}`:e.message;super(t),this.name=`BrepError`,this.code=e.code,this.kind=e.kind,e.suggestion&&(this.suggestion=e.suggestion),e.metadata&&(this.metadata=e.metadata)}};function C5(e){if(B(e))throw new S5(e.error);return e.value}function w5(e){return e}function T5(e){return e}function E5(e){return e}function D5(e){return e}function O5(e){return{val:e,__wrapped:!0,translate:t=>R5(A8(e,t)),rotate:(t,n)=>R5(M8(e,t,n)),mirror:t=>R5(N8(e,t)),scale:(t,n)=>R5(P8(e,t,n)),applyMatrix:t=>R5(C5(I8(e,t))),moveX:t=>R5(A8(e,[t,0,0])),moveY:t=>R5(A8(e,[0,t,0])),moveZ:t=>R5(A8(e,[0,0,t])),rotateX:t=>R5(M8(e,t,{axis:[1,0,0]})),rotateY:t=>R5(M8(e,t,{axis:[0,1,0]})),rotateZ:t=>R5(M8(e,t,{axis:[0,0,1]})),bounds:()=>rO(e),describe:()=>s5(e),clone:()=>R5(C5(F8(e))),mesh:t=>a5(e,t),meshEdges:t=>o5(e,t),isValid:()=>u5(e),isEmpty:()=>d5(e),heal:()=>R5(C5(r5(e))),simplify:()=>R5(C5(i5(e))),toBREP:()=>C5(c5(e)),apply:t=>R5(t(e)),applyResult:t=>R5(C5(t(e))),done:()=>e}}function k5(e){return{fuse:(t,n)=>z5(C5(z8(e,$(t),{...n,unsafe:!0}))),cut:(t,n)=>z5(C5(B8(e,$(t),{...n,unsafe:!0}))),intersect:(t,n)=>z5(C5(U8(e,$(t),{...n,unsafe:!0}))),fuseAll:(t,n)=>z5(D5(C5(jA([e,...t.map($)],{...n,unsafe:!0})))),cutAll:(t,n)=>z5(D5(C5(MA(e,t,{...n,unsafe:!0})))),section:(t,n)=>R5(C5(W8(e,t,n))),split:t=>R5(C5(K8(e,t))),slice:(t,n)=>C5(q8(e,t,n))}}function A5(e){return{fillet(...t){return t.length===1?z5(D5(C5(Z8(w5(e),t[0])))):z5(D5(C5(Z8(w5(e),t[0],t[1]))))},chamfer(...t){return t.length===1?z5(D5(C5(Q8(w5(e),t[0])))):z5(D5(C5(Q8(w5(e),t[0],t[1]))))},shell:(t,n,r)=>z5(D5(C5($8(w5(e),t,n,r)))),offset:(t,n)=>z5(D5(C5(e5(w5(e),t,n)))),draft:(t,n)=>z5(D5(C5(n5(w5(e),t,n))))}}function j5(e){return{drill:t=>z5(C5(_5(e,t))),pocket:t=>z5(C5(v5(e,t))),boss:t=>z5(C5(y5(e,t))),mirrorJoin:t=>z5(C5(b5(e,t))),rectangularPattern:t=>z5(C5(x5(e,t)))}}function M5(e){return{volume:()=>C5(rP(e)),area:()=>C5(iP(e)),volumeProps:()=>C5(eP(e)),surfaceProps:()=>C5(tP(e))}}function N5(e){return{edges:()=>UD(e),faces:()=>WD(e),wires:()=>GD(e),vertices:()=>KD(e)}}function P5(e){return{linearPattern:(t,n,r)=>z5(D5(C5(VF(e,t,n,r)))),circularPattern:(t,n,r)=>z5(D5(C5(HF(e,t,n,r))))}}function F5(e){return{...O5(e),...k5(e),...A5(e),...j5(e),...M5(e),...N5(e),...P5(e)}}function I5(e){return{...O5(e),length:()=>eM(e),startPoint:()=>Xj(e),endPoint:()=>Zj(e),pointAt:t=>Qj(e,t),tangentAt:t=>$j(e,t),isClosed:()=>nM(e),sweep(t,n){if(!AE(e))throw Error(`sweep requires a Wire`);let r=C5(zN(E5(e),$(t),n));return z5(Array.isArray(r)?r[0]:r)}}}function L5(e){return{...O5(e),area:()=>C5(iP(e)),normalAt:t=>hk(e,t),center:()=>gk(e),surfaceType:()=>C5(sk(e)),outerWire:()=>yk(e),innerWires:()=>xk(e),extrude:t=>z5(C5(f5(T5(e),t))),revolve:t=>z5(C5(p5(T5(e),t)))}}function R5(e){return FE(e)?F5(e):jE(e)?L5(e):kE(e)||AE(e)?I5(e):O5(e)}function z5(e){return F5(e)}function B5(e){if(e&&typeof e==`object`&&`face`in e&&typeof e.face==`function`&&`_defaultOrigin`in e)return L5(e.face());if(e&&typeof e==`object`&&`wrapped`in e)return jE(e)?L5(e):FE(e)?F5(e):kE(e)||AE(e)?I5(e):O5(e);throw Error(`shape() requires a Sketch or branded shape type`)}var V5=.25,H5=e=>Math.tan(e)-e;function U5(e,t,n,r){let i=e/Math.cos(t),a=n+r*(Math.tan(t)-t);return[i*Math.cos(a),i*Math.sin(a),0]}function W5(e,t,n,r,i){let a=[];for(let o=0;o<=r;o++){let s=.5-.5*Math.cos(o/r*Math.PI);a.push(U5(e,s*t,n,i))}return a}function G5(e){return Math.max(16,Math.round(8*Math.sqrt(e)))}function K5(e,t,n,r,i,a,o){let s=e*t/2,c=s*Math.cos(n),l=t*(1+r),u=t*(1+i-r),d=o?s-t*(1-r):s+l,f=o?s+t*(1+i+r):s-u,p=a/s,m=(Math.PI/2+2*r*Math.tan(n))/e+(o?p:-p),h=o?f:d;return{rPitch:s,rb:c,rTip:d,rRoot:f,alphaPitch:n,halfToothAngle:m,alphaTip:h<=c?0:Math.acos(Math.min(1,c/h)),toothPitch:2*Math.PI/e,isInternal:o}}function q5(e,t,n){if(t===0)return R(e);let r=H5(e)+2*t*Math.tan(e)/n,i,a;if(r>H5(e)?(i=e,a=Math.PI/2-1e-6):(i=1e-4,a=e),r>H5(a)||r<H5(i))return z(W(`GEAR_PA_OUT_OF_RANGE`,`working pressure angle out of range — target inv(αw)=${r.toFixed(4)} not in [${H5(i).toFixed(4)}, ${H5(a).toFixed(4)}]`,void 0,{target:r,invLo:H5(i),invHi:H5(a)}));for(let e=0;e<50;e++){let e=.5*(i+a);H5(e)<r?i=e:a=e}return R(.5*(i+a))}function J5(e,t,n,r,i){return q5(e,t+n,r+i)}function Y5(e,t,n,r,i){return q5(e,n-t,i-r)}function X5(e,t,n,r,i){return(e+t)*n*Math.cos(r)/(2*Math.cos(i))}function Z5(e,t,n,r){if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(n))return z(W(`GEAR_NON_INTEGER_TEETH`,`tooth counts and planet count must be integers`));if(e<4||t<4||n<2)return z(W(`GEAR_TEETH_TOO_FEW`,`zs ≥ 4, zp ≥ 4, N ≥ 2 required`));if((2*e+2*t)%n!=0)return z(W(`GEAR_ASSEMBLY`,`(2·zs + 2·zp) must be divisible by N — got ${2*e+2*t} mod ${n} = ${(2*e+2*t)%n}`));let i=t+2+2*r,a=(e+t)*Math.sin(Math.PI/n);return a<=i?z(W(`GEAR_PLANET_COLLISION`,`planet tips would collide: (zs+zp)·sin(π/N) = ${a.toFixed(3)} ≤ planet tip = ${i.toFixed(3)}`)):R(void 0)}function Q5(e,t,n,r,i,a,o,s){return(Math.sqrt(Math.max(0,e*e-t*t))+Math.sqrt(Math.max(0,n*n-r*r))-i*Math.sin(s))/(Math.PI*a*Math.cos(o))}function $5(e,t,n,r,i,a,o,s){return(Math.sqrt(Math.max(0,e*e-t*t))-Math.sqrt(Math.max(0,n*n-r*r))+i*Math.sin(s))/(Math.PI*a*Math.cos(o))}function e7(e,t){return 1-e*Math.sin(t)*Math.sin(t)/2}function t7(e,t,n){return Math.max(0,e7(e,t)-n)}function n7(e){return e<8?.2:.485-2.88/e}function r7(e,t,n,r){let i=e*1e3,a=n7(r);return a<=0||n<=0||t<=0?1/0:2*i/(r*t*t*n*a)}function i7(e,t,n=!1){let r=(1.4+6.5/e)*(20/(t*180/Math.PI))**.15;return n?r*.85:r}function a7(e,t,n,r,i,a=!1){return r7(e,t,n,r)*i7(r,i,a)}function o7(e){return e/2}function s7(e,t){return e+2*t}function c7(e){return e%2==0?Math.PI/e:0}function l7(e,t,n){return e*(1+t/n)+c7(n)}function u7(e={}){let t=e.moduleSize??3,n=e.sunTeeth??15,r=e.planetTeeth??12,i=e.numPlanets??3,a=(e.pressureAngleDeg??20)*Math.PI/180,o=e.sunShift??0,s=e.planetShift??0,c=Z5(n,r,i,s);if(B(c))return c;let l=J5(a,o,s,n,r);if(B(l))return l;let u=X5(n,r,t,a,l.value),d=[];for(let e=0;e<i;e++){let t=e*2*Math.PI/i,a=l7(t,n,r);d.push({rotationDeg:a*180/Math.PI,position:[u*Math.cos(t),u*Math.sin(t),0]})}return R(d)}function d7(e,t,n,r,i){let a=t*e.toothPitch,o=(t+1)%n*e.toothPitch,s=H5(e.alphaPitch),c=a-e.halfToothAngle-s,l=a+e.halfToothAngle+s,u=W5(e.rb,e.alphaTip,c,r,1),d=W5(e.rb,e.alphaTip,l,r,-1).reverse(),f=jk(u),p=Mk(u),m=jk(d),h=Mk(d),g=[],_=e=>{i.register(e),g.push(e)},v=e.isInternal?e.rb<e.rRoot:e.rb>e.rRoot;v&&_(Fk([e.rRoot*Math.cos(c),e.rRoot*Math.sin(c),0],f));let y=e.rPitch*1e-5,b=Hk(u,{tolerance:y});if(B(b))return b;_(b.value),_(zk(p,[e.rTip*Math.cos(a),e.rTip*Math.sin(a),0],m));let x=Hk(d,{tolerance:y});if(B(x))return x;_(x.value),v&&_(Fk(h,[e.rRoot*Math.cos(l),e.rRoot*Math.sin(l),0]));let S=o-e.halfToothAngle-s,C=.5*(l+S);return S<l&&(C+=Math.PI),_(zk(v?[e.rRoot*Math.cos(l),e.rRoot*Math.sin(l),0]:h,[e.rRoot*Math.cos(C),e.rRoot*Math.sin(C),0],v?[e.rRoot*Math.cos(S),e.rRoot*Math.sin(S),0]:[e.rb*Math.cos(S),e.rb*Math.sin(S),0])),R(g)}function f7(e){return m7(e,!1)}function p7(e){return m7(e,!0)}function m7(e,t){try{var n=WT();let{teeth:r,moduleSize:i,pressureAngle:a,shift:o,clearance:s,flankThinning:c,samples:l=G5(i)}=e;if(r<4)return z(W(`GEAR_TEETH_TOO_FEW`,`gear needs ≥ 4 teeth, got ${r}`));if(i<=0)return z(W(`GEAR_MODULE_NONPOSITIVE`,`module must be > 0, got ${i}`));let u=K5(r,i,a,o,s,c,t),d=n.u(new iE),f=[];for(let e=0;e<r;e++){let t=d7(u,e,r,l,d);if(B(t))return t;f.push(...t.value)}let p=Gk(f);return B(p)?p:R(p.value)}catch(e){n.e=e}finally{n.d()}}function h7(e){let{teeth:t,moduleSize:n,thickness:r,pressureAngleDeg:i=20,shift:a=0,clearance:o=V5,flankThinning:s=0,bore:c=0,samples:l}=e;if(r<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));if(l!==void 0&&(!Number.isInteger(l)||l<1))return z(W(`GEAR_SAMPLES_INVALID`,`samples must be a positive integer; got ${String(l)}`));let u=i*Math.PI/180,d=K5(t,n,u,a,o,s,!1);if(c>0&&c>=2*d.rRoot)return z(W(`GEAR_BORE_TOO_LARGE`,`bore diameter ${c.toFixed(2)} ≥ root diameter ${(2*d.rRoot).toFixed(2)} — would erase the gear teeth`));let f=f7({teeth:t,moduleSize:n,pressureAngle:u,shift:a,clearance:o,flankThinning:s,...l===void 0?{}:{samples:l}});if(B(f))return f;let p=_7(t,u,a);return S7(f.value,r,c,d,p)}function g7(e){let{teeth:t,moduleSize:n,thickness:r,pressureAngleDeg:i=20,shift:a=0,clearance:o=V5,flankThinning:s=0,ringWallThickness:c=2*e.moduleSize,samples:l}=e;if(r<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));if(c<=0)return z(W(`GEAR_WALL_NONPOSITIVE`,`ringWallThickness must be > 0`));if(l!==void 0&&(!Number.isInteger(l)||l<1))return z(W(`GEAR_SAMPLES_INVALID`,`samples must be a positive integer; got ${String(l)}`));let u=i*Math.PI/180,d=p7({teeth:t,moduleSize:n,pressureAngle:u,shift:a,clearance:o,flankThinning:s,...l===void 0?{}:{samples:l}});if(B(d))return d;let f=K5(t,n,u,a,o,s,!0),p=x7(f.rPitch+c);return B(p)?p:w7(p.value,d.value,r,f,[])}function _7(e,t,n){let r=t7(e,t,n);return r<=0?[]:[{code:`UNDERCUT_RISK`,severity:`warning`,message:`gear is undercut: increase shift by ${r.toFixed(3)} to avoid (z=${e})`,context:{deficit:r,teeth:e}}]}function v7(e){let t=b7(e);if(B(t))return t;let n=t.value,r=y7(n);if(B(r))return r;let{sun:i,planet:a,ring:o}=r.value,s=O7(n,i,a,o),c=E7(a.solid,n);a.solid.delete();let l=D7(o.solid,n.zr),u=k7(n,s);return R({sun:i.solid,planets:c,ring:l,ringTeeth:n.zr,workingPressureAngle:n.alphaW_sp,centerDistance:n.centerDistance,contactRatio:{sunPlanet:s.crSunPlanet,planetRing:s.crPlanetRing},undercutDeficit:{sun:s.undercutSun,planet:s.undercutPlanet},...s.lewisStress?{lewisStress:s.lewisStress}:{},...s.stressConcentrationFactor?{stressConcentrationFactor:s.stressConcentrationFactor}:{},diagnostics:u})}function y7(e){let t=e.samples===void 0?{}:{samples:e.samples},n={moduleSize:e.moduleSize,thickness:e.thickness,pressureAngleDeg:e.pressureAngleDeg,clearance:e.clearance,flankThinning:e.bHalf,...t},r=h7({...n,teeth:e.sunTeeth,shift:e.sunShift,bore:e.sunBore});if(B(r))return r;let i=h7({...n,teeth:e.planetTeeth,shift:e.planetShift,bore:e.planetBore});if(B(i))return r.value.solid.delete(),i;let a=g7({...n,teeth:e.zr,shift:e.ringShift,ringWallThickness:e.ringWallThickness});return B(a)?(r.value.solid.delete(),i.value.solid.delete(),a):R({sun:r.value,planet:i.value,ring:a.value})}function b7(e){let t=e.moduleSize??3,n=e.sunTeeth??15,r=e.planetTeeth??12,i=e.numPlanets??3,a=e.pressureAngleDeg??20,o=a*Math.PI/180,s=e.sunShift??0,c=e.planetShift??0,l=e.ringShift??0;if(e.thickness<=0)return z(W(`GEAR_THICKNESS_NONPOSITIVE`,`thickness must be > 0`));let u=Z5(n,r,i,c);if(B(u))return u;let d=s7(n,r),f=J5(o,s,c,n,r);if(B(f))return f;let p=Y5(o,c,l,r,d);if(B(p))return p;let m=X5(n,r,t,o,f.value);return R({moduleSize:t,sunTeeth:n,planetTeeth:r,numPlanets:i,pressureAngleDeg:a,alpha:o,alphaW_sp:f.value,alphaW_pr:p.value,clearance:e.clearance??.25,bHalf:o7(e.backlash??0),sunShift:s,planetShift:c,ringShift:l,ringWallThickness:e.ringWallThickness??2*t,thickness:e.thickness,sunBore:e.sunBore??0,planetBore:e.planetBore??0,...e.appliedTorque===void 0?{}:{appliedTorque:e.appliedTorque},...e.samples===void 0?{}:{samples:e.samples},zr:d,centerDistance:m})}function x7(e){try{var t=WT();let n=Gk([t.u(new iE).register(Ik(e,[0,0,0],[0,0,1]))]);return B(n)?n:R(n.value)}catch(e){t.e=e}finally{t.d()}}function S7(e,t,n,r,i){try{var a=WT();let o=a.u(new iE);o.register(e);let s=Kk(e);if(B(s))return s;o.register(s.value);let c=Vq(s.value,[0,0,t]);if(B(c))return c;if(n<=0)return R(T7(c.value,r,i));let l=a.u(new iE);l.register(c.value);let u=C7(n/2);if(B(u))return u;l.register(u.value);let d=Vq(u.value,[0,0,t+1]);if(B(d))return d;l.register(d.value);let f=l.register(rj(d.value,[0,0,-.5])),p=OA(c.value,f);return B(p)?p:R(T7(p.value,r,i))}catch(e){a.e=e}finally{a.d()}}function C7(e){let t=x7(e);return B(t)?t:Kk(t.value)}function w7(e,t,n,r,i){let a=Kk(e,[t]);if(B(a))return a;let o=Vq(a.value,[0,0,n]);return B(o)?o:R(T7(o.value,r,i))}function T7(e,t,n=[]){return{solid:e,diagnostics:n,pitchDiameter:2*t.rPitch,baseDiameter:2*t.rb,tipDiameter:2*t.rTip,rootDiameter:2*t.rRoot}}function E7(e,t){let n=[];try{for(let r=0;r<t.numPlanets;r++){let i=r*2*Math.PI/t.numPlanets,a=ij(e,l7(i,t.sunTeeth,t.planetTeeth)*180/Math.PI);try{let e=[t.centerDistance*Math.cos(i),t.centerDistance*Math.sin(i),0];n.push(rj(a,e))}finally{a.delete()}}return n}catch(e){for(let e of n)e.delete();throw e}}function D7(e,t){let n=c7(t);if(n===0)return e;let r=ij(e,n*180/Math.PI);return e.delete(),r}function O7(e,t,n,r){let i={crSunPlanet:Q5(t.tipDiameter/2,t.baseDiameter/2,n.tipDiameter/2,n.baseDiameter/2,e.centerDistance,e.moduleSize,e.alpha,e.alphaW_sp),crPlanetRing:$5(n.tipDiameter/2,n.baseDiameter/2,r.tipDiameter/2,r.baseDiameter/2,e.centerDistance,e.moduleSize,e.alpha,e.alphaW_pr),undercutSun:t7(e.sunTeeth,e.alpha,e.sunShift),undercutPlanet:t7(e.planetTeeth,e.alpha,e.planetShift)};if(e.appliedTorque!==void 0){let t=e.appliedTorque;i.lewisStress={sun:a7(t,e.moduleSize,e.thickness,e.sunTeeth,e.alpha),planet:a7(t*e.planetTeeth/e.sunTeeth,e.moduleSize,e.thickness,e.planetTeeth,e.alpha),ring:a7(t*e.zr/e.sunTeeth,e.moduleSize,e.thickness,e.zr,e.alpha,!0)},i.stressConcentrationFactor={sun:i7(e.sunTeeth,e.alpha),planet:i7(e.planetTeeth,e.alpha),ring:i7(e.zr,e.alpha,!0)}}return i}function k7(e,t){let n=[];t.crSunPlanet<1.2&&n.push({code:`CONTACT_RATIO_LOW_SUN_PLANET`,severity:`warning`,message:`sun-planet contact ratio ${t.crSunPlanet.toFixed(2)} is below 1.2 — may run unevenly`,context:{value:t.crSunPlanet}}),t.crPlanetRing<1.2&&n.push({code:`CONTACT_RATIO_LOW_PLANET_RING`,severity:`warning`,message:`planet-ring contact ratio ${t.crPlanetRing.toFixed(2)} is below 1.2 — may run unevenly`,context:{value:t.crPlanetRing}}),t.undercutSun>0&&n.push({code:`UNDERCUT_RISK_SUN`,severity:`warning`,message:`sun gear is undercut: increase sunShift by ${t.undercutSun.toFixed(3)} to avoid`,context:{deficit:t.undercutSun,sunTeeth:e.sunTeeth}}),t.undercutPlanet>0&&n.push({code:`UNDERCUT_RISK_PLANET`,severity:`warning`,message:`planet gear is undercut: increase planetShift by ${t.undercutPlanet.toFixed(3)} to avoid`,context:{deficit:t.undercutPlanet,planetTeeth:e.planetTeeth}});let r=Math.abs(e.sunShift)+Math.abs(e.planetShift)+Math.abs(e.ringShift);e.appliedTorque!==void 0&&r>.05&&n.push({code:`LEWIS_Y_SHIFT_UNCORRECTED`,severity:`info`,message:`Lewis stress uses unshifted Y(z) and K_f approximations; expect ±5% per 0.1 of profile shift`});let i=e.ringShift-(e.sunShift+2*e.planetShift);return Math.abs(i)>1e-6&&n.push({code:`PLANETARY_SHIFT_KINEMATIC_MISMATCH`,severity:`warning`,message:`ringShift should equal sunShift + 2·planetShift for both meshes to share working PA; off by ${i.toFixed(3)}`,context:{kinematicError:i,sunShift:e.sunShift,planetShift:e.planetShift,ringShift:e.ringShift}}),n}var A7=NZ({addHoles:()=>Vj,bezier:()=>Oj,box:()=>hj,bsplineApprox:()=>Dj,circle:()=>Sj,compound:()=>Lj,cone:()=>vj,cylinder:()=>gj,ellipse:()=>Cj,ellipseArc:()=>Ej,ellipsoid:()=>bj,face:()=>Mj,fill:()=>qk,filledFace:()=>Nj,helix:()=>wj,line:()=>xj,offsetFace:()=>zj,polygon:()=>Fj,polyhedron:()=>a6,sewShells:()=>Bj,solid:()=>Rj,sphere:()=>_j,subFace:()=>Pj,tangentArc:()=>kj,threePointArc:()=>Tj,torus:()=>yj,vertex:()=>Ij,wire:()=>Aj,wireLoop:()=>jj}),j7=NZ({checkBoolean:()=>mN,convexHull:()=>e6,cut:()=>B8,cutAll:()=>MA,cutAllBisect:()=>aN,fuse:()=>z8,fuseAll:()=>jA,fuseAllBisect:()=>lN,hull:()=>$3,intersect:()=>U8,minkowski:()=>i6,section:()=>W8,sectionToFace:()=>G8,slice:()=>q8,split:()=>K8}),M7=NZ({chamfer:()=>Q8,draft:()=>n5,fillet:()=>Z8,heal:()=>r5,offset:()=>e5,shell:()=>$8,simplify:()=>i5,thicken:()=>t5,variableFillet:()=>$M}),N7=NZ({applyMatrix:()=>I8,clone:()=>F8,composeTransforms:()=>fj,mirror:()=>N8,rotate:()=>M8,scale:()=>P8,transformCopy:()=>L8,translate:()=>A8}),P7=NZ({checkAllInterferences:()=>o8,checkInterference:()=>a8,createDistanceQuery:()=>cP,measureArea:()=>iP,measureCurvatureAt:()=>lP,measureCurvatureAtMid:()=>uP,measureDistance:()=>oP,measureDistanceProps:()=>sP,measureLength:()=>aP,measureLinearProps:()=>nP,measureSurfaceProps:()=>tP,measureVolume:()=>rP,measureVolumeProps:()=>eP}),F7=NZ({blueprintToDXF:()=>xX,exportAssemblySTEP:()=>WF,exportDXF:()=>bX,exportGlb:()=>sX,exportGltf:()=>oX,exportIGES:()=>DM,exportOBJ:()=>XY,exportSTEP:()=>TM,exportSTEPConfigured:()=>iZ,exportSTL:()=>EM,exportThreeMF:()=>BX,importDXF:()=>d8,importGLB:()=>O8,importIGES:()=>sZ,importOBJ:()=>h8,importSTEP:()=>aZ,importSTL:()=>oZ,importSVG:()=>rZ,importSVGPathD:()=>nZ,importThreeMF:()=>D8}),I7=NZ({cornerFinder:()=>_z,edgeFinder:()=>FL,faceFinder:()=>RL,getSingleFace:()=>VL,vertexFinder:()=>WZ,wireFinder:()=>BL}),L7=NZ({complexExtrude:()=>VN,extrude:()=>f5,guidedSweep:()=>KN,loft:()=>m5,multiSectionSweep:()=>GN,revolve:()=>p5,roof:()=>O6,supportExtrude:()=>BN,surfaceFromGrid:()=>J3,surfaceFromImage:()=>Z3,sweep:()=>zN,twistExtrude:()=>HN}),R7=NZ({circularPattern:()=>HF,linearPattern:()=>VF}),z7=NZ({CSG_VERSION:()=>6,Evaluator:()=>Z2,add:()=>Z$,arbitraryClosedProfile:()=>M0,arbitraryProfileWithVoids:()=>N0,arcTo:()=>_1,asScalarExpr:()=>$$,asVec2Expr:()=>n1,asVec3Expr:()=>t1,asymmetricIProfile:()=>S0,bezierTo:()=>v1,binOp:()=>q$,box:()=>N1,buildVec:()=>X$,cShapeProfile:()=>D0,chamfer:()=>s0,circle:()=>z1,circleHollowProfile:()=>j0,circularProfile:()=>b0,color:()=>c0,component:()=>Y$,compound:()=>m0,cone:()=>I1,contour:()=>b1,cut:()=>J1,cutAll:()=>Z1,cylinder:()=>F1,ellipseArcTo:()=>y1,ellipseProfile:()=>O0,emptyFace:()=>W1,emptySolid:()=>U1,emptyWire:()=>G1,extrude:()=>r0,fillet:()=>o0,foldExpr:()=>a3,forEachNode:()=>b3,fromJSON:()=>g4,fuse:()=>q1,fuseAll:()=>X1,iBeamProfile:()=>x0,instance:()=>h0,intersect:()=>Y1,lShapeProfile:()=>C0,line:()=>B1,lineTo:()=>g1,loft:()=>f0,mirror:()=>n0,mul:()=>Q$,nodeCount:()=>S3,numLit:()=>U$,optimize:()=>i3,outputKindOf:()=>g0,param:()=>K$,path:()=>d0,polygon:()=>R1,profile:()=>l0,rectangleHollowProfile:()=>A0,rectangularProfile:()=>y0,replaceNode:()=>g3,revolve:()=>p0,rotate:()=>e0,scale:()=>t0,sphere:()=>P1,sweep:()=>u0,tShapeProfile:()=>w0,toJSON:()=>e4,torus:()=>L1,translate:()=>$1,trapeziumProfile:()=>k0,uShapeProfile:()=>T0,unaryOp:()=>J$,vec2Lit:()=>G$,vec3Lit:()=>W$,vertex:()=>V1,withEvaluator:()=>Q2,zShapeProfile:()=>E0});export{dz as BaseSketcher2d,fz as BlueprintSketcher,r as BrepBugError,H as BrepErrorCode,S5 as BrepWrapperError,Cy as BrepkitAdapter,Wq as CompoundSketch,o as DEFAULT_CAPABILITIES,CD as DEG2RAD,iE as DisposalScope,a as EXACT_BREP_CAPABILITIES,CJ as FaceSketcher,G as HASH_CODE_MAX,WE as OK,uo as OcctWasmAdapter,wD as RAD2DEG,oJ as Sketch,SJ as Sketcher,sJ as Sketches,KF as addChild,Vj as addHoles,hI as addJoint,r8 as addMate,XI as addStep,CP as adjacentFaces,$E as all,JE as andThen,RZ as applyGlue,I8 as applyMatrix,cM as approximateCurve,mE as as2D,pE as as3D,ZO as asTopo,RP as assignRoles,jN as autoHeal,Oj as bezier,P3 as blueprintToContour,xX as blueprintToDXF,WA as booleanPipeline,j7 as booleans,y5 as boss,hj as box,Dj as bsplineApprox,i as bug,yJ as cameraFromPlane,vJ as cameraLookAt,AP as captureHint,rk as cast,LE as castShape,RE as castShape3D,Q8 as chamfer,eN as chamferDistAngleShape,CN as chamferWithEvolution,o8 as checkAllInterferences,mN as checkBoolean,a8 as checkInterference,Sj as circle,HF as circularPattern,vk as classifyPointOnFace,vM as clearMeshCache,F8 as clone,pO as closedWire,uD as collect,QF as collectShapes,gA as colorFaces,hA as colorShape,VN as complexExtrude,fj as composeTransforms,Lj as compound,rJ as compoundSketchExtrude,tJ as compoundSketchFace,aJ as compoundSketchLoft,iJ as compoundSketchRevolve,vD as computationError,b6 as computeStraightSkeleton,vj as cone,L7 as construction,e6 as convexHull,_z as cornerFinder,ZF as countNodes,MF as createAssembly,GF as createAssemblyNode,FY as createBlueprint,_J as createCamera,DE as createCompound,IY as createCompoundBlueprint,_F as createDerivedFaceRef,cP as createDistanceQuery,xE as createEdge,eF as createEdgeRef,CE as createFace,eE as createHandle,YI as createHistory,rE as createKernelHandle,yM as createMeshCache,WO as createNamedPlane,TZ as createOperationRegistry,HO as createPlane,zP as createRef,rL as createRegistry,wE as createShell,TE as createSolid,_Z as createTaskQueue,bE as createVertex,cF as createVertexRef,SE as createWire,wZ as createWorkerClient,AZ as createWorkerHandler,jZ as createWorkerPool,z7 as csg,mo as currentQuality,DY as curve2dBoundingBox,PY as curve2dDistanceFrom,OY as curve2dFirstPoint,NY as curve2dIsOnCurve,kY as curve2dLastPoint,jY as curve2dParameter,AY as curve2dSplitAt,MY as curve2dTangentAt,tM as curveAxis,Zj as curveEndPoint,nM as curveIsClosed,rM as curveIsPeriodic,eM as curveLength,iM as curvePeriod,Qj as curvePointAt,Xj as curveStartPoint,$j as curveTangentAt,B8 as cut,rB as cut2D,H8 as cutAll,aN as cutAllBisect,Kz as cutBlueprints,bN as cutWithEvolution,gj as cylinder,cI as cylindricalJoint,kP as defaultScorer,yZ as dequeueTask,s5 as describe,eY as deserializeDrawing,uL as deserializeHistory,ak as deserializeShape,tk as downcast,n5 as draft,nY as draw,sY as drawCircle,cY as drawEllipse,hY as drawFaceOutline,fY as drawParametricFunction,dY as drawPointsInterpolation,lY as drawPolysides,mY as drawProjection,iY as drawRectangle,rY as drawRoundedRectangle,aY as drawSingleCircle,oY as drawSingleEllipse,uY as drawText,xY as drawingChamfer,vY as drawingCut,bY as drawingFillet,_Y as drawingFuse,yY as drawingIntersect,gY as drawingToSketchOnPlane,_5 as drill,FL as edgeFinder,yP as edgesOfFace,Cj as ellipse,Ej as ellipseArc,bj as ellipsoid,vZ as enqueueTask,z as err,WF as exportAssemblySTEP,bX as exportDXF,sX as exportGlb,oX as exportGltf,DM as exportIGES,XY as exportOBJ,TM as exportSTEP,iZ as exportSTEPConfigured,EM as exportSTL,BX as exportThreeMF,WI as exportURDF,f5 as extrude,Uq as extrudeAll,Mj as face,_k as faceAxis,gk as faceCenter,RL as faceFinder,ck as faceGeomType,lk as faceOrientation,_P as facesOfEdge,vP as facesOfVertex,jQ as fieldBoolean,FQ as fieldContour,MQ as fieldOffset,PQ as fieldReinit,NQ as fieldShell,qk as fill,Nj as filledFace,Z8 as fillet,SN as filletWithEvolution,iA as findFacesByTag,YF as findNode,QI as findStep,PN as fixSelfIntersection,MN as fixShape,YE as flatMap,nD as flatten,uk as flipFaceOrientation,oM as flipOrientation,uZ as fontMetrics,yI as forwardKinematics,l5 as fromBREP,V3 as fromKernelDir,B3 as fromKernelPnt,z3 as fromKernelVec,iD as fromNullable,z8 as fuse,tB as fuse2D,V8 as fuseAll,lN as fuseAllBisect,Gz as fuseBlueprints,yN as fuseWithEvolution,K5 as gearGeometry,XZ as getActiveVoxelId,rO as getBounds,LY as getBounds2D,YD as getCompSolids,Yj as getCurveType,JT as getDisposalStats,UD as getEdges,vA as getFaceColor,Ck as getFaceOrigins,aA as getFaceTags,WD as getFaces,uJ as getFont,Wj as getHashCode,$I as getHistoryShape,F as getKernel,FT as getKernelCapabilities,zT as getKernelTier,tN as getNurbsCurveData,nN as getNurbsSurfaceData,aM as getOrientation,RY as getOrientation2D,Co as getPerformanceStats,_A as getShapeColor,vE as getShapeKind,JD as getShells,VL as getSingleFace,qD as getSolids,sk as getSurfaceType,sA as getTagMetadata,KD as getVertices,YZ as getVoxel,GD as getWires,UF as gridPattern,KN as guidedSweep,r5 as heal,ON as healFace,DN as healSolid,kN as healWire,wj as helix,$3 as hull,d8 as importDXF,O8 as importGLB,sZ as importIGES,h8 as importOBJ,aZ as importSTEP,oZ as importSTL,rZ as importSVG,nZ as importSVGPathD,D8 as importThreeMF,JI as importURDF,UT as init,AT as initFromManifold,VT as initFromOC,ZZ as initVoxel,xk as innerWires,d2 as instance,p2 as instanceCount,f2 as instanceGrid,g2 as instancedMesh,sM as interpolateCurve,U8 as intersect,iB as intersect2D,qz as intersectBlueprints,xN as intersectWithEvolution,HD as invalidateShapeCache,NI as inverseKinematics,F7 as io,yD as ioError,fE as is2D,dE as is3D,mZ as isBatchRequest,BZ as isChamferRadius,lO as isClosedWire,ik as isCompSolid,PE as isCompound,bF as isDerivedFaceRef,pZ as isDisposeRequest,kE as isEdge,xF as isEdgeRef,d5 as isEmpty,qj as isEqualShape,B as isErr,gZ as isErrorResponse,jE as isFace,CF as isFaceRef,VZ as isFilletRadius,dZ as isInitRequest,zY as isInside2D,u2 as isInstanced,wF as isLineageRef,uE as isLive,dO as isManifoldShell,zZ as isNumber,GE as isOk,fZ as isOperationRequest,uO as isOrientedFace,_O as isPlanarFace,vO as isPlanarWire,mJ as isProjectionPlane,xZ as isQueueEmpty,Kj as isSameShape,IE as isShape1D,FE as isShape3D,ME as isShell,NE as isSolid,hZ as isSuccessResponse,u5 as isValid,fO as isValidSolid,OE as isVertex,SF as isVertexRef,AE as isWire,nO as iterCompSolids,XD as iterEdges,ZD as iterFaces,tO as iterShells,eO as iterSolids,$O as iterTopo,$D as iterVertices,QD as iterWires,FI as jointTrajectory,mI as jointTransform,RI as jointsFromDH,jD as kernelCall,MD as kernelCallRaw,ND as kernelCallScoped,U as kernelError,S$ as latticeInfill,C$ as latticeInfillShape,xj as line,VF as linearPattern,lJ as loadFont,R8 as locate,m5 as loft,JN as loftAll,NJ as makeBaseBox,h7 as makeExternalGear,g7 as makeInternalGear,KO as makePlane,v7 as makePlanetaryGear,gJ as makeProjectedEdges,hO as manifoldShell,KE as map,rD as mapBoth,qE as mapErr,lD as match,m2 as materialize,iP as measureArea,lP as measureCurvatureAt,uP as measureCurvatureAtMid,oP as measureDistance,sP as measureDistanceProps,aP as measureLength,nP as measureLinearProps,tP as measureSurfaceProps,rP as measureVolume,eP as measureVolumeProps,P7 as measurement,bI as mechanismDOF,a5 as mesh,o5 as meshEdges,MM as meshLODs,PM as meshLODsProgressive,OM as meshMultiLOD,i6 as minkowski,N8 as mirror,WY as mirror2D,TY as mirrorDrawing,b5 as mirrorJoin,M7 as modifiers,cL as modifyStep,_D as moduleInitError,GN as multiSectionSweep,hk as normalAt,e5 as offset,zj as offsetFace,pQ as offsetMesh,gQ as offsetShape,lM as offsetWire2D,R as ok,XE as or,ZE as orElse,ez as organiseBlueprints,mO as orientedFace,yk as outerWire,R7 as patterns,bZ as pendingCount,pD as pipeline,YO as pivotPlane,yO as planarFace,lI as planarJoint,bO as planarWire,u7 as planetPlacements,v5 as pocket,fk as pointOnSurface,nQ as pointsInside,Fj as polygon,a6 as polyhedron,kJ as polysideInnerRadius,vz as polysidesBlueprint,TN as positionOnCurve,HT as prewarm,A7 as primitives,sI as prismaticJoint,bJ as projectEdges,mk as projectPointOnFace,I7 as query,bD as queryError,x5 as rectangularPattern,EZ as registerHandler,jT as registerKernel,RT as registerKernelTier,iL as registerOperation,nL as registerShape,JZ as registerVoxel,SZ as rejectAll,qF as removeChild,bk as removeHolesFromFace,aQ as repairMesh,sL as replayFrom,oL as replayHistory,YT as resetDisposalStats,wo as resetPerformanceStats,sj as resize,$ as resolve,k8 as resolve3D,vF as resolveDerivedFaceRef,wO as resolveDirection,tF as resolveEdgeRef,EF as resolveLineageRef,GO as resolvePlane,GP as resolveRef,OF as resolveRefIn,AF as resolveRefParams,lF as resolveVertexRef,EY as reverseCurve,oI as revoluteJoint,p5 as revolve,O6 as roof,M8 as rotate,HY as rotate2D,CY as rotateDrawing,yz as roundedRectangleBlueprint,P8 as scale,UY as scale2D,wY as scaleDrawing,ZQ as sdfBox,t$ as sdfCapsule,e$ as sdfCone,$Q as sdfCylinder,p$ as sdfFieldAxialRamp,g$ as sdfFieldClamp,f$ as sdfFieldConst,h$ as sdfFieldFromSdf,m$ as sdfFieldRadialRamp,s$ as sdfLattice,r$ as sdfPlane,QQ as sdfRoundedBox,XQ as sdfSphere,c$ as sdfStrutLattice,a$ as sdfSweep,n$ as sdfTorus,W8 as section,G8 as sectionToFace,lL as serializeHistory,fI as setJointValue,dI as setJointValues,Sk as setShapeOrigin,oA as setTagMetadata,Bj as sewShells,B5 as shape,sQ as shapeToMeshInput,ek as shapeType,TP as sharedEdges,$8 as shell,mQ as shellMesh,_Q as shellShape,wN as shellWithEvolution,i5 as simplify,wJ as sketchCircle,TJ as sketchEllipse,Zq as sketchExtrude,Jq as sketchFace,AJ as sketchFaceOffset,MJ as sketchHelix,$q as sketchLoft,qY as sketchOnFace2D,KY as sketchOnPlane2D,jJ as sketchParametricFunction,OJ as sketchPolysides,EJ as sketchRectangle,Xq as sketchRevolve,DJ as sketchRoundedRectangle,Qq as sketchSweep,cZ as sketchText,Yq as sketchWires,gD as sketcherStateError,q8 as slice,Rj as solid,NN as solidFromShell,i8 as solveAssembly,_j as sphere,uI as sphericalJoint,K8 as split,eL as stepCount,tL as stepsFrom,GY as stretch2D,Pj as subFace,BN as supportExtrude,FZ as supportsConstraintSketch,PZ as supportsProjection,J3 as surfaceFromGrid,Z3 as surfaceFromImage,zN as sweep,rA as tagFaces,kj as tangentArc,eD as tap,tD as tapErr,fJ as textBlueprints,lZ as textMetrics,t5 as thicken,dL as thread,Tj as threePointArc,c5 as toBREP,FM as toBufferGeometryData,IM as toGroupedBufferGeometryData,I3 as toKernelVec,RM as toLODGeometryData,zM as toLODGeometryLevels,LM as toLineGeometryData,BY as toSVGPathD,SO as toVec2,xO as toVec3,yj as torus,w$ as tpmsLattice,L8 as transformCopy,N7 as transforms,A8 as translate,VY as translate2D,SY as translateDrawing,JO as translatePlane,dD as tryCatch,fD as tryCatchAsync,HN as twistExtrude,hD as typeCastError,ZI as undoLast,xD as unsupportedError,V as unwrap,cD as unwrapErr,oD as unwrapOr,sD as unwrapOrElse,JF as updateNode,VP as updateRoles,dk as uvBounds,pk as uvCoordinates,gO as validSolid,Z5 as validatePlanetary,W as validationError,$M as variableFillet,TO as vecAdd,LO as vecAngle,AO as vecCross,NO as vecDistance,kO as vecDot,FO as vecEquals,IO as vecIsZero,jO as vecLength,MO as vecLengthSq,OO as vecNegate,PO as vecNormalize,RO as vecProjectToPlane,VO as vecRepr,zO as vecRotate,DO as vecScale,EO as vecSub,Ij as vertex,WZ as vertexFinder,cO as vertexPosition,SP as verticesOfEdge,bP as verticesOfFace,hQ as voxelBoolean,AQ as voxelBooleanField,LQ as voxelBooleanFieldShapes,vQ as voxelBooleanShapes,kQ as voxelField,IQ as voxelFieldFromShape,XF as walkAssembly,tQ as windingNumbers,Aj as wire,BL as wireFinder,jj as wireLoop,xP as wiresOfFace,PT as withKernel,W3 as withKernelDir,U3 as withKernelPnt,H3 as withKernelVec,IT as withQuality,aE as withScope,cE as withScopeResult,lE as withScopeResultAsync,BT as withTier,QE as zipResults};
|
|
@@ -4205,4 +4205,4 @@ No matching component was found for:
|
|
|
4205
4205
|
|
|
4206
4206
|
gl_FragColor = vec4(lineColor, alpha);
|
|
4207
4207
|
}
|
|
4208
|
-
`;function Jy({cellSize:e=10,lineColor:t=`#888898`,lineOpacity:n=.1,fadeStart:r=50,fadeEnd:i=200}){let a=(0,v.useRef)(null),o=i*2.5;return(0,v.useEffect)(()=>()=>{a.current?.dispose()},[]),(0,Q.jsxs)(`mesh`,{rotation:[-Math.PI/2,0,0],position:[0,-.01,0],children:[(0,Q.jsx)(`planeGeometry`,{args:[o,o]}),(0,Q.jsx)(`shaderMaterial`,{ref:a,vertexShader:Ky,fragmentShader:qy,uniforms:{cellSize:{value:e},lineColor:{value:new K(t)},lineOpacity:{value:n},fadeStart:{value:r},fadeEnd:{value:i}},transparent:!0,depthWrite:!1,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1})]})}function Yy(){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`hemisphereLight`,{args:[`#ffffff`,`#1a1a2e`,.65]}),(0,Q.jsx)(`directionalLight`,{position:[-50,60,80],intensity:.85,color:`#fff8f0`}),(0,Q.jsx)(`directionalLight`,{position:[40,-40,30],intensity:.15,color:`#e0e8ff`})]})}function Xy({autoRotate:e=!1,target:t,gridVisible:n=!0,gridProps:r,controlsProps:i,controlsRef:a,onControlsStart:o}){let s={...a?{ref:a}:{},...t?{target:t}:{},...o?{onStart:o}:{}};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Yy,{}),(0,Q.jsx)(Gy,{}),(0,Q.jsx)(by,{makeDefault:!0,autoRotate:e,autoRotateSpeed:1.5,...s,...i}),n&&(0,Q.jsx)(Jy,{...r})]})}var Zy={iso:new G(.6,.5,.6),front:new G(0,.3,1),top:new G(0,1,-.01),right:new G(1,.3,0)};function Qy({data:e,view:t,fitSignal:n,projection:r,onFirstFrame:i}){let a=S_(e=>e.camera),o=S_(e=>e.invalidate),s=(0,v.useRef)(!1),c=(0,v.useRef)(i);c.current=i;let{center:l,radius:u}=(0,v.useMemo)(()=>{let t=xy(e);t.computeBoundingSphere();let n=t.boundingSphere??new Bi(new G,1),r={center:n.center.clone(),radius:n.radius||1};return t.dispose(),r},[e]);return(0,v.useEffect)(()=>{let e=Zy[t].clone().normalize();a.position.copy(l).addScaledVector(e,u*3),a.near=u/100,a.far=u*100;let n=a;if(n.isOrthographicCamera){let e=Math.min(n.right-n.left,n.top-n.bottom);e>0&&u>0&&(n.zoom=e/(u*2.4))}a.lookAt(l),a.updateProjectionMatrix(),o(),s.current||(s.current=!0,c.current?.())},[a,o,l,u,t,n,r]),null}function $y(){let e=S_(e=>e.camera),t=(0,v.useRef)([e.position.x,e.position.y,e.position.z]);return(0,Q.jsx)(yy,{makeDefault:!0,position:t.current,zoom:20,near:.1,far:2e3})}function eb(){let e=S_(e=>e.gl);return(0,v.useEffect)(()=>(e.localClippingEnabled=!0,()=>{e.localClippingEnabled=!1}),[e]),null}function tb({data:e,view:t=`iso`,fitSignal:n,autoRotate:r=!1,gridVisible:i=!0,projection:a=`perspective`,onFirstFrame:o,onError:s,errorFallback:c,children:l}){return(0,Q.jsx)(Ay,{onError:s,fallback:c,children:(0,Q.jsxs)(Uv,{frameloop:r?`always`:`demand`,gl:{preserveDrawingBuffer:!0},children:[(0,Q.jsx)(eb,{}),a===`orthographic`&&(0,Q.jsx)($y,{}),(0,Q.jsx)(Xy,{autoRotate:r,gridVisible:i}),(0,Q.jsx)(Qy,{data:e,view:t,fitSignal:n,projection:a,onFirstFrame:o}),l]})})}var nb=[`iso`,`front`,`top`,`right`],rb={solid:`Solid`,wireframe:`Wire`,xray:`X-ray`},ib={iso:`Iso`,front:`Front`,top:`Top`,right:`Right`};function ab({viewMode:e,onViewModeChange:t,showEdges:n,onToggleEdges:r,showGrid:i,onToggleGrid:a,autoRotate:o,onToggleAutoRotate:s,projection:c,onToggleProjection:l,activeView:u,onView:d,onFit:f,onScreenshot:p,touch:m=!1,className:h}){return(0,Q.jsxs)(`div`,{className:h,style:h?void 0:{...cb,gap:m?8:6},children:[(f||p)&&(0,Q.jsxs)(ob,{touch:m,children:[f&&(0,Q.jsx)(sb,{label:`Fit`,onClick:f,touch:m}),p&&(0,Q.jsx)(sb,{label:`Snap`,onClick:p,touch:m})]}),e&&t&&(0,Q.jsx)(ob,{touch:m,children:Object.keys(rb).map(n=>(0,Q.jsx)(sb,{label:rb[n],active:e===n,touch:m,onClick:()=>{t(n)}},n))}),(r||a||s||l)&&(0,Q.jsxs)(ob,{touch:m,children:[r&&(0,Q.jsx)(sb,{label:`Edges`,active:n,onClick:r,touch:m}),a&&(0,Q.jsx)(sb,{label:`Grid`,active:i,onClick:a,touch:m}),s&&(0,Q.jsx)(sb,{label:`Spin`,active:o,onClick:s,touch:m}),l&&(0,Q.jsx)(sb,{label:c===`orthographic`?`Ortho`:`Persp`,active:c===`orthographic`,touch:m,onClick:l})]}),d&&(0,Q.jsx)(ob,{touch:m,children:nb.map(e=>(0,Q.jsx)(sb,{label:ib[e],active:u===e,touch:m,onClick:()=>{d(e)}},e))})]})}function ob({children:e,touch:t}){return(0,Q.jsx)(`div`,{style:t?fb:lb,children:e})}function sb({label:e,active:t,onClick:n,touch:r}){return(0,Q.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...r?pb:ub,...t?db:null},children:e})}var cb={position:`absolute`,top:12,right:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:6,pointerEvents:`none`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},lb={display:`flex`,flexDirection:`column`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`},ub={cursor:`pointer`,pointerEvents:`auto`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`,transition:`color 120ms, background 120ms`},db={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},fb={...lb,gap:6,padding:6},pb={...ub,padding:`9px 14px`,fontSize:13,borderRadius:6};function mb({dims:e,volume:t,area:n,triangles:r,valid:i,unit:a,className:o}){let s=a?` ${a}`:``,c=[];return e&&c.push((0,Q.jsx)(hb,{label:`Size`,value:`${gb(e[0])} × ${gb(e[1])} × ${gb(e[2])}${s}`},`size`)),t!==void 0&&c.push((0,Q.jsx)(hb,{label:`Volume`,value:`${gb(t)}${a?` ${a}³`:``}`},`vol`)),n!==void 0&&c.push((0,Q.jsx)(hb,{label:`Area`,value:`${gb(n)}${a?` ${a}²`:``}`},`area`)),r!==void 0&&c.push((0,Q.jsx)(hb,{label:`Triangles`,value:r.toLocaleString()},`tris`)),i!==void 0&&c.push((0,Q.jsx)(hb,{label:`Validity`,value:i?`valid`:`invalid`,valueColor:i?`#6ee7d7`:`#f0a0a0`},`valid`)),c.length===0?null:(0,Q.jsx)(`div`,{className:o,style:o?void 0:_b,children:c})}function hb({label:e,value:t,valueColor:n}){return(0,Q.jsxs)(`div`,{style:vb,children:[(0,Q.jsx)(`span`,{style:yb,children:e}),(0,Q.jsx)(`span`,{style:{...bb,...n?{color:n}:null},children:t})]})}function gb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}var _b={position:`absolute`,left:12,bottom:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:150,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},vb={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},yb={color:`#7b8591`},bb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},xb={PLANE:`Planar`,CYLINDER:`Cylindrical`,CONE:`Conical`,SPHERE:`Spherical`,TORUS:`Toroidal`,BEZIER_SURFACE:`Bézier`,BSPLINE_SURFACE:`B-spline`,REVOLUTION_SURFACE:`Revolved`,EXTRUSION_SURFACE:`Extruded`,OFFSET_SURFACE:`Offset`,OTHER_SURFACE:`Surface`};function Sb(e){return xb[e]??`Surface`}function Cb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}function wb({face:e,onClear:t,unit:n,className:r}){if(!e)return null;let[i,a,o]=e.normal;return(0,Q.jsxs)(`div`,{className:r,style:r?void 0:Eb,children:[(0,Q.jsxs)(`div`,{style:Db,children:[(0,Q.jsxs)(`span`,{style:Ob,children:[Sb(e.surfaceType),` face`]}),t&&(0,Q.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Clear selection`,style:kb,children:`✕`})]}),(0,Q.jsx)(Tb,{label:`Area`,value:`${Cb(e.area)}${n?` ${n}²`:``}`}),(0,Q.jsx)(Tb,{label:`Normal`,value:`${Cb(i)}, ${Cb(a)}, ${Cb(o)}`})]})}function Tb({label:e,value:t}){return(0,Q.jsxs)(`div`,{style:Ab,children:[(0,Q.jsx)(`span`,{style:jb,children:e}),(0,Q.jsx)(`span`,{style:Mb,children:t})]})}var Eb={position:`absolute`,left:12,top:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:170,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(74, 206, 204, 0.3)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Db={display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:2},Ob={color:`#6ee7d7`,fontSize:12,fontWeight:600},kb={cursor:`pointer`,border:`none`,background:`transparent`,color:`#7b8591`,fontSize:12,lineHeight:1,padding:0},Ab={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},jb={color:`#7b8591`},Mb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},Nb=[`x`,`y`,`z`];function Pb({enabled:e,onToggle:t,axis:n,onAxisChange:r,position:i,min:a,max:o,onPositionChange:s,flip:c,onToggleFlip:l,className:u}){return(0,Q.jsxs)(`div`,{className:u,style:u?void 0:Ib,children:[(0,Q.jsx)(Fb,{label:`Section`,active:e,onClick:t}),e&&(0,Q.jsxs)(Q.Fragment,{children:[Nb.map(e=>(0,Q.jsx)(Fb,{label:e.toUpperCase(),active:n===e,onClick:()=>{r(e)}},e)),(0,Q.jsx)(`input`,{type:`range`,min:a,max:o,step:(o-a)/200||.01,value:i,disabled:a===o,onChange:e=>{s(Number(e.target.value))},"aria-label":`Section position`,style:{...zb,...a===o?{opacity:.4}:null}}),(0,Q.jsx)(Fb,{label:`Flip`,active:c,onClick:l})]})]})}function Fb({label:e,active:t,onClick:n}){return(0,Q.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...Lb,...t?Rb:null},children:e})}var Ib={position:`absolute`,bottom:12,left:`50%`,transform:`translateX(-50%)`,zIndex:10,display:`flex`,alignItems:`center`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Lb={cursor:`pointer`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`},Rb={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},zb={width:160,accentColor:`#4ACECC`,margin:`0 4px`};function Bb(e){let t=new URLSearchParams(e),n=t.get(`file`);return n?{dir:t.get(`dir`),file:n}:null}function Vb(e){let t=e.lastIndexOf(`.`);return t===-1?``:e.slice(t).toLowerCase()}function Hb({inspect:e=!1}={}){let[t,n]=(0,v.useState)({status:`idle`});return(0,v.useEffect)(()=>{let t=Bb(window.location.search);if(!t){n({status:`error`,error:`missing ?file= parameter`});return}if(!t.dir){n({status:`error`,error:`missing ?dir= parameter`});return}n({status:`loading`});let r=new Worker(new URL(``+new URL(`kernelWorker-2Y-yFa-0.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),i=!1;r.addEventListener(`message`,e=>{i||(e.data.type===`loaded`?n({status:`ready`,data:e.data.meshData,measurements:e.data.measurements}):n({status:`error`,error:e.data.error}))});let a=`/__model/${t.file.split(`/`).map(encodeURIComponent).join(`/`)}?dir=${encodeURIComponent(t.dir)}`;return fetch(a).then(e=>{if(!e.ok)throw Error(`fetch ${t.file}: ${e.status}`);return e.arrayBuffer()}).then(n=>{let i={type:`load`,bytes:n,ext:Vb(t.file),inspect:e};r.postMessage(i,[n])}).catch(e=>{i||n({status:`error`,error:e instanceof Error?e.message:String(e)})}),()=>{i=!0,r.terminate()}},[e]),t}var Ub=[`iso`,`front`,`top`,`right`],Wb=new Set;function Gb(e){return Ub.includes(e)}function Kb(e){return Wb.add(e),()=>Wb.delete(e)}function qb(e){for(let t of Wb)t(e)}function Jb(){globalThis.__ready=!0}function Yb(){let e=globalThis;e.__ready=!1,e.__renderView=e=>{Gb(e)&&qb({view:e})},e.__setScene=e=>{e&&Gb(e.view)&&qb(e)}}function Xb({marks:e}){return(0,Q.jsx)(Q.Fragment,{children:e.map((e,t)=>(0,Q.jsx)(ay,{position:[e.pos[0],e.pos[1],e.pos[2]],center:!0,children:(0,Q.jsx)(`div`,{style:{background:`#ffcc00`,color:`#000`,font:`700 13px monospace`,padding:`1px 5px`,borderRadius:4,border:`1px solid #000`,whiteSpace:`nowrap`,pointerEvents:`none`},children:e.label})},`${e.label}-${t}`))})}var Zb=new URLSearchParams(window.location.search),Qb=Zb.get(`ui`)!==`0`,$b=Zb.get(`dims`)===`1`;function ex(){let e=document.querySelector(`canvas`);if(!e)return;let t=e.toDataURL(`image/png`),n=document.createElement(`a`);n.href=t,n.download=`brepjs-view.png`,n.click()}function tx(){let e=Hb({inspect:Qb}),[t,n]=(0,v.useState)(`iso`),[r,i]=(0,v.useState)(`solid`),[a,o]=(0,v.useState)(!0),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(`perspective`),[p,m]=(0,v.useState)(0),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(`x`),[w,T]=(0,v.useState)(0),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)([]),A=(0,v.useCallback)(()=>{m(e=>e+1)},[]),ee=(0,v.useCallback)(e=>{g(e)},[]),j=(0,v.useCallback)(e=>{y(e?e.faceId:null)},[]),M=(0,v.useMemo)(()=>e.status===`ready`?Sy(e.data):null,[e]);(0,v.useEffect)(()=>Kb(e=>{if(n(e.view),i(e.viewMode??`solid`),e.section&&M){let t=e.section.axis===`x`?0:e.section.axis===`y`?1:2;C(e.section.axis),T(M.min[t]+e.section.frac*(M.max[t]-M.min[t])),x(!0)}else x(!1);k(e.marks??[])}),[M]);let te=S===`x`?0:S===`y`?1:2,N=M?M.min[te]:0,P=M?M.max[te]:1,F=(0,v.useCallback)(e=>{if(!M)return 0;let t=e===`x`?0:e===`y`?1:2;return(M.min[t]+M.max[t])/2},[M]),ne=(0,v.useCallback)(()=>{x(e=>(e||T(F(S)),!e))},[F,S]),re=(0,v.useCallback)(e=>{C(e),T(F(e))},[F]),ie=(0,v.useMemo)(()=>b&&M?[wy(S,w,E)]:void 0,[b,M,S,w,E]);return e.status===`error`?(0,Q.jsxs)(`div`,{style:{color:`#e88`,padding:16,fontFamily:`monospace`},children:[`error: `,e.error]}):e.status===`ready`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(tb,{data:e.data,view:t,fitSignal:p,autoRotate:l,gridVisible:s,projection:d,onFirstFrame:Jb,children:[(0,Q.jsx)(ky,{data:e.data,viewMode:r,...ie?{clippingPlanes:ie}:{},...Qb?{onFacePick:ee,onFaceHover:j}:{}}),a&&r!==`wireframe`&&e.data.edges.length>0&&(0,Q.jsx)(Ny,{edges:e.data.edges,...ie?{clippingPlanes:ie}:{}}),Qb&&(0,Q.jsx)(Vy,{data:e.data,selectedFaceIds:h?[h.faceId]:[],hoverFaceId:_}),O.length>0&&(0,Q.jsx)(Xb,{marks:O})]}),Qb&&(0,Q.jsx)(wb,{face:h,onClear:()=>{g(null)}}),Qb&&(0,Q.jsx)(Pb,{enabled:b,onToggle:ne,axis:S,onAxisChange:re,position:w,min:N,max:P,onPositionChange:T,flip:E,onToggleFlip:()=>{D(e=>!e)}}),Qb&&(0,Q.jsx)(mb,{dims:Cy(e.data),volume:e.measurements.volume,area:e.measurements.area,triangles:e.data.index.length/3,valid:e.measurements.valid}),!Qb&&$b&&(0,Q.jsx)(mb,{dims:Cy(e.data)}),Qb&&(0,Q.jsx)(ab,{viewMode:r,onViewModeChange:i,showEdges:a,onToggleEdges:()=>{o(e=>!e)},showGrid:s,onToggleGrid:()=>{c(e=>!e)},autoRotate:l,onToggleAutoRotate:()=>{u(e=>!e)},projection:d,onToggleProjection:()=>{f(e=>e===`perspective`?`orthographic`:`perspective`)},activeView:t,onView:n,onFit:A,onScreenshot:ex})]}):(0,Q.jsx)(`div`,{style:{color:`#9aa`,padding:16,fontFamily:`monospace`},children:`loading model…`})}Yb();var nx=document.getElementById(`root`);nx&&(0,y.createRoot)(nx).render((0,Q.jsx)(v.StrictMode,{children:(0,Q.jsx)(tx,{})}));
|
|
4208
|
+
`;function Jy({cellSize:e=10,lineColor:t=`#888898`,lineOpacity:n=.1,fadeStart:r=50,fadeEnd:i=200}){let a=(0,v.useRef)(null),o=i*2.5;return(0,v.useEffect)(()=>()=>{a.current?.dispose()},[]),(0,Q.jsxs)(`mesh`,{rotation:[-Math.PI/2,0,0],position:[0,-.01,0],children:[(0,Q.jsx)(`planeGeometry`,{args:[o,o]}),(0,Q.jsx)(`shaderMaterial`,{ref:a,vertexShader:Ky,fragmentShader:qy,uniforms:{cellSize:{value:e},lineColor:{value:new K(t)},lineOpacity:{value:n},fadeStart:{value:r},fadeEnd:{value:i}},transparent:!0,depthWrite:!1,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1})]})}function Yy(){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`hemisphereLight`,{args:[`#ffffff`,`#1a1a2e`,.65]}),(0,Q.jsx)(`directionalLight`,{position:[-50,60,80],intensity:.85,color:`#fff8f0`}),(0,Q.jsx)(`directionalLight`,{position:[40,-40,30],intensity:.15,color:`#e0e8ff`})]})}function Xy({autoRotate:e=!1,target:t,gridVisible:n=!0,gridProps:r,controlsProps:i,controlsRef:a,onControlsStart:o}){let s={...a?{ref:a}:{},...t?{target:t}:{},...o?{onStart:o}:{}};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Yy,{}),(0,Q.jsx)(Gy,{}),(0,Q.jsx)(by,{makeDefault:!0,autoRotate:e,autoRotateSpeed:1.5,...s,...i}),n&&(0,Q.jsx)(Jy,{...r})]})}var Zy={iso:new G(.6,.5,.6),front:new G(0,.3,1),top:new G(0,1,-.01),right:new G(1,.3,0)};function Qy({data:e,view:t,fitSignal:n,projection:r,onFirstFrame:i}){let a=S_(e=>e.camera),o=S_(e=>e.invalidate),s=(0,v.useRef)(!1),c=(0,v.useRef)(i);c.current=i;let{center:l,radius:u}=(0,v.useMemo)(()=>{let t=xy(e);t.computeBoundingSphere();let n=t.boundingSphere??new Bi(new G,1),r={center:n.center.clone(),radius:n.radius||1};return t.dispose(),r},[e]);return(0,v.useEffect)(()=>{let e=Zy[t].clone().normalize();a.position.copy(l).addScaledVector(e,u*3),a.near=u/100,a.far=u*100;let n=a;if(n.isOrthographicCamera){let e=Math.min(n.right-n.left,n.top-n.bottom);e>0&&u>0&&(n.zoom=e/(u*2.4))}a.lookAt(l),a.updateProjectionMatrix(),o(),s.current||(s.current=!0,c.current?.())},[a,o,l,u,t,n,r]),null}function $y(){let e=S_(e=>e.camera),t=(0,v.useRef)([e.position.x,e.position.y,e.position.z]);return(0,Q.jsx)(yy,{makeDefault:!0,position:t.current,zoom:20,near:.1,far:2e3})}function eb(){let e=S_(e=>e.gl);return(0,v.useEffect)(()=>(e.localClippingEnabled=!0,()=>{e.localClippingEnabled=!1}),[e]),null}function tb({data:e,view:t=`iso`,fitSignal:n,autoRotate:r=!1,gridVisible:i=!0,projection:a=`perspective`,onFirstFrame:o,onError:s,errorFallback:c,children:l}){return(0,Q.jsx)(Ay,{onError:s,fallback:c,children:(0,Q.jsxs)(Uv,{frameloop:r?`always`:`demand`,gl:{preserveDrawingBuffer:!0},children:[(0,Q.jsx)(eb,{}),a===`orthographic`&&(0,Q.jsx)($y,{}),(0,Q.jsx)(Xy,{autoRotate:r,gridVisible:i}),(0,Q.jsx)(Qy,{data:e,view:t,fitSignal:n,projection:a,onFirstFrame:o}),l]})})}var nb=[`iso`,`front`,`top`,`right`],rb={solid:`Solid`,wireframe:`Wire`,xray:`X-ray`},ib={iso:`Iso`,front:`Front`,top:`Top`,right:`Right`};function ab({viewMode:e,onViewModeChange:t,showEdges:n,onToggleEdges:r,showGrid:i,onToggleGrid:a,autoRotate:o,onToggleAutoRotate:s,projection:c,onToggleProjection:l,activeView:u,onView:d,onFit:f,onScreenshot:p,touch:m=!1,className:h}){return(0,Q.jsxs)(`div`,{className:h,style:h?void 0:{...cb,gap:m?8:6},children:[(f||p)&&(0,Q.jsxs)(ob,{touch:m,children:[f&&(0,Q.jsx)(sb,{label:`Fit`,onClick:f,touch:m}),p&&(0,Q.jsx)(sb,{label:`Snap`,onClick:p,touch:m})]}),e&&t&&(0,Q.jsx)(ob,{touch:m,children:Object.keys(rb).map(n=>(0,Q.jsx)(sb,{label:rb[n],active:e===n,touch:m,onClick:()=>{t(n)}},n))}),(r||a||s||l)&&(0,Q.jsxs)(ob,{touch:m,children:[r&&(0,Q.jsx)(sb,{label:`Edges`,active:n,onClick:r,touch:m}),a&&(0,Q.jsx)(sb,{label:`Grid`,active:i,onClick:a,touch:m}),s&&(0,Q.jsx)(sb,{label:`Spin`,active:o,onClick:s,touch:m}),l&&(0,Q.jsx)(sb,{label:c===`orthographic`?`Ortho`:`Persp`,active:c===`orthographic`,touch:m,onClick:l})]}),d&&(0,Q.jsx)(ob,{touch:m,children:nb.map(e=>(0,Q.jsx)(sb,{label:ib[e],active:u===e,touch:m,onClick:()=>{d(e)}},e))})]})}function ob({children:e,touch:t}){return(0,Q.jsx)(`div`,{style:t?fb:lb,children:e})}function sb({label:e,active:t,onClick:n,touch:r}){return(0,Q.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...r?pb:ub,...t?db:null},children:e})}var cb={position:`absolute`,top:12,right:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:6,pointerEvents:`none`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},lb={display:`flex`,flexDirection:`column`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`},ub={cursor:`pointer`,pointerEvents:`auto`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`,transition:`color 120ms, background 120ms`},db={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},fb={...lb,gap:6,padding:6},pb={...ub,padding:`9px 14px`,fontSize:13,borderRadius:6};function mb({dims:e,volume:t,area:n,triangles:r,valid:i,unit:a,className:o}){let s=a?` ${a}`:``,c=[];return e&&c.push((0,Q.jsx)(hb,{label:`Size`,value:`${gb(e[0])} × ${gb(e[1])} × ${gb(e[2])}${s}`},`size`)),t!==void 0&&c.push((0,Q.jsx)(hb,{label:`Volume`,value:`${gb(t)}${a?` ${a}³`:``}`},`vol`)),n!==void 0&&c.push((0,Q.jsx)(hb,{label:`Area`,value:`${gb(n)}${a?` ${a}²`:``}`},`area`)),r!==void 0&&c.push((0,Q.jsx)(hb,{label:`Triangles`,value:r.toLocaleString()},`tris`)),i!==void 0&&c.push((0,Q.jsx)(hb,{label:`Validity`,value:i?`valid`:`invalid`,valueColor:i?`#6ee7d7`:`#f0a0a0`},`valid`)),c.length===0?null:(0,Q.jsx)(`div`,{className:o,style:o?void 0:_b,children:c})}function hb({label:e,value:t,valueColor:n}){return(0,Q.jsxs)(`div`,{style:vb,children:[(0,Q.jsx)(`span`,{style:yb,children:e}),(0,Q.jsx)(`span`,{style:{...bb,...n?{color:n}:null},children:t})]})}function gb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}var _b={position:`absolute`,left:12,bottom:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:150,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},vb={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},yb={color:`#7b8591`},bb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},xb={PLANE:`Planar`,CYLINDER:`Cylindrical`,CONE:`Conical`,SPHERE:`Spherical`,TORUS:`Toroidal`,BEZIER_SURFACE:`Bézier`,BSPLINE_SURFACE:`B-spline`,REVOLUTION_SURFACE:`Revolved`,EXTRUSION_SURFACE:`Extruded`,OFFSET_SURFACE:`Offset`,OTHER_SURFACE:`Surface`};function Sb(e){return xb[e]??`Surface`}function Cb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}function wb({face:e,onClear:t,unit:n,className:r}){if(!e)return null;let[i,a,o]=e.normal;return(0,Q.jsxs)(`div`,{className:r,style:r?void 0:Eb,children:[(0,Q.jsxs)(`div`,{style:Db,children:[(0,Q.jsxs)(`span`,{style:Ob,children:[Sb(e.surfaceType),` face`]}),t&&(0,Q.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Clear selection`,style:kb,children:`✕`})]}),(0,Q.jsx)(Tb,{label:`Area`,value:`${Cb(e.area)}${n?` ${n}²`:``}`}),(0,Q.jsx)(Tb,{label:`Normal`,value:`${Cb(i)}, ${Cb(a)}, ${Cb(o)}`})]})}function Tb({label:e,value:t}){return(0,Q.jsxs)(`div`,{style:Ab,children:[(0,Q.jsx)(`span`,{style:jb,children:e}),(0,Q.jsx)(`span`,{style:Mb,children:t})]})}var Eb={position:`absolute`,left:12,top:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:170,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(74, 206, 204, 0.3)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Db={display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:2},Ob={color:`#6ee7d7`,fontSize:12,fontWeight:600},kb={cursor:`pointer`,border:`none`,background:`transparent`,color:`#7b8591`,fontSize:12,lineHeight:1,padding:0},Ab={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},jb={color:`#7b8591`},Mb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},Nb=[`x`,`y`,`z`];function Pb({enabled:e,onToggle:t,axis:n,onAxisChange:r,position:i,min:a,max:o,onPositionChange:s,flip:c,onToggleFlip:l,className:u}){return(0,Q.jsxs)(`div`,{className:u,style:u?void 0:Ib,children:[(0,Q.jsx)(Fb,{label:`Section`,active:e,onClick:t}),e&&(0,Q.jsxs)(Q.Fragment,{children:[Nb.map(e=>(0,Q.jsx)(Fb,{label:e.toUpperCase(),active:n===e,onClick:()=>{r(e)}},e)),(0,Q.jsx)(`input`,{type:`range`,min:a,max:o,step:(o-a)/200||.01,value:i,disabled:a===o,onChange:e=>{s(Number(e.target.value))},"aria-label":`Section position`,style:{...zb,...a===o?{opacity:.4}:null}}),(0,Q.jsx)(Fb,{label:`Flip`,active:c,onClick:l})]})]})}function Fb({label:e,active:t,onClick:n}){return(0,Q.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...Lb,...t?Rb:null},children:e})}var Ib={position:`absolute`,bottom:12,left:`50%`,transform:`translateX(-50%)`,zIndex:10,display:`flex`,alignItems:`center`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Lb={cursor:`pointer`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`},Rb={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},zb={width:160,accentColor:`#4ACECC`,margin:`0 4px`};function Bb(e){let t=new URLSearchParams(e),n=t.get(`file`);return n?{dir:t.get(`dir`),file:n}:null}function Vb(e){let t=e.lastIndexOf(`.`);return t===-1?``:e.slice(t).toLowerCase()}function Hb({inspect:e=!1}={}){let[t,n]=(0,v.useState)({status:`idle`});return(0,v.useEffect)(()=>{let t=Bb(window.location.search);if(!t){n({status:`error`,error:`missing ?file= parameter`});return}if(!t.dir){n({status:`error`,error:`missing ?dir= parameter`});return}n({status:`loading`});let r=new Worker(new URL(``+new URL(`kernelWorker-BPGnKZst.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),i=!1;r.addEventListener(`message`,e=>{i||(e.data.type===`loaded`?n({status:`ready`,data:e.data.meshData,measurements:e.data.measurements}):n({status:`error`,error:e.data.error}))});let a=`/__model/${t.file.split(`/`).map(encodeURIComponent).join(`/`)}?dir=${encodeURIComponent(t.dir)}`;return fetch(a).then(e=>{if(!e.ok)throw Error(`fetch ${t.file}: ${e.status}`);return e.arrayBuffer()}).then(n=>{let i={type:`load`,bytes:n,ext:Vb(t.file),inspect:e};r.postMessage(i,[n])}).catch(e=>{i||n({status:`error`,error:e instanceof Error?e.message:String(e)})}),()=>{i=!0,r.terminate()}},[e]),t}var Ub=[`iso`,`front`,`top`,`right`],Wb=new Set;function Gb(e){return Ub.includes(e)}function Kb(e){return Wb.add(e),()=>Wb.delete(e)}function qb(e){for(let t of Wb)t(e)}function Jb(){globalThis.__ready=!0}function Yb(){let e=globalThis;e.__ready=!1,e.__renderView=e=>{Gb(e)&&qb({view:e})},e.__setScene=e=>{e&&Gb(e.view)&&qb(e)}}function Xb({marks:e}){return(0,Q.jsx)(Q.Fragment,{children:e.map((e,t)=>(0,Q.jsx)(ay,{position:[e.pos[0],e.pos[1],e.pos[2]],center:!0,children:(0,Q.jsx)(`div`,{style:{background:`#ffcc00`,color:`#000`,font:`700 13px monospace`,padding:`1px 5px`,borderRadius:4,border:`1px solid #000`,whiteSpace:`nowrap`,pointerEvents:`none`},children:e.label})},`${e.label}-${t}`))})}var Zb=new URLSearchParams(window.location.search),Qb=Zb.get(`ui`)!==`0`,$b=Zb.get(`dims`)===`1`;function ex(){let e=document.querySelector(`canvas`);if(!e)return;let t=e.toDataURL(`image/png`),n=document.createElement(`a`);n.href=t,n.download=`brepjs-view.png`,n.click()}function tx(){let e=Hb({inspect:Qb}),[t,n]=(0,v.useState)(`iso`),[r,i]=(0,v.useState)(`solid`),[a,o]=(0,v.useState)(!0),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(`perspective`),[p,m]=(0,v.useState)(0),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(`x`),[w,T]=(0,v.useState)(0),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)([]),A=(0,v.useCallback)(()=>{m(e=>e+1)},[]),ee=(0,v.useCallback)(e=>{g(e)},[]),j=(0,v.useCallback)(e=>{y(e?e.faceId:null)},[]),M=(0,v.useMemo)(()=>e.status===`ready`?Sy(e.data):null,[e]);(0,v.useEffect)(()=>Kb(e=>{if(n(e.view),i(e.viewMode??`solid`),e.section&&M){let t=e.section.axis===`x`?0:e.section.axis===`y`?1:2;C(e.section.axis),T(M.min[t]+e.section.frac*(M.max[t]-M.min[t])),x(!0)}else x(!1);k(e.marks??[])}),[M]);let te=S===`x`?0:S===`y`?1:2,N=M?M.min[te]:0,P=M?M.max[te]:1,F=(0,v.useCallback)(e=>{if(!M)return 0;let t=e===`x`?0:e===`y`?1:2;return(M.min[t]+M.max[t])/2},[M]),ne=(0,v.useCallback)(()=>{x(e=>(e||T(F(S)),!e))},[F,S]),re=(0,v.useCallback)(e=>{C(e),T(F(e))},[F]),ie=(0,v.useMemo)(()=>b&&M?[wy(S,w,E)]:void 0,[b,M,S,w,E]);return e.status===`error`?(0,Q.jsxs)(`div`,{style:{color:`#e88`,padding:16,fontFamily:`monospace`},children:[`error: `,e.error]}):e.status===`ready`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(tb,{data:e.data,view:t,fitSignal:p,autoRotate:l,gridVisible:s,projection:d,onFirstFrame:Jb,children:[(0,Q.jsx)(ky,{data:e.data,viewMode:r,...ie?{clippingPlanes:ie}:{},...Qb?{onFacePick:ee,onFaceHover:j}:{}}),a&&r!==`wireframe`&&e.data.edges.length>0&&(0,Q.jsx)(Ny,{edges:e.data.edges,...ie?{clippingPlanes:ie}:{}}),Qb&&(0,Q.jsx)(Vy,{data:e.data,selectedFaceIds:h?[h.faceId]:[],hoverFaceId:_}),O.length>0&&(0,Q.jsx)(Xb,{marks:O})]}),Qb&&(0,Q.jsx)(wb,{face:h,onClear:()=>{g(null)}}),Qb&&(0,Q.jsx)(Pb,{enabled:b,onToggle:ne,axis:S,onAxisChange:re,position:w,min:N,max:P,onPositionChange:T,flip:E,onToggleFlip:()=>{D(e=>!e)}}),Qb&&(0,Q.jsx)(mb,{dims:Cy(e.data),volume:e.measurements.volume,area:e.measurements.area,triangles:e.data.index.length/3,valid:e.measurements.valid}),!Qb&&$b&&(0,Q.jsx)(mb,{dims:Cy(e.data)}),Qb&&(0,Q.jsx)(ab,{viewMode:r,onViewModeChange:i,showEdges:a,onToggleEdges:()=>{o(e=>!e)},showGrid:s,onToggleGrid:()=>{c(e=>!e)},autoRotate:l,onToggleAutoRotate:()=>{u(e=>!e)},projection:d,onToggleProjection:()=>{f(e=>e===`perspective`?`orthographic`:`perspective`)},activeView:t,onView:n,onFit:A,onScreenshot:ex})]}):(0,Q.jsx)(`div`,{style:{color:`#9aa`,padding:16,fontFamily:`monospace`},children:`loading model…`})}Yb();var nx=document.getElementById(`root`);nx&&(0,y.createRoot)(nx).render((0,Q.jsx)(v.StrictMode,{children:(0,Q.jsx)(tx,{})}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,n={}){let r={position:e.vertices,normal:e.normals,index:e.triangles,edges:t,faceGroups:e.faceGroups.map(e=>({start:e.start,count:e.count,faceId:e.faceId}))};return n.color&&(r.color=n.color),r}function t(e,t){let r={valid:n(()=>e.isValid(t))??!1},i=n(()=>e.measureVolume(t));i&&e.isOk(i)&&typeof i.value==`number`&&i.value>0&&(r.volume=i.value);let a=n(()=>e.measureArea(t));return a&&e.isOk(a)&&typeof a.value==`number`&&a.value>0&&(r.area=a.value),r}function n(e){try{return e()}catch{return}}function r(e,t){switch(t.replace(/^\./,``).toLowerCase()){case`step`:case`stp`:return e.importSTEP;case`stl`:return e.importSTL;case`iges`:case`igs`:return e.importIGES;case`3mf`:return e.importThreeMF;case`glb`:case`gltf`:return e.importGLB;case`obj`:return e.importOBJ;default:throw Error(`unsupported file extension: ${t}`)}}function i(e,t){let n;try{n=e.getFaces(t)}catch(e){return console.warn(`[brepjs-cad] getFaces threw; faces unselectable`,e),[]}let r=[];for(let t of n)try{let n=e.getSurfaceType(t),i=e.isOk(n)&&n.value?n.value:`OTHER_SURFACE`,a=e.measureArea(t),o=e.isOk(a)&&typeof a.value==`number`?a.value:NaN;r.push({faceId:e.getHashCode(t),surfaceType:i,area:o,normal:e.normalAt(t)})}catch(e){console.warn(`[brepjs-cad] face metadata threw; skipping face`,e)}return r}async function a(n,a,o,s=!1){let c=await r(n,o)(a);if(!n.isOk(c)){let e=c.error;throw Error(`import failed: ${typeof e==`string`?e:JSON.stringify(e)}`)}let l=c.value,u=e(n.mesh(l),n.meshEdges(l).lines);return s&&(u.faceInfos=i(n,l)),{meshData:u,measurements:t(n,l)}}function o(e,t){t?self.postMessage(e,t):self.postMessage(e)}let s=null;function c(){return s||=l().catch(e=>{throw s=null,e}),s}async function l(){let e=new URL(`./`,self.location.origin).href,t=await fetch(`${e}wasm/occt-wasm.js`);if(!t.ok)throw Error(`failed to load occt-wasm.js: ${t.status}`);let n=URL.createObjectURL(new Blob([await t.text()],{type:`application/javascript`})),r=await import(n);URL.revokeObjectURL(n);let i=await r.default({locateFile:t=>t.endsWith(`.wasm`)?`${e}wasm/occt-wasm.wasm`:t}),a=await import(`./brepjs-
|
|
1
|
+
function e(e,t,n={}){let r={position:e.vertices,normal:e.normals,index:e.triangles,edges:t,faceGroups:e.faceGroups.map(e=>({start:e.start,count:e.count,faceId:e.faceId}))};return n.color&&(r.color=n.color),r}function t(e,t){let r={valid:n(()=>e.isValid(t))??!1},i=n(()=>e.measureVolume(t));i&&e.isOk(i)&&typeof i.value==`number`&&i.value>0&&(r.volume=i.value);let a=n(()=>e.measureArea(t));return a&&e.isOk(a)&&typeof a.value==`number`&&a.value>0&&(r.area=a.value),r}function n(e){try{return e()}catch{return}}function r(e,t){switch(t.replace(/^\./,``).toLowerCase()){case`step`:case`stp`:return e.importSTEP;case`stl`:return e.importSTL;case`iges`:case`igs`:return e.importIGES;case`3mf`:return e.importThreeMF;case`glb`:case`gltf`:return e.importGLB;case`obj`:return e.importOBJ;default:throw Error(`unsupported file extension: ${t}`)}}function i(e,t){let n;try{n=e.getFaces(t)}catch(e){return console.warn(`[brepjs-cad] getFaces threw; faces unselectable`,e),[]}let r=[];for(let t of n)try{let n=e.getSurfaceType(t),i=e.isOk(n)&&n.value?n.value:`OTHER_SURFACE`,a=e.measureArea(t),o=e.isOk(a)&&typeof a.value==`number`?a.value:NaN;r.push({faceId:e.getHashCode(t),surfaceType:i,area:o,normal:e.normalAt(t)})}catch(e){console.warn(`[brepjs-cad] face metadata threw; skipping face`,e)}return r}async function a(n,a,o,s=!1){let c=await r(n,o)(a);if(!n.isOk(c)){let e=c.error;throw Error(`import failed: ${typeof e==`string`?e:JSON.stringify(e)}`)}let l=c.value,u=e(n.mesh(l),n.meshEdges(l).lines);return s&&(u.faceInfos=i(n,l)),{meshData:u,measurements:t(n,l)}}function o(e,t){t?self.postMessage(e,t):self.postMessage(e)}let s=null;function c(){return s||=l().catch(e=>{throw s=null,e}),s}async function l(){let e=new URL(`./`,self.location.origin).href,t=await fetch(`${e}wasm/occt-wasm.js`);if(!t.ok)throw Error(`failed to load occt-wasm.js: ${t.status}`);let n=URL.createObjectURL(new Blob([await t.text()],{type:`application/javascript`})),r=await import(n);URL.revokeObjectURL(n);let i=await r.default({locateFile:t=>t.endsWith(`.wasm`)?`${e}wasm/occt-wasm.wasm`:t}),a=await import(`./brepjs-B7PT7jd2.js`),o=new i.OcctKernel;return a.registerKernel(`occt-wasm`,new a.OcctWasmAdapter(i,o)),a}function u(e){return[e.position.buffer,e.normal.buffer,e.index.buffer,e.edges.buffer]}async function d(e){try{let{meshData:t,measurements:n}=await a(await c(),new Blob([e.bytes]),e.ext,e.inspect??!1);o({type:`loaded`,meshData:t,measurements:n},u(t))}catch(e){o({type:`error`,error:e instanceof Error?e.message:String(e)})}}self.addEventListener(`message`,e=>{e.data.type===`load`&&d(e.data)});
|
package/viewer/dist/index.html
CHANGED