@pascal-app/core 1.0.7 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  4. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  7. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +9567 -9563
  8. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  10. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  11. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  12. package/dist/agent-operations/asset-catalog.js +28 -10
  13. package/dist/agent-operations/asset-views.d.ts +8 -3
  14. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  15. package/dist/agent-operations/asset-views.js +19 -3
  16. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  17. package/dist/agent-operations/author-scene.js +2 -3
  18. package/dist/agent-operations/batch.d.ts +7 -1
  19. package/dist/agent-operations/batch.d.ts.map +1 -1
  20. package/dist/agent-operations/batch.js +17 -2
  21. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  22. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  23. package/dist/agent-operations/catalog-asset.js +4 -0
  24. package/dist/agent-operations/circulation-spaces.d.ts +1724 -1723
  25. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  26. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  27. package/dist/agent-operations/design-brief.js +2 -0
  28. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  29. package/dist/agent-operations/furnish-room.js +2 -1
  30. package/dist/agent-operations/index.d.ts +3 -0
  31. package/dist/agent-operations/index.d.ts.map +1 -1
  32. package/dist/agent-operations/index.js +4 -1
  33. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  34. package/dist/agent-operations/level-reads.js +5 -2
  35. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  36. package/dist/agent-operations/move-plan.js +11 -9
  37. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  38. package/dist/agent-operations/place-in-room.js +2 -1
  39. package/dist/agent-operations/place-items.d.ts.map +1 -1
  40. package/dist/agent-operations/place-items.js +2 -1
  41. package/dist/agent-operations/scene-queries.d.ts +2944 -2943
  42. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  43. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  44. package/dist/agent-operations/scene-view.js +38 -13
  45. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  46. package/dist/agent-operations/search-assets.js +6 -0
  47. package/dist/agent-operations/types.d.ts +3 -2
  48. package/dist/agent-operations/types.d.ts.map +1 -1
  49. package/dist/agent-operations/usage-checks.js +18 -3
  50. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  51. package/dist/agent-operations/verify-scene.js +4 -2
  52. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  53. package/dist/agent-operations/wall-object-observations.js +1 -1
  54. package/dist/agent-tools/assets.js +1 -1
  55. package/dist/agent-tools/wall-openings.js +2 -2
  56. package/dist/building/__fixtures__/wall-opening-cases.d.ts +13 -12
  57. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  58. package/dist/building/level-duplication.d.ts +1281 -1279
  59. package/dist/building/level-duplication.d.ts.map +1 -1
  60. package/dist/building/level-duplication.js +3 -1
  61. package/dist/building/merge-windows.d.ts.map +1 -1
  62. package/dist/building/merge-windows.js +4 -3
  63. package/dist/building/wall-openings.d.ts +95 -81
  64. package/dist/building/wall-openings.d.ts.map +1 -1
  65. package/dist/building/wall-openings.js +74 -25
  66. package/dist/commands/structure/shared.d.ts +3203 -3202
  67. package/dist/commands/structure/shared.d.ts.map +1 -1
  68. package/dist/commands/structure/zone-wall-merge.d.ts +2028 -2025
  69. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  70. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  71. package/dist/contracts/reference-inventory.js +0 -1
  72. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  73. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  74. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  75. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2101 -2100
  76. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  77. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  78. package/dist/index.d.ts +13 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +13 -4
  81. package/dist/lib/__fixtures__/mezzanine.d.ts +6428 -6424
  82. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  83. package/dist/lib/absorb-wall-separators.d.ts +2267 -2266
  84. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  85. package/dist/lib/asset-storage.d.ts.map +1 -1
  86. package/dist/lib/asset-storage.js +3 -0
  87. package/dist/lib/build-mode.d.ts +11 -0
  88. package/dist/lib/build-mode.d.ts.map +1 -0
  89. package/dist/lib/build-mode.js +24 -0
  90. package/dist/lib/corner-pair.d.ts +2 -0
  91. package/dist/lib/corner-pair.d.ts.map +1 -1
  92. package/dist/lib/door-interaction.d.ts +14 -0
  93. package/dist/lib/door-interaction.d.ts.map +1 -0
  94. package/dist/lib/door-interaction.js +62 -0
  95. package/dist/lib/elevator-support.d.ts +15 -0
  96. package/dist/lib/elevator-support.d.ts.map +1 -0
  97. package/dist/lib/elevator-support.js +40 -0
  98. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  99. package/dist/lib/floor-foundation-datum.js +5 -1
  100. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  101. package/dist/lib/floor-intent-changes.js +6 -4
  102. package/dist/lib/floorplan/context.d.ts +95 -0
  103. package/dist/lib/floorplan/context.d.ts.map +1 -0
  104. package/dist/lib/floorplan/context.js +155 -0
  105. package/dist/lib/floorplan/index.d.ts +6 -0
  106. package/dist/lib/floorplan/index.d.ts.map +1 -0
  107. package/dist/lib/floorplan/index.js +5 -0
  108. package/dist/lib/floorplan/marks.d.ts +71 -0
  109. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  110. package/dist/lib/floorplan/marks.js +157 -0
  111. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  112. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  113. package/dist/lib/floorplan/plan-math.js +82 -0
  114. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  115. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  116. package/dist/lib/floorplan/svg-paths.js +92 -0
  117. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  118. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  119. package/dist/lib/floorplan/wall-affordances.js +24 -0
  120. package/dist/lib/hierarchy.d.ts +19 -0
  121. package/dist/lib/hierarchy.d.ts.map +1 -0
  122. package/dist/lib/hierarchy.js +53 -0
  123. package/dist/lib/opening-floor-datum.d.ts +1 -1
  124. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  125. package/dist/lib/opening-floor-datum.js +2 -2
  126. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  127. package/dist/lib/own-floor-intent.js +2 -2
  128. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  129. package/dist/lib/polygon-boolean.js +2 -1
  130. package/dist/lib/room-floor-elevation.d.ts +12 -0
  131. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  132. package/dist/lib/room-floor-elevation.js +41 -0
  133. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  134. package/dist/lib/room-floor-feasibility.js +1 -1
  135. package/dist/lib/space-detection.d.ts.map +1 -1
  136. package/dist/lib/space-detection.js +1 -0
  137. package/dist/lib/wall-face-script.d.ts.map +1 -1
  138. package/dist/lib/wall-face-script.js +3 -3
  139. package/dist/lib/window-interaction.d.ts +16 -0
  140. package/dist/lib/window-interaction.d.ts.map +1 -0
  141. package/dist/lib/window-interaction.js +82 -0
  142. package/dist/lib/zone-quantities.js +1 -1
  143. package/dist/node-slots/column.d.ts +5 -0
  144. package/dist/node-slots/column.d.ts.map +1 -1
  145. package/dist/node-slots/column.js +10 -0
  146. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  147. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  148. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  149. package/dist/registry/index.d.ts +3 -2
  150. package/dist/registry/index.d.ts.map +1 -1
  151. package/dist/registry/index.js +2 -1
  152. package/dist/registry/registry.d.ts +5 -0
  153. package/dist/registry/registry.d.ts.map +1 -1
  154. package/dist/registry/registry.js +10 -0
  155. package/dist/registry/roofs.d.ts +34 -0
  156. package/dist/registry/roofs.d.ts.map +1 -0
  157. package/dist/registry/roofs.js +61 -0
  158. package/dist/registry/types.d.ts +54 -0
  159. package/dist/registry/types.d.ts.map +1 -1
  160. package/dist/registry/validate-relations.d.ts +5 -1
  161. package/dist/registry/validate-relations.d.ts.map +1 -1
  162. package/dist/registry/validate-relations.js +6 -2
  163. package/dist/schema/asset-url.d.ts +8 -0
  164. package/dist/schema/asset-url.d.ts.map +1 -1
  165. package/dist/schema/asset-url.js +17 -0
  166. package/dist/schema/index.d.ts +1 -1
  167. package/dist/schema/index.d.ts.map +1 -1
  168. package/dist/schema/index.js +1 -1
  169. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  171. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  172. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  173. package/dist/schema/nodes/roof-segment.js +40 -2
  174. package/dist/schema/nodes/roof.d.ts +1 -1
  175. package/dist/schema/nodes/roof.d.ts.map +1 -1
  176. package/dist/schema/nodes/roof.js +13 -8
  177. package/dist/schema/nodes/wall.d.ts +1 -0
  178. package/dist/schema/nodes/wall.d.ts.map +1 -1
  179. package/dist/schema/nodes/wall.js +6 -0
  180. package/dist/schema/types.d.ts +2 -1
  181. package/dist/schema/types.d.ts.map +1 -1
  182. package/dist/services/index.d.ts +1 -1
  183. package/dist/services/index.d.ts.map +1 -1
  184. package/dist/services/index.js +1 -1
  185. package/dist/services/movement.d.ts +7 -0
  186. package/dist/services/movement.d.ts.map +1 -1
  187. package/dist/services/movement.js +13 -0
  188. package/dist/services/port-connectivity.d.ts +15 -6
  189. package/dist/services/port-connectivity.d.ts.map +1 -1
  190. package/dist/services/port-connectivity.js +83 -17
  191. package/dist/services/roof-bearing.js +2 -1
  192. package/dist/services/roof-level.d.ts.map +1 -1
  193. package/dist/services/roof-level.js +12 -2
  194. package/dist/services/roof-move.d.ts +4 -2
  195. package/dist/services/roof-move.d.ts.map +1 -1
  196. package/dist/services/roof-move.js +21 -9
  197. package/dist/services/storey.d.ts +6 -1
  198. package/dist/services/storey.d.ts.map +1 -1
  199. package/dist/services/storey.js +11 -2
  200. package/dist/spatial/usage-field/findings.d.ts +7 -1
  201. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  202. package/dist/spatial/usage-field/findings.js +42 -10
  203. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  204. package/dist/spatial/usage-field/path.js +28 -18
  205. package/dist/spatial/usage-field/swings.d.ts +1 -0
  206. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  207. package/dist/spatial/usage-field/walls.d.ts +2 -0
  208. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  209. package/dist/spatial/usage-field/walls.js +18 -4
  210. package/dist/store/actions/node-actions.d.ts +2 -1
  211. package/dist/store/actions/node-actions.d.ts.map +1 -1
  212. package/dist/store/actions/node-actions.js +23 -5
  213. package/dist/store/derived-node-guard.d.ts.map +1 -1
  214. package/dist/store/derived-node-guard.js +2 -1
  215. package/dist/store/scene-annotations.d.ts +4634 -4632
  216. package/dist/store/scene-annotations.d.ts.map +1 -1
  217. package/dist/systems/document-reconcile.d.ts.map +1 -1
  218. package/dist/systems/document-reconcile.js +1 -2
  219. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  220. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  221. package/dist/systems/elevator/elevator-geometry.js +40 -8
  222. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  223. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  224. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  225. package/dist/systems/elevator/elevator-runtime.js +95 -18
  226. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  227. package/dist/systems/elevator/elevator-service.js +24 -4
  228. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  229. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  230. package/dist/systems/roof/roof-elevation.js +26 -12
  231. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5 -1
  232. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  233. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2218 -2214
  234. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  235. package/dist/systems/stair/stair-opening-preview.d.ts +3203 -3202
  236. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  237. package/dist/systems/wall/wall-curve.d.ts +10 -0
  238. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  239. package/dist/systems/wall/wall-curve.js +38 -0
  240. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  241. package/dist/systems/wall/wall-frame.js +8 -0
  242. package/dist/systems/wall/wall-merge.d.ts +9 -1
  243. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  244. package/dist/systems/wall/wall-merge.js +38 -6
  245. package/dist/systems/wall/wall-top.d.ts +10 -3
  246. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  247. package/dist/systems/wall/wall-top.js +24 -8
  248. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  249. package/dist/systems/wall/wall-topology.js +19 -1
  250. package/dist/utils/ensure-scene-openings.d.ts +5595 -5593
  251. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  252. package/dist/utils/floor-plate-migration.d.ts +2267 -2266
  253. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  254. package/dist/utils/measurement-format.d.ts +27 -0
  255. package/dist/utils/measurement-format.d.ts.map +1 -0
  256. package/dist/utils/measurement-format.js +143 -0
  257. package/dist/utils/owned-floor-opening-migration.d.ts +653 -652
  258. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  259. package/dist/utils/reconcile-structure-on-load.d.ts +1724 -1723
  260. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  261. package/dist/utils/scene-bounds.d.ts +32 -0
  262. package/dist/utils/scene-bounds.d.ts.map +1 -0
  263. package/dist/utils/scene-bounds.js +201 -0
  264. package/dist/validation/validate-build-json.d.ts.map +1 -1
  265. package/dist/validation/validate-build-json.js +3 -1
  266. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scene-annotations.d.ts","sourceRoot":"","sources":["../../src/store/scene-annotations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEzD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAIzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAY3E;AAcD,qGAAqG;AACrG,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf,UAAU,GAAG,IAAI,CAgCnB;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAI5E;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAKzE;AAID,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAWxE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAClC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBlC"}
1
+ {"version":3,"file":"scene-annotations.d.ts","sourceRoot":"","sources":["../../src/store/scene-annotations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEzD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAIzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAY3E;AAcD,qGAAqG;AACrG,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf,UAAU,GAAG,IAAI,CAgCnB;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAI5E;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAKzE;AAID,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAWxE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAClC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"document-reconcile.d.ts","sourceRoot":"","sources":["../../src/systems/document-reconcile.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,4CAA4C,CAAA;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,WAAW,CAAA;AAKnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAWpD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAStE;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAQzE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,OAAO,EAC/C,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,OAAO,CAST;AAYD,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAA;IACxC,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,kBAAkB,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,wBAA6B,GACrC,IAAI,CA0FN"}
1
+ {"version":3,"file":"document-reconcile.d.ts","sourceRoot":"","sources":["../../src/systems/document-reconcile.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,4CAA4C,CAAA;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,WAAW,CAAA;AAKnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAWpD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAStE;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAQzE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,OAAO,EAC/C,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,OAAO,CAST;AAYD,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAA;IACxC,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,kBAAkB,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,wBAA6B,GACrC,IAAI,CA4FN"}
@@ -142,8 +142,7 @@ export function reconcileDocument(store, before, options = {}) {
142
142
  for (const id in roofsFrom)
143
143
  if (!(id in current))
144
144
  changed.push(id);
145
- const roofInput = (node) => isRoofElevationInput(node) || node?.type === 'roof-segment';
146
- if (changed.some((id) => roofInput(roofsFrom[id]) || roofInput(current[id]))) {
145
+ if (changed.some((id) => isRoofElevationInput(roofsFrom[id]) || isRoofElevationInput(current[id]))) {
147
146
  const roofs = [
148
147
  ...roofsKeptOverStorey(roofsFrom, view()),
149
148
  ...planRoofElevationUpdates(view(), roofsAffectedBy(roofsFrom, current, changed)),
@@ -1,5 +1,8 @@
1
1
  import type { ElevatorDoorPanelStyle, ElevatorDoorStyle, ElevatorNode, ElevatorShaftStyle } from '../../schema/index.js';
2
2
  export type ElevatorDoorSide = 'left' | 'right';
3
+ export declare const ELEVATOR_MIN_CAB_DIMENSION = 0.8;
4
+ export declare const ELEVATOR_MIN_CAB_HEIGHT = 1.8;
5
+ export declare const ELEVATOR_MIN_WALL_THICKNESS = 0.04;
3
6
  export declare function getResolvedElevatorDoorStyle(doorStyle: ElevatorNode['doorStyle'] | undefined): ElevatorDoorStyle;
4
7
  export declare function getResolvedElevatorDoorPanelStyle(doorPanelStyle: ElevatorNode['doorPanelStyle'] | undefined): ElevatorDoorPanelStyle;
5
8
  export declare function getResolvedElevatorShaftStyle(shaftStyle: ElevatorNode['shaftStyle'] | undefined): ElevatorShaftStyle;
@@ -12,4 +15,26 @@ export declare function getElevatorShaftWallThickness(node: ElevatorNode): numbe
12
15
  export declare function getElevatorShaftWidth(node: ElevatorNode, cabWidth?: number): number;
13
16
  export declare function getElevatorShaftDepth(node: ElevatorNode, cabDepth?: number): number;
14
17
  export declare function getElevatorCabCenterZ(node: ElevatorNode): number;
18
+ /** Shared effective dimensions keep legacy scenes readable without rewriting stored data. */
19
+ export declare function resolveElevatorDimensions(node: ElevatorNode): {
20
+ width: number;
21
+ depth: number;
22
+ cabHeight: number;
23
+ shaftWidth: number;
24
+ shaftDepth: number;
25
+ shaftWallThickness: number;
26
+ doorWidth: number;
27
+ doorHeight: number;
28
+ };
29
+ /** Apply on dimension edits only; absent shaft dimensions retain automatic cab sizing. */
30
+ export declare function normalizeElevatorDimensions(node: ElevatorNode): {
31
+ width: number;
32
+ depth: number;
33
+ cabHeight: number;
34
+ shaftWallThickness: number;
35
+ doorWidth: number;
36
+ doorHeight: number;
37
+ shaftWidth: number | undefined;
38
+ shaftDepth: number | undefined;
39
+ };
15
40
  //# sourceMappingURL=elevator-geometry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"elevator-geometry.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EACnB,MAAM,cAAc,CAAA;AAErB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAA;AAI/C,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,GAC/C,iBAAiB,CAEnB;AAED,wBAAgB,iCAAiC,CAC/C,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC,GAAG,SAAS,GACzD,sBAAsB,CAExB;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,GACjD,kBAAkB,CAEpB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,GAC/C,gBAAgB,EAAE,CAKpB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,UAUjD;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,UAKjD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,UAErD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,UAErD;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,YAAY,UAE/D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAA4B,UAE7F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAA4B,UAE7F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,UAEvD"}
1
+ {"version":3,"file":"elevator-geometry.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EACnB,MAAM,cAAc,CAAA;AAErB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAA;AAG/C,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAC7C,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAC1C,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAE/C,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,GAC/C,iBAAiB,CAEnB;AAED,wBAAgB,iCAAiC,CAC/C,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC,GAAG,SAAS,GACzD,sBAAsB,CAExB;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,GACjD,kBAAkB,CAEpB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,GAC/C,gBAAgB,EAAE,CAKpB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,UAWjD;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS,UAKjD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,UAErD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,UAErD;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,YAAY,UAK/D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAA4B,UAE7F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAA4B,UAE7F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,UAEvD;AAED,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY;;;;;;;;;EAgB3D;AAED,0FAA0F;AAC1F,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY;;;;;;;;;EAO7D"}
@@ -1,4 +1,7 @@
1
1
  const DEFAULT_ELEVATOR_SHAFT_WALL_THICKNESS = 0.09;
2
+ export const ELEVATOR_MIN_CAB_DIMENSION = 0.8;
3
+ export const ELEVATOR_MIN_CAB_HEIGHT = 1.8;
4
+ export const ELEVATOR_MIN_WALL_THICKNESS = 0.04;
2
5
  export function getResolvedElevatorDoorStyle(doorStyle) {
3
6
  return doorStyle ?? 'center-opening';
4
7
  }
@@ -18,12 +21,14 @@ export function getElevatorDoorLeafSides(doorStyle) {
18
21
  }
19
22
  export function getElevatorDoorLeafX(side, openingWidth, doorOpen, doorStyle) {
20
23
  const resolvedDoorStyle = getResolvedElevatorDoorStyle(doorStyle);
24
+ const amount = Math.min(1, Math.max(0, doorOpen));
25
+ const leafWidth = getElevatorDoorLeafWidth(openingWidth, doorStyle);
26
+ const openCenter = (openingWidth + leafWidth) / 2;
21
27
  if (resolvedDoorStyle === 'center-opening') {
22
28
  const direction = side === 'left' ? -1 : 1;
23
- return direction * (openingWidth / 4 + doorOpen * openingWidth * 0.34);
29
+ return direction * (openingWidth / 4 + amount * (openCenter - openingWidth / 4));
24
30
  }
25
- const direction = resolvedDoorStyle === 'single-left' ? -1 : 1;
26
- return direction * doorOpen * openingWidth * 0.68;
31
+ return (resolvedDoorStyle === 'single-left' ? -1 : 1) * amount * openCenter;
27
32
  }
28
33
  export function getElevatorDoorLeafWidth(openingWidth, doorStyle) {
29
34
  return getResolvedElevatorDoorStyle(doorStyle) === 'center-opening'
@@ -31,20 +36,47 @@ export function getElevatorDoorLeafWidth(openingWidth, doorStyle) {
31
36
  : Math.max(openingWidth - 0.018, 0.18);
32
37
  }
33
38
  export function getElevatorCabWidth(node) {
34
- return Math.max(node.width, 0.8);
39
+ return Math.max(node.width, ELEVATOR_MIN_CAB_DIMENSION);
35
40
  }
36
41
  export function getElevatorCabDepth(node) {
37
- return Math.max(node.depth, 0.8);
42
+ return Math.max(node.depth, ELEVATOR_MIN_CAB_DIMENSION);
38
43
  }
39
44
  export function getElevatorShaftWallThickness(node) {
40
- return Math.max(node.shaftWallThickness ?? DEFAULT_ELEVATOR_SHAFT_WALL_THICKNESS, 0.04);
45
+ return Math.max(node.shaftWallThickness ?? DEFAULT_ELEVATOR_SHAFT_WALL_THICKNESS, ELEVATOR_MIN_WALL_THICKNESS);
41
46
  }
42
47
  export function getElevatorShaftWidth(node, cabWidth = getElevatorCabWidth(node)) {
43
- return Math.max(node.shaftWidth ?? cabWidth, cabWidth, 0.8);
48
+ return Math.max(node.shaftWidth ?? cabWidth, cabWidth, ELEVATOR_MIN_CAB_DIMENSION);
44
49
  }
45
50
  export function getElevatorShaftDepth(node, cabDepth = getElevatorCabDepth(node)) {
46
- return Math.max(node.shaftDepth ?? cabDepth, cabDepth, 0.8);
51
+ return Math.max(node.shaftDepth ?? cabDepth, cabDepth, ELEVATOR_MIN_CAB_DIMENSION);
47
52
  }
48
53
  export function getElevatorCabCenterZ(node) {
49
54
  return -getElevatorShaftDepth(node) / 2 + getElevatorCabDepth(node) / 2;
50
55
  }
56
+ /** Shared effective dimensions keep legacy scenes readable without rewriting stored data. */
57
+ export function resolveElevatorDimensions(node) {
58
+ const width = getElevatorCabWidth(node);
59
+ const depth = getElevatorCabDepth(node);
60
+ const cabHeight = Math.max(node.cabHeight, ELEVATOR_MIN_CAB_HEIGHT);
61
+ const shaftWidth = getElevatorShaftWidth(node, width);
62
+ const shaftDepth = getElevatorShaftDepth(node, depth);
63
+ return {
64
+ width,
65
+ depth,
66
+ cabHeight,
67
+ shaftWidth,
68
+ shaftDepth,
69
+ shaftWallThickness: getElevatorShaftWallThickness(node),
70
+ doorWidth: Math.min(Math.max(node.doorWidth, 0.45), width - 0.18, shaftWidth - 0.18),
71
+ doorHeight: Math.min(Math.max(node.doorHeight, 1.2), cabHeight - 0.1),
72
+ };
73
+ }
74
+ /** Apply on dimension edits only; absent shaft dimensions retain automatic cab sizing. */
75
+ export function normalizeElevatorDimensions(node) {
76
+ const dimensions = resolveElevatorDimensions(node);
77
+ return {
78
+ ...dimensions,
79
+ shaftWidth: node.shaftWidth === undefined ? undefined : dimensions.shaftWidth,
80
+ shaftDepth: node.shaftDepth === undefined ? undefined : dimensions.shaftDepth,
81
+ };
82
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"elevator-opening-sync.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-opening-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,WAAW,EAEX,QAAQ,EAET,MAAM,cAAc,CAAA;AA8JrB,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAQ1C,SAAS;UAAQ,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC;IAiG5E"}
1
+ {"version":3,"file":"elevator-opening-sync.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-opening-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,WAAW,EAEX,QAAQ,EAET,MAAM,cAAc,CAAA;AA8HrB,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAQ1C,SAAS;UAAQ,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC;IAiG5E"}
@@ -69,44 +69,13 @@ function polygonContainsPolygon(outer, inner) {
69
69
  function isCoveredByExistingHole(existingHoles, autoHole) {
70
70
  return existingHoles.some((existingHole) => polygonContainsPolygon(existingHole, autoHole));
71
71
  }
72
- function getServedLevelRange(elevator, nodes) {
73
- const servedLevels = resolveElevatorServiceLevels(elevator, nodes);
74
- if (servedLevels.length < 2)
75
- return null;
76
- const levelNumbers = servedLevels.map((level) => level.level);
77
- return {
78
- max: Math.max(...levelNumbers),
79
- min: Math.min(...levelNumbers),
80
- sortedServedLevels: servedLevels,
81
- };
82
- }
83
- function getLevelNumber(levelId, nodes) {
84
- if (!levelId)
85
- return;
86
- const node = nodes[levelId];
87
- return node?.type === 'level' ? node.level : undefined;
88
- }
89
72
  function shouldApplyElevatorToSlab(elevator, slabLevelId, nodes) {
90
- const range = getServedLevelRange(elevator, nodes);
91
- if (!range)
92
- return false;
93
- const slabLevel = getLevelNumber(slabLevelId, nodes);
94
- if (slabLevel !== undefined) {
95
- return slabLevel > range.min && slabLevel <= range.max;
96
- }
97
- const servedIndex = range.sortedServedLevels.findIndex((level) => level.id === slabLevelId);
98
- return servedIndex > 0;
73
+ return (resolveElevatorServiceLevels(elevator, nodes).findIndex((level) => level.id === slabLevelId) > 0);
99
74
  }
100
75
  function shouldApplyElevatorToCeiling(elevator, ceilingLevelId, nodes) {
101
- const range = getServedLevelRange(elevator, nodes);
102
- if (!range)
103
- return false;
104
- const ceilingLevel = getLevelNumber(ceilingLevelId, nodes);
105
- if (ceilingLevel !== undefined) {
106
- return ceilingLevel >= range.min && ceilingLevel < range.max;
107
- }
108
- const servedIndex = range.sortedServedLevels.findIndex((level) => level.id === ceilingLevelId);
109
- return servedIndex >= 0 && servedIndex < range.sortedServedLevels.length - 1;
76
+ const levels = resolveElevatorServiceLevels(elevator, nodes);
77
+ const index = levels.findIndex((level) => level.id === ceilingLevelId);
78
+ return index >= 0 && index < levels.length - 1;
110
79
  }
111
80
  function getElevatorOpeningPolygon(elevator) {
112
81
  const wallThickness = Math.max(elevator.shaftWallThickness ?? DEFAULT_ELEVATOR_SHAFT_WALL_THICKNESS, 0.04);
@@ -1 +1 @@
1
- {"version":3,"file":"elevator-runtime.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,KAAK,wBAAwB,EAAkB,MAAM,6BAA6B,CAAA;AAE3F,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,oBAAoB,CAAA;AAUnF,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,MAAM,GACX,wBAAwB,CAW1B;AA8BD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,SAAS,GACjB,wBAAwB,CAW1B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAQ/F;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,QAS7E;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,QASrD;AAED,wBAAgB,wBAAwB,CAAC,EACvC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,GAAG,EACH,KAAK,GACN,EAAE;IACD,YAAY,EAAE,kBAAkB,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,wBAAwB,CAAA;CAChC,GAAG,wBAAwB,CAmH3B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAsC9D"}
1
+ {"version":3,"file":"elevator-runtime.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,KAAK,wBAAwB,EAAkB,MAAM,6BAA6B,CAAA;AAE3F,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,oBAAoB,CAAA;AAUnF,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,MAAM,GACX,wBAAwB,CAW1B;AAoCD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,SAAS,GACjB,wBAAwB,CAW1B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAQ/F;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,QAY7E;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,QAoBrD;AAED,wBAAgB,wBAAwB,CAAC,EACvC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,GAAG,EACH,KAAK,GACN,EAAE;IACD,YAAY,EAAE,kBAAkB,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,wBAAwB,CAAA;CAChC,GAAG,wBAAwB,CA+K3B;AAkBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QA6C9D"}
@@ -24,7 +24,10 @@ function getInitialElevatorState(elevatorId, nodes) {
24
24
  const node = nodes[elevatorId];
25
25
  if (node?.type !== 'elevator')
26
26
  return null;
27
- const { defaultEntry } = resolveElevatorLevels(node, nodes);
27
+ const { entries, defaultEntry: configuredDefault } = resolveElevatorLevels(node, nodes);
28
+ const defaultEntry = entries.find((entry) => entry.id === configuredDefault?.id && !node.disabledLevelIds.includes(entry.id)) ??
29
+ entries.find((entry) => !node.disabledLevelIds.includes(entry.id)) ??
30
+ configuredDefault;
28
31
  if (!defaultEntry)
29
32
  return null;
30
33
  return createElevatorInteractiveState(defaultEntry.id, defaultEntry.baseY);
@@ -63,6 +66,11 @@ export function openElevatorDoorState(state) {
63
66
  }
64
67
  export function requestElevatorLevel(elevatorId, levelId) {
65
68
  const nodes = useScene.getState().nodes;
69
+ const node = nodes[elevatorId];
70
+ if (node?.type !== 'elevator' || node.disabledLevelIds.includes(levelId))
71
+ return;
72
+ if (!resolveElevatorLevels(node, nodes).entries.some((entry) => entry.id === levelId))
73
+ return;
66
74
  const current = ensureElevatorState(elevatorId, nodes);
67
75
  if (!current)
68
76
  return;
@@ -76,25 +84,79 @@ export function openElevatorDoor(elevatorId) {
76
84
  const current = ensureElevatorState(elevatorId, nodes);
77
85
  if (!current)
78
86
  return;
87
+ const node = nodes[elevatorId];
88
+ if (node?.type !== 'elevator' ||
89
+ !current.currentLevelId ||
90
+ node.disabledLevelIds.includes(current.currentLevelId))
91
+ return;
92
+ if (!resolveElevatorLevels(node, nodes).entries.some((entry) => entry.id === current.currentLevelId))
93
+ return;
79
94
  const next = openElevatorDoorState(current);
80
95
  if (next === current)
81
96
  return;
82
97
  useInteractive.getState().setElevatorState(elevatorId, next);
83
98
  }
84
99
  export function stepElevatorRuntimeState({ defaultEntry, delta, elevator, entries, now, state, }) {
85
- const currentEntry = entries.find((entry) => entry.id === state.currentLevelId) ?? defaultEntry;
86
- if (currentEntry.id !== state.currentLevelId) {
87
- return {
100
+ const stationaryEntry = entries.find((entry) => entry.id === state.currentLevelId);
101
+ if (state.phase === 'idle' &&
102
+ !state.queue.length &&
103
+ !state.requestedStops.length &&
104
+ !state.targetLevelId &&
105
+ state.doorOpen === 0 &&
106
+ stationaryEntry?.baseY === state.carY &&
107
+ !elevator.disabledLevelIds.includes(stationaryEntry.id))
108
+ return state;
109
+ const available = entries.filter((entry) => !elevator.disabledLevelIds.includes(entry.id));
110
+ const nearestAvailable = () => available.reduce((nearest, entry) => !nearest || Math.abs(entry.baseY - state.carY) < Math.abs(nearest.baseY - state.carY)
111
+ ? entry
112
+ : nearest, null);
113
+ const fallback = available.find((entry) => entry.id === defaultEntry.id) ?? available[0] ?? defaultEntry;
114
+ const currentEntry = entries.find((entry) => entry.id === state.currentLevelId);
115
+ if (!currentEntry) {
116
+ return createElevatorInteractiveState(fallback.id, fallback.baseY);
117
+ }
118
+ const canServe = (id) => available.some((entry) => entry.id === id);
119
+ const queue = state.queue.filter(canServe);
120
+ const requestedStops = state.requestedStops.filter(canServe);
121
+ if (queue.length !== state.queue.length ||
122
+ requestedStops.length !== state.requestedStops.length) {
123
+ state = { ...state, queue, requestedStops };
124
+ }
125
+ if (state.targetLevelId && !canServe(state.targetLevelId)) {
126
+ const destination = state.phase === 'moving' ? nearestAvailable() : null;
127
+ state = {
88
128
  ...state,
89
- currentLevelId: currentEntry.id,
90
- carY: currentEntry.baseY,
91
- targetLevelId: null,
92
- phase: 'idle',
93
- phaseStartedAt: null,
94
- queue: [],
95
- requestedStops: [],
96
- doorOpen: 0,
129
+ targetLevelId: destination?.id ?? null,
130
+ ...(destination
131
+ ? {
132
+ queue: [
133
+ destination.id,
134
+ ...state.queue.filter((id) => id !== destination.id),
135
+ ],
136
+ }
137
+ : {}),
97
138
  };
139
+ if (state.phase === 'moving' && !destination) {
140
+ return {
141
+ ...createElevatorInteractiveState(currentEntry.id, currentEntry.baseY),
142
+ doorOpen: 0,
143
+ };
144
+ }
145
+ }
146
+ if (state.phase !== 'moving' && Math.abs(state.carY - currentEntry.baseY) > EPSILON) {
147
+ state = { ...state, carY: currentEntry.baseY };
148
+ }
149
+ if (elevator.disabledLevelIds.includes(currentEntry.id) &&
150
+ (state.phase === 'open' || state.phase === 'opening')) {
151
+ state = { ...state, phase: 'closing', phaseStartedAt: now };
152
+ }
153
+ if (elevator.disabledLevelIds.includes(currentEntry.id) &&
154
+ state.phase !== 'moving' &&
155
+ !state.targetLevelId &&
156
+ !state.queue.length) {
157
+ const destination = nearestAvailable();
158
+ if (destination)
159
+ state = { ...state, queue: [destination.id] };
98
160
  }
99
161
  const targetEntry = state.targetLevelId
100
162
  ? entries.find((entry) => entry.id === state.targetLevelId)
@@ -187,6 +249,17 @@ export function stepElevatorRuntimeState({ defaultEntry, delta, elevator, entrie
187
249
  }
188
250
  }
189
251
  }
252
+ const runtimeConfigurations = new WeakMap();
253
+ function elevatorConfigurations(nodes) {
254
+ let configurations = runtimeConfigurations.get(nodes);
255
+ if (!configurations) {
256
+ configurations = Object.values(nodes)
257
+ .filter((node) => node.type === 'elevator')
258
+ .map((node) => ({ node, levels: resolveElevatorLevels(node, nodes) }));
259
+ runtimeConfigurations.set(nodes, configurations);
260
+ }
261
+ return configurations;
262
+ }
190
263
  export function stepElevatorRuntimes(now, delta) {
191
264
  const nodes = useScene.getState().nodes;
192
265
  const interactive = useInteractive.getState();
@@ -196,18 +269,22 @@ export function stepElevatorRuntimes(now, delta) {
196
269
  interactive.removeElevator(typedElevatorId);
197
270
  }
198
271
  }
199
- for (const node of Object.values(nodes)) {
200
- if (node.type !== 'elevator')
201
- continue;
272
+ for (const { node, levels } of elevatorConfigurations(nodes)) {
202
273
  const elevatorId = node.id;
203
- const { entries, defaultEntry } = resolveElevatorLevels(node, nodes);
204
- if (!defaultEntry)
274
+ const { entries, defaultEntry } = levels;
275
+ if (!defaultEntry) {
276
+ if (useInteractive.getState().elevators[elevatorId])
277
+ interactive.removeElevator(elevatorId);
205
278
  continue;
279
+ }
206
280
  const state = useInteractive.getState().elevators[elevatorId];
207
281
  if (!state) {
282
+ const initialEntry = entries.find((entry) => entry.id === defaultEntry.id && !node.disabledLevelIds.includes(entry.id)) ??
283
+ entries.find((entry) => !node.disabledLevelIds.includes(entry.id)) ??
284
+ defaultEntry;
208
285
  useInteractive
209
286
  .getState()
210
- .initElevator(elevatorId, defaultEntry.id, defaultEntry.baseY);
287
+ .initElevator(elevatorId, initialEntry.id, initialEntry.baseY);
211
288
  continue;
212
289
  }
213
290
  const next = stepElevatorRuntimeState({
@@ -1 +1 @@
1
- {"version":3,"file":"elevator-service.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAkCD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,EAAE,CAEb;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,CAEV;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,EAAE,CAsBb;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B;IACD,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB,CA6CA"}
1
+ {"version":3,"file":"elevator-service.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAI/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAkCD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,EAAE,CAEb;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,CAEV;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,EAAE,CAsBb;AAyED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;aAnEjF,kBAAkB,EAAE;kBACf,kBAAkB,GAAG,IAAI;gBAC3B,MAAM;eACP,MAAM;iBACJ,MAAM;EA2EpB"}
@@ -1,4 +1,5 @@
1
1
  import { getLevelElevations } from '../../services/storey.js';
2
+ import { resolveElevatorDimensions } from './elevator-geometry.js';
2
3
  function getBuildingLevels(elevator, nodes) {
3
4
  const parent = elevator.parentId ? nodes[elevator.parentId] : undefined;
4
5
  // Older saves attach elevators to a level. Opening queries must agree before
@@ -54,7 +55,11 @@ export function resolveElevatorServiceLevels(elevator, nodes) {
54
55
  const maxIndex = Math.max(fromIndex, resolvedToIndex);
55
56
  return levels.slice(minIndex, maxIndex + 1);
56
57
  }
57
- export function resolveElevatorLevels(elevator, nodes) {
58
+ function computeElevatorLevels(elevator, nodes) {
59
+ const dimensions = resolveElevatorDimensions(elevator);
60
+ const cabHeight = dimensions.cabHeight;
61
+ // Keep the cab below the cap even when a thick shaft wall also makes a thick cap.
62
+ const topClearance = Math.max(0.3, dimensions.shaftWallThickness + 0.01);
58
63
  const allLevels = resolveElevatorBuildingLevels(elevator, nodes);
59
64
  const levelElevations = getLevelElevations(nodes);
60
65
  const serviceLevels = resolveElevatorServiceLevels(elevator, nodes);
@@ -84,16 +89,31 @@ export function resolveElevatorLevels(elevator, nodes) {
84
89
  continue;
85
90
  stackTopY = Math.max(stackTopY, elevation.baseY + elevation.height);
86
91
  }
87
- const shaftTopY = nextLevel
92
+ const configuredTopY = nextLevel
88
93
  ? (levelElevations.get(nextLevel.id)?.baseY ?? stackTopY)
89
94
  : lastServedLevel
90
95
  ? stackTopY
91
- : elevator.cabHeight + 0.3;
96
+ : cabHeight + topClearance;
97
+ const shaftTopY = Math.max(configuredTopY, shaftBaseY + cabHeight + topClearance, ...entries.map((entry) => entry.baseY + cabHeight + topClearance));
92
98
  return {
93
99
  entries,
94
100
  defaultEntry,
95
101
  shaftBaseY,
96
102
  shaftTopY,
97
- totalHeight: Math.max(shaftTopY - shaftBaseY, elevator.cabHeight + 0.3),
103
+ totalHeight: Math.max(shaftTopY - shaftBaseY, cabHeight + topClearance),
98
104
  };
99
105
  }
106
+ const levelCache = new WeakMap();
107
+ export function resolveElevatorLevels(elevator, nodes) {
108
+ let cache = levelCache.get(nodes);
109
+ if (!cache) {
110
+ cache = new WeakMap();
111
+ levelCache.set(nodes, cache);
112
+ }
113
+ let resolved = cache.get(elevator);
114
+ if (!resolved) {
115
+ resolved = computeElevatorLevels(elevator, nodes);
116
+ cache.set(elevator, resolved);
117
+ }
118
+ return resolved;
119
+ }
@@ -3,10 +3,14 @@ export declare function resolveRoofWallTopElevation(targetLevelId: LevelNode['id
3
3
  export declare function resolveRoofElevation(roof: RoofNode, nodes: Readonly<Record<string, AnyNode>>): number;
4
4
  /**
5
5
  * The tallest top of `levelId`'s walls a roof stands on, from the floor of the level holding the
6
- * roof (m); null when it stands on none of them, or has no segments to stand with.
6
+ * roof (m); null when it stands on none of them, or has neither segments nor faces to stand with.
7
7
  */
8
8
  export declare function roofWallTop(roof: RoofNode, nodes: Readonly<Record<string, AnyNode>>, levelId: string): number | null;
9
- /** Kinds whose change can move a wall-supported roof. */
9
+ /**
10
+ * Nodes whose change can move a wall-supported roof: the roof, what it is made of (its segments and
11
+ * its faces, `capabilities.roofs`, whose footprints find its walls) and what it stands on. The one
12
+ * test the live sync and `reconcileDocument` both go by.
13
+ */
10
14
  export declare function isRoofElevationInput(node: AnyNode | undefined): boolean;
11
15
  /** Wall-supported roofs whose stored Y no longer sits on their walls, and where it should. */
12
16
  export declare function planRoofElevationUpdates(nodes: Readonly<Record<string, AnyNode>>, only?: ReadonlySet<string> | null): Array<{
@@ -15,10 +19,11 @@ export declare function planRoofElevationUpdates(nodes: Readonly<Record<string,
15
19
  }>;
16
20
  /**
17
21
  * The roofs an edit can move, from the nodes it changed. A roof rests on the walls of its own level
18
- * or the level below, so: a changed roof (or segment); for a changed wall, the roofs on its level
19
- * and the level above; for a changed slab, the levels whose walls it touches (its own, which it
20
- * carries, and the one below, whose plane-bound tops it caps) and every level above it in its
21
- * building (a base plate lifts them). Null, for every roof, when a level, building or site changed.
22
+ * or the level below, so: a changed roof (or segment, or face); for a changed wall, the roofs on
23
+ * its level and the level above; for a changed slab, the levels whose walls it touches (its own,
24
+ * which it carries, and the one below, whose plane-bound tops it caps) and every level above it in
25
+ * its building (a base plate lifts them). Null, for every roof, when a level, building or site
26
+ * changed.
22
27
  */
23
28
  export declare function roofsAffectedBy(before: Readonly<Record<string, AnyNode>>, after: Readonly<Record<string, AnyNode>>, changedIds: Iterable<string>): Set<string> | null;
24
29
  //# sourceMappingURL=roof-elevation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roof-elevation.d.ts","sourceRoot":"","sources":["../../../src/systems/roof/roof-elevation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EAER,QAAQ,EACT,MAAM,cAAc,CAAA;AAarB,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,UAAU,8CAA4B,GACrC,MAAM,CAMR;AAwFD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,CAiCR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAQf;AAID,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CASvE;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAChC,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAYlD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAkCpB"}
1
+ {"version":3,"file":"roof-elevation.d.ts","sourceRoot":"","sources":["../../../src/systems/roof/roof-elevation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EAER,QAAQ,EACT,MAAM,cAAc,CAAA;AAarB,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,EAC9B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,UAAU,8CAA4B,GACrC,MAAM,CAUR;AA2FD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,CAiCR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAQf;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAWvE;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAChC,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAYlD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAuCpB"}
@@ -1,5 +1,6 @@
1
1
  import { findLevelAncestorId, resolveLevelId } from '../../lib/node-ancestry.js';
2
2
  import { wallSupportForNodes } from '../../lib/opening-floor-datum.js';
3
+ import { roofFaceOf, roofFaceShapes } from '../../registry/roofs.js';
3
4
  import { queryNodes } from '../../runtime/node-queries.js';
4
5
  import { isRailingWall } from '../../schema/nodes/railing-wall.js';
5
6
  import { coveredStoreyId, servesAsRoofLevel } from '../../services/roof-level.js';
@@ -12,18 +13,21 @@ export function resolveRoofWallTopElevation(targetLevelId, wall, nodes, elevatio
12
13
  const sourceLevelY = elevations.get(sourceLevelId)?.baseY ?? 0;
13
14
  const targetLevelY = elevations.get(targetLevelId)?.baseY ?? 0;
14
15
  const support = wallSupportForNodes(wall, nodes);
15
- return sourceLevelY + getWallTop(wall, sourceLevelId, nodes, support.elevation) - targetLevelY;
16
+ const top = Math.max(getWallTop(wall, sourceLevelId, nodes, support.elevation, 0), getWallTop(wall, sourceLevelId, nodes, support.elevation, 1));
17
+ return sourceLevelY + top - targetLevelY;
16
18
  }
17
19
  /**
18
- * The walls among `wallIds` a roof stands on: those under its segments' footprints, closed room or
19
- * not (a room missing a wall, an L-shaped room whose centre falls outside, or a redrawn enclosure
20
- * all still hold the roof up); a cone's, its round wall. Null for a roof with no segments yet.
20
+ * The walls among `wallIds` a roof stands on: those under its segments' footprints and its faces'
21
+ * outlines (`capabilities.roofs`), closed room or not (a room missing a wall, an L-shaped room whose
22
+ * centre falls outside, or a redrawn enclosure all still hold the roof up); a cone's, its round
23
+ * wall. Null for a roof with neither segments nor faces yet.
21
24
  */
22
25
  function wallsUnderRoof(roof, nodes, wallIds) {
23
26
  const segments = roof.children
24
27
  .map((id) => nodes[id])
25
28
  .filter((node) => node?.type === 'roof-segment');
26
- if (segments.length === 0)
29
+ const faces = roofFaceShapes(roof, nodes).map((face) => face.outline);
30
+ if (segments.length === 0 && faces.length === 0)
27
31
  return null;
28
32
  const cos = Math.cos(roof.rotation);
29
33
  const sin = Math.sin(roof.rotation);
@@ -61,6 +65,7 @@ function wallsUnderRoof(roof, nodes, wallIds) {
61
65
  ];
62
66
  return corners.map(([x, z]) => toLevel(segment.position[0] + x * c + z * s, segment.position[2] - x * s + z * c));
63
67
  });
68
+ footprints.push(...faces);
64
69
  return wallIds.filter((id) => {
65
70
  const wall = nodes[id];
66
71
  return (wall?.type === 'wall' &&
@@ -116,7 +121,7 @@ export function resolveRoofElevation(roof, nodes) {
116
121
  }
117
122
  /**
118
123
  * The tallest top of `levelId`'s walls a roof stands on, from the floor of the level holding the
119
- * roof (m); null when it stands on none of them, or has no segments to stand with.
124
+ * roof (m); null when it stands on none of them, or has neither segments nor faces to stand with.
120
125
  */
121
126
  export function roofWallTop(roof, nodes, levelId) {
122
127
  const level = nodes[levelId];
@@ -128,9 +133,15 @@ export function roofWallTop(roof, nodes, levelId) {
128
133
  return (highestWallTop(resolveLevelId(roof, nodes), wallIds, nodes, getLevelElevations(nodes)) ?? null);
129
134
  }
130
135
  const ROOF_ELEVATION_EPSILON = 1e-4;
131
- /** Kinds whose change can move a wall-supported roof. */
136
+ /**
137
+ * Nodes whose change can move a wall-supported roof: the roof, what it is made of (its segments and
138
+ * its faces, `capabilities.roofs`, whose footprints find its walls) and what it stands on. The one
139
+ * test the live sync and `reconcileDocument` both go by.
140
+ */
132
141
  export function isRoofElevationInput(node) {
133
142
  return (node?.type === 'roof' ||
143
+ node?.type === 'roof-segment' ||
144
+ roofFaceOf(node) !== undefined ||
134
145
  node?.type === 'wall' ||
135
146
  node?.type === 'slab' ||
136
147
  node?.type === 'level' ||
@@ -155,10 +166,11 @@ export function planRoofElevationUpdates(nodes, only) {
155
166
  }
156
167
  /**
157
168
  * The roofs an edit can move, from the nodes it changed. A roof rests on the walls of its own level
158
- * or the level below, so: a changed roof (or segment); for a changed wall, the roofs on its level
159
- * and the level above; for a changed slab, the levels whose walls it touches (its own, which it
160
- * carries, and the one below, whose plane-bound tops it caps) and every level above it in its
161
- * building (a base plate lifts them). Null, for every roof, when a level, building or site changed.
169
+ * or the level below, so: a changed roof (or segment, or face); for a changed wall, the roofs on
170
+ * its level and the level above; for a changed slab, the levels whose walls it touches (its own,
171
+ * which it carries, and the one below, whose plane-bound tops it caps) and every level above it in
172
+ * its building (a base plate lifts them). Null, for every roof, when a level, building or site
173
+ * changed.
162
174
  */
163
175
  export function roofsAffectedBy(before, after, changedIds) {
164
176
  const roofs = new Set();
@@ -172,7 +184,9 @@ export function roofsAffectedBy(before, after, changedIds) {
172
184
  return null;
173
185
  if (node.type === 'roof')
174
186
  roofs.add(id);
175
- else if (node.type === 'roof-segment' && node.parentId)
187
+ else if (node.parentId &&
188
+ (node.type === 'roof-segment' ||
189
+ (roofFaceOf(node) && nodes[node.parentId]?.type === 'roof')))
176
190
  roofs.add(node.parentId);
177
191
  else if (node.type === 'wall' || node.type === 'slab') {
178
192
  const levelId = findLevelAncestorId(id, nodes);