@faicad/faijs 0.16.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/LICENSE +4 -5
  2. package/NOTICE +5 -6
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +20 -2
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assembly/entities.d.ts +1 -1
  7. package/dist/api/assembly/entities.d.ts.map +1 -1
  8. package/dist/api/assembly/entities.js.map +1 -1
  9. package/dist/api/assembly/joints.d.ts +2 -2
  10. package/dist/api/assembly/joints.d.ts.map +1 -1
  11. package/dist/api/assembly/joints.js +2 -2
  12. package/dist/api/assembly/joints.js.map +1 -1
  13. package/dist/api/assembly/lower.d.ts +1 -1
  14. package/dist/api/assembly/lower.d.ts.map +1 -1
  15. package/dist/api/assembly/lower.js.map +1 -1
  16. package/dist/api/assembly/pose.d.ts +3 -3
  17. package/dist/api/assembly/pose.d.ts.map +1 -1
  18. package/dist/api/assembly/pose.js +1 -1
  19. package/dist/api/assembly/pose.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.d.ts.map +1 -1
  22. package/dist/api/assembly/preview.js +1 -1
  23. package/dist/api/assembly/preview.js.map +1 -1
  24. package/dist/api/assembly/solve.d.ts.map +1 -1
  25. package/dist/api/assembly/solve.js +3 -3
  26. package/dist/api/assembly/solve.js.map +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
  28. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
  29. package/dist/api/assembly/solvers/assembly-tree.js +130 -0
  30. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
  31. package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
  32. package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
  33. package/dist/api/assembly/solvers/chain-solver.js +330 -0
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
  35. package/dist/api/assembly/solvers/global-solver.js +2 -2
  36. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  37. package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
  38. package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
  39. package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
  41. package/dist/api/assembly/solvers/quat.d.ts +35 -0
  42. package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
  43. package/dist/api/assembly/solvers/quat.js +84 -0
  44. package/dist/api/assembly/solvers/quat.js.map +1 -0
  45. package/dist/api/assembly/solvers/types.d.ts +33 -0
  46. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean.d.ts.map +1 -1
  49. package/dist/api/boolean.js +66 -29
  50. package/dist/api/boolean.js.map +1 -1
  51. package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
  52. package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
  53. package/dist/api/brep-mirror/booleanFns.js +104 -0
  54. package/dist/api/brep-mirror/booleanFns.js.map +1 -0
  55. package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
  56. package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
  57. package/dist/api/brep-mirror/brepHelpers.js +131 -0
  58. package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
  59. package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
  60. package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
  61. package/dist/api/brep-mirror/compoundFns.js +300 -0
  62. package/dist/api/brep-mirror/compoundFns.js.map +1 -0
  63. package/dist/api/brep-mirror/healingFns.d.ts +78 -0
  64. package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
  65. package/dist/api/brep-mirror/healingFns.js +294 -0
  66. package/dist/api/brep-mirror/healingFns.js.map +1 -0
  67. package/dist/api/brep-mirror/hullFns.d.ts +20 -0
  68. package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
  69. package/dist/api/brep-mirror/hullFns.js +46 -0
  70. package/dist/api/brep-mirror/hullFns.js.map +1 -0
  71. package/dist/api/brep-mirror/patternFns.d.ts +43 -0
  72. package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
  73. package/dist/api/brep-mirror/patternFns.js +178 -0
  74. package/dist/api/brep-mirror/patternFns.js.map +1 -0
  75. package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
  76. package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
  77. package/dist/api/brep-mirror/primitiveFns.js +104 -0
  78. package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
  79. package/dist/api/brep-mirror/roofFns.d.ts +24 -0
  80. package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
  81. package/dist/api/brep-mirror/roofFns.js +229 -0
  82. package/dist/api/brep-mirror/roofFns.js.map +1 -0
  83. package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
  84. package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
  85. package/dist/api/brep-mirror/straightSkeleton.js +443 -0
  86. package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
  87. package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
  88. package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
  89. package/dist/api/brep-mirror/sweepFns.js +200 -0
  90. package/dist/api/brep-mirror/sweepFns.js.map +1 -0
  91. package/dist/api/brep-mirror/threadFns.d.ts +15 -0
  92. package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
  93. package/dist/api/brep-mirror/threadFns.js +37 -2
  94. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  95. package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
  96. package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
  97. package/dist/api/brep-mirror/topologyFns.js +276 -0
  98. package/dist/api/brep-mirror/topologyFns.js.map +1 -0
  99. package/dist/api/brep-topology.d.ts +190 -0
  100. package/dist/api/brep-topology.d.ts.map +1 -0
  101. package/dist/api/brep-topology.js +337 -0
  102. package/dist/api/brep-topology.js.map +1 -0
  103. package/dist/api/brepjs-compat/constants.d.ts +11 -0
  104. package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
  105. package/dist/api/brepjs-compat/constants.js +11 -0
  106. package/dist/api/brepjs-compat/constants.js.map +1 -0
  107. package/dist/api/brepjs-compat/index.d.ts +19 -232
  108. package/dist/api/brepjs-compat/index.d.ts.map +1 -1
  109. package/dist/api/brepjs-compat/index.js +19 -286
  110. package/dist/api/brepjs-compat/index.js.map +1 -1
  111. package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
  112. package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
  113. package/dist/api/brepjs-compat/planeOps.js +170 -0
  114. package/dist/api/brepjs-compat/planeOps.js.map +1 -0
  115. package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
  116. package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
  117. package/dist/api/brepjs-compat/planeTypes.js +8 -0
  118. package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
  119. package/dist/api/brepjs-compat/types.d.ts +64 -0
  120. package/dist/api/brepjs-compat/types.d.ts.map +1 -0
  121. package/dist/api/brepjs-compat/types.js +48 -0
  122. package/dist/api/brepjs-compat/types.js.map +1 -0
  123. package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
  124. package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
  125. package/dist/api/brepjs-compat/vecOps.js +202 -0
  126. package/dist/api/brepjs-compat/vecOps.js.map +1 -0
  127. package/dist/api/chamfer.d.ts +12 -3
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +54 -20
  130. package/dist/api/chamfer.js.map +1 -1
  131. package/dist/api/compound-geom.d.ts.map +1 -1
  132. package/dist/api/compound-geom.js +8 -2
  133. package/dist/api/compound-geom.js.map +1 -1
  134. package/dist/api/draft.d.ts +69 -0
  135. package/dist/api/draft.d.ts.map +1 -0
  136. package/dist/api/draft.js +109 -0
  137. package/dist/api/draft.js.map +1 -0
  138. package/dist/api/edge-ref.d.ts.map +1 -1
  139. package/dist/api/edge-ref.js +2 -2
  140. package/dist/api/edge-ref.js.map +1 -1
  141. package/dist/api/engrave.d.ts.map +1 -1
  142. package/dist/api/engrave.js +2 -3
  143. package/dist/api/engrave.js.map +1 -1
  144. package/dist/api/extrude.d.ts.map +1 -1
  145. package/dist/api/extrude.js +44 -14
  146. package/dist/api/extrude.js.map +1 -1
  147. package/dist/api/face-ref.d.ts.map +1 -1
  148. package/dist/api/face-ref.js +2 -2
  149. package/dist/api/face-ref.js.map +1 -1
  150. package/dist/api/feature-repair.d.ts +137 -0
  151. package/dist/api/feature-repair.d.ts.map +1 -0
  152. package/dist/api/feature-repair.js +221 -0
  153. package/dist/api/feature-repair.js.map +1 -0
  154. package/dist/api/fillet-variable.d.ts +35 -0
  155. package/dist/api/fillet-variable.d.ts.map +1 -0
  156. package/dist/api/fillet-variable.js +71 -0
  157. package/dist/api/fillet-variable.js.map +1 -0
  158. package/dist/api/fillet.d.ts +3 -0
  159. package/dist/api/fillet.d.ts.map +1 -1
  160. package/dist/api/fillet.js +7 -4
  161. package/dist/api/fillet.js.map +1 -1
  162. package/dist/api/generated/2d.d.ts +1 -13
  163. package/dist/api/generated/2d.d.ts.map +1 -1
  164. package/dist/api/generated/2d.js +6 -1
  165. package/dist/api/generated/2d.js.map +1 -1
  166. package/dist/api/generated/brepjs/index.d.ts +298 -298
  167. package/dist/api/generated/brepjs/index.d.ts.map +1 -1
  168. package/dist/api/generated/brepjs/index.js +183 -183
  169. package/dist/api/generated/brepjs/index.js.map +1 -1
  170. package/dist/api/generated/core.d.ts +3 -123
  171. package/dist/api/generated/core.d.ts.map +1 -1
  172. package/dist/api/generated/core.js +2 -81
  173. package/dist/api/generated/core.js.map +1 -1
  174. package/dist/api/generated/gear.d.ts +1 -15
  175. package/dist/api/generated/gear.d.ts.map +1 -1
  176. package/dist/api/generated/gear.js +6 -3
  177. package/dist/api/generated/gear.js.map +1 -1
  178. package/dist/api/generated/io.d.ts +1 -13
  179. package/dist/api/generated/io.d.ts.map +1 -1
  180. package/dist/api/generated/io.js +6 -1
  181. package/dist/api/generated/io.js.map +1 -1
  182. package/dist/api/generated/kernel.d.ts +1 -39
  183. package/dist/api/generated/kernel.d.ts.map +1 -1
  184. package/dist/api/generated/kernel.js +6 -4
  185. package/dist/api/generated/kernel.js.map +1 -1
  186. package/dist/api/generated/measurement.d.ts +53 -97
  187. package/dist/api/generated/measurement.d.ts.map +1 -1
  188. package/dist/api/generated/measurement.js +48 -143
  189. package/dist/api/generated/measurement.js.map +1 -1
  190. package/dist/api/generated/ns.d.ts +1 -10
  191. package/dist/api/generated/ns.d.ts.map +1 -1
  192. package/dist/api/generated/ns.js +2 -10
  193. package/dist/api/generated/ns.js.map +1 -1
  194. package/dist/api/generated/operations.d.ts +65 -110
  195. package/dist/api/generated/operations.d.ts.map +1 -1
  196. package/dist/api/generated/operations.js +132 -80
  197. package/dist/api/generated/operations.js.map +1 -1
  198. package/dist/api/generated/projection.d.ts +1 -8
  199. package/dist/api/generated/projection.d.ts.map +1 -1
  200. package/dist/api/generated/projection.js +6 -4
  201. package/dist/api/generated/projection.js.map +1 -1
  202. package/dist/api/generated/query.d.ts +1 -9
  203. package/dist/api/generated/query.d.ts.map +1 -1
  204. package/dist/api/generated/query.js +6 -1
  205. package/dist/api/generated/query.js.map +1 -1
  206. package/dist/api/generated/script-face-manifest.d.ts +2 -0
  207. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  208. package/dist/api/generated/script-face-manifest.js +22 -10
  209. package/dist/api/generated/script-face-manifest.js.map +1 -1
  210. package/dist/api/generated/script-face.d.ts +52 -27
  211. package/dist/api/generated/script-face.d.ts.map +1 -1
  212. package/dist/api/generated/script-face.js +18 -4
  213. package/dist/api/generated/script-face.js.map +1 -1
  214. package/dist/api/generated/sketching.d.ts +4 -7
  215. package/dist/api/generated/sketching.d.ts.map +1 -1
  216. package/dist/api/generated/sketching.js +10 -8
  217. package/dist/api/generated/sketching.js.map +1 -1
  218. package/dist/api/generated/text.d.ts +1 -6
  219. package/dist/api/generated/text.d.ts.map +1 -1
  220. package/dist/api/generated/text.js +6 -3
  221. package/dist/api/generated/text.js.map +1 -1
  222. package/dist/api/generated/topology.d.ts +77 -175
  223. package/dist/api/generated/topology.d.ts.map +1 -1
  224. package/dist/api/generated/topology.js +172 -131
  225. package/dist/api/generated/topology.js.map +1 -1
  226. package/dist/api/geom.d.ts.map +1 -1
  227. package/dist/api/geom.js +2 -2
  228. package/dist/api/geom.js.map +1 -1
  229. package/dist/api/helix.d.ts +51 -0
  230. package/dist/api/helix.d.ts.map +1 -0
  231. package/dist/api/helix.js +63 -0
  232. package/dist/api/helix.js.map +1 -0
  233. package/dist/api/import-step.d.ts.map +1 -1
  234. package/dist/api/import-step.js +6 -2
  235. package/dist/api/import-step.js.map +1 -1
  236. package/dist/api/index.d.ts +20 -6
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +30 -13
  239. package/dist/api/index.js.map +1 -1
  240. package/dist/api/internal/compat-op.d.ts +10 -0
  241. package/dist/api/internal/compat-op.d.ts.map +1 -1
  242. package/dist/api/internal/compat-op.js +9 -3
  243. package/dist/api/internal/compat-op.js.map +1 -1
  244. package/dist/api/internal/compat-projection.d.ts +4 -4
  245. package/dist/api/internal/compat-projection.js +7 -7
  246. package/dist/api/internal/compat-projection.js.map +1 -1
  247. package/dist/api/internal/l3-bridge.d.ts +75 -42
  248. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  249. package/dist/api/internal/l3-bridge.js +105 -50
  250. package/dist/api/internal/l3-bridge.js.map +1 -1
  251. package/dist/api/internal/profile-wire.d.ts +31 -0
  252. package/dist/api/internal/profile-wire.d.ts.map +1 -0
  253. package/dist/api/internal/profile-wire.js +37 -0
  254. package/dist/api/internal/profile-wire.js.map +1 -0
  255. package/dist/api/internal/replica-role-table.js +2 -2
  256. package/dist/api/internal/replica-role-table.js.map +1 -1
  257. package/dist/api/loft.d.ts +66 -0
  258. package/dist/api/loft.d.ts.map +1 -0
  259. package/dist/api/loft.js +111 -0
  260. package/dist/api/loft.js.map +1 -0
  261. package/dist/api/measurement/index.d.ts +51 -0
  262. package/dist/api/measurement/index.d.ts.map +1 -0
  263. package/dist/api/measurement/index.js +71 -0
  264. package/dist/api/measurement/index.js.map +1 -0
  265. package/dist/api/occt-kernel-bridge.d.ts +5 -8
  266. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  267. package/dist/api/occt-kernel-bridge.js +18 -14
  268. package/dist/api/occt-kernel-bridge.js.map +1 -1
  269. package/dist/api/pattern.d.ts.map +1 -1
  270. package/dist/api/pattern.js +3 -4
  271. package/dist/api/pattern.js.map +1 -1
  272. package/dist/api/place.d.ts.map +1 -1
  273. package/dist/api/place.js +2 -4
  274. package/dist/api/place.js.map +1 -1
  275. package/dist/api/primitives.d.ts.map +1 -1
  276. package/dist/api/primitives.js +3 -4
  277. package/dist/api/primitives.js.map +1 -1
  278. package/dist/api/profile.d.ts +89 -0
  279. package/dist/api/profile.d.ts.map +1 -0
  280. package/dist/api/profile.js +194 -0
  281. package/dist/api/profile.js.map +1 -0
  282. package/dist/api/replicate.d.ts +28 -1
  283. package/dist/api/replicate.d.ts.map +1 -1
  284. package/dist/api/replicate.js +34 -23
  285. package/dist/api/replicate.js.map +1 -1
  286. package/dist/api/result.d.ts +6 -11
  287. package/dist/api/result.d.ts.map +1 -1
  288. package/dist/api/result.js +6 -11
  289. package/dist/api/result.js.map +1 -1
  290. package/dist/api/revolve.d.ts.map +1 -1
  291. package/dist/api/revolve.js +15 -14
  292. package/dist/api/revolve.js.map +1 -1
  293. package/dist/api/screw.d.ts +3 -0
  294. package/dist/api/screw.d.ts.map +1 -1
  295. package/dist/api/screw.js +9 -4
  296. package/dist/api/screw.js.map +1 -1
  297. package/dist/api/sdf.d.ts +1 -1
  298. package/dist/api/section-by-plane.d.ts +42 -0
  299. package/dist/api/section-by-plane.d.ts.map +1 -0
  300. package/dist/api/section-by-plane.js +61 -0
  301. package/dist/api/section-by-plane.js.map +1 -0
  302. package/dist/api/shell.d.ts +45 -0
  303. package/dist/api/shell.d.ts.map +1 -0
  304. package/dist/api/shell.js +73 -0
  305. package/dist/api/shell.js.map +1 -0
  306. package/dist/api/sketch.d.ts +8 -1
  307. package/dist/api/sketch.d.ts.map +1 -1
  308. package/dist/api/sketch.js +12 -7
  309. package/dist/api/sketch.js.map +1 -1
  310. package/dist/api/split-by-plane.d.ts +41 -0
  311. package/dist/api/split-by-plane.d.ts.map +1 -0
  312. package/dist/api/split-by-plane.js +60 -0
  313. package/dist/api/split-by-plane.js.map +1 -0
  314. package/dist/api/split.d.ts +6 -1
  315. package/dist/api/split.d.ts.map +1 -1
  316. package/dist/api/split.js +23 -9
  317. package/dist/api/split.js.map +1 -1
  318. package/dist/api/surface/arg-spec.d.ts +22 -0
  319. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  320. package/dist/api/surface/arg-spec.js +729 -477
  321. package/dist/api/surface/arg-spec.js.map +1 -1
  322. package/dist/api/sweep.d.ts +55 -0
  323. package/dist/api/sweep.d.ts.map +1 -0
  324. package/dist/api/sweep.js +86 -0
  325. package/dist/api/sweep.js.map +1 -0
  326. package/dist/api/thicken.d.ts +36 -0
  327. package/dist/api/thicken.d.ts.map +1 -0
  328. package/dist/api/thicken.js +55 -0
  329. package/dist/api/thicken.js.map +1 -0
  330. package/dist/api/transform.d.ts +8 -0
  331. package/dist/api/transform.d.ts.map +1 -1
  332. package/dist/api/transform.js +15 -4
  333. package/dist/api/transform.js.map +1 -1
  334. package/dist/api/view/cameraFns.d.ts +48 -0
  335. package/dist/api/view/cameraFns.d.ts.map +1 -0
  336. package/dist/api/view/cameraFns.js +75 -0
  337. package/dist/api/view/cameraFns.js.map +1 -0
  338. package/dist/api/view/projectionPlanes.d.ts +25 -0
  339. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  340. package/dist/api/view/projectionPlanes.js +30 -0
  341. package/dist/api/view/projectionPlanes.js.map +1 -0
  342. package/dist/api/view/view-camera.d.ts +2 -2
  343. package/dist/api/view/view-camera.d.ts.map +1 -1
  344. package/dist/api/view/view-camera.js +3 -3
  345. package/dist/api/view/view-camera.js.map +1 -1
  346. package/dist/api/view/view-projection.d.ts +9 -6
  347. package/dist/api/view/view-projection.d.ts.map +1 -1
  348. package/dist/api/view/view-projection.js +132 -65
  349. package/dist/api/view/view-projection.js.map +1 -1
  350. package/dist/api/wire.d.ts +45 -0
  351. package/dist/api/wire.d.ts.map +1 -0
  352. package/dist/api/wire.js +96 -0
  353. package/dist/api/wire.js.map +1 -0
  354. package/dist/boolean/creased-normals.d.ts +50 -0
  355. package/dist/boolean/creased-normals.d.ts.map +1 -0
  356. package/dist/boolean/creased-normals.js +114 -0
  357. package/dist/boolean/creased-normals.js.map +1 -0
  358. package/dist/boolean/deriveNormals.d.ts +4 -1
  359. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  360. package/dist/boolean/deriveNormals.js +5 -2
  361. package/dist/boolean/deriveNormals.js.map +1 -1
  362. package/dist/brep/brep-ops.d.ts +6 -0
  363. package/dist/brep/brep-ops.d.ts.map +1 -1
  364. package/dist/brep/brep-ops.js +11 -2
  365. package/dist/brep/brep-ops.js.map +1 -1
  366. package/dist/brep/brep-topology.d.ts +4 -0
  367. package/dist/brep/brep-topology.d.ts.map +1 -1
  368. package/dist/brep/brep-topology.js +4 -0
  369. package/dist/brep/brep-topology.js.map +1 -1
  370. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  371. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  372. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  373. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/brepkit.js +35 -2
  375. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  376. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  377. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  378. package/dist/brep/engine/adapters/occt.js +64 -167
  379. package/dist/brep/engine/adapters/occt.js.map +1 -1
  380. package/dist/brep/engine/primitives.d.ts +93 -130
  381. package/dist/brep/engine/primitives.d.ts.map +1 -1
  382. package/dist/brep/engine/primitives.js +9 -7
  383. package/dist/brep/engine/primitives.js.map +1 -1
  384. package/dist/brep/engine/types.d.ts +14 -1
  385. package/dist/brep/engine/types.d.ts.map +1 -1
  386. package/dist/brep/engine/types.js +11 -1
  387. package/dist/brep/engine/types.js.map +1 -1
  388. package/dist/brep/export/step.d.ts +3 -0
  389. package/dist/brep/export/step.d.ts.map +1 -1
  390. package/dist/brep/export/step.js +7 -1
  391. package/dist/brep/export/step.js.map +1 -1
  392. package/dist/brep/face-evolution.d.ts +8 -0
  393. package/dist/brep/face-evolution.d.ts.map +1 -1
  394. package/dist/brep/face-evolution.js +15 -3
  395. package/dist/brep/face-evolution.js.map +1 -1
  396. package/dist/brep/handle-bridge.d.ts +20 -2
  397. package/dist/brep/handle-bridge.d.ts.map +1 -1
  398. package/dist/brep/handle-bridge.js +25 -2
  399. package/dist/brep/handle-bridge.js.map +1 -1
  400. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  401. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  402. package/dist/brepkit-kernel/brepkitKernel.js +782 -218
  403. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  404. package/dist/brepkit-kernel/multi-version-test.d.ts +40 -0
  405. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -0
  406. package/dist/brepkit-kernel/multi-version-test.js +89 -0
  407. package/dist/brepkit-kernel/multi-version-test.js.map +1 -0
  408. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  409. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  410. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  411. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  412. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  413. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  414. package/dist/cad-runtime/backend-dispatch.js +32 -2
  415. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  416. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  417. package/dist/cad-runtime/direct-executor.js +8 -2
  418. package/dist/cad-runtime/direct-executor.js.map +1 -1
  419. package/dist/cad-runtime/runtime.d.ts +3 -0
  420. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  421. package/dist/cad-runtime/runtime.js +3 -1
  422. package/dist/cad-runtime/runtime.js.map +1 -1
  423. package/dist/define-op.d.ts +18 -2
  424. package/dist/define-op.d.ts.map +1 -1
  425. package/dist/define-op.js +29 -1
  426. package/dist/define-op.js.map +1 -1
  427. package/dist/env-agnostic.d.ts +3 -0
  428. package/dist/env-agnostic.d.ts.map +1 -1
  429. package/dist/env-agnostic.js +7 -0
  430. package/dist/env-agnostic.js.map +1 -1
  431. package/dist/index.d.ts.map +1 -1
  432. package/dist/index.js +3 -4
  433. package/dist/index.js.map +1 -1
  434. package/dist/lang/symbol-table.generated.d.ts +29 -1
  435. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  436. package/dist/lang/symbol-table.generated.js +30 -2
  437. package/dist/lang/symbol-table.generated.js.map +1 -1
  438. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  439. package/dist/occt-kernel/highLevelApi.js +6 -3
  440. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  441. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  442. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  443. package/dist/occt-kernel/hullGeometry.js +319 -0
  444. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  445. package/dist/occt-kernel/hullOps.d.ts +24 -0
  446. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  447. package/dist/occt-kernel/hullOps.js +52 -0
  448. package/dist/occt-kernel/hullOps.js.map +1 -0
  449. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  450. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  451. package/dist/occt-kernel/occt-primitives.js +351 -0
  452. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  453. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  454. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  455. package/dist/occt-kernel/occtKernel.js +11 -3
  456. package/dist/occt-kernel/occtKernel.js.map +1 -1
  457. package/dist/occt-kernel/topologyExt.js +2 -2
  458. package/dist/occt-kernel/topologyExt.js.map +1 -1
  459. package/dist/primitives/brep-primitives.d.ts +4 -0
  460. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  461. package/dist/primitives/brep-primitives.js +4 -0
  462. package/dist/primitives/brep-primitives.js.map +1 -1
  463. package/dist/result/bug.d.ts +22 -0
  464. package/dist/result/bug.d.ts.map +1 -0
  465. package/dist/result/bug.js +28 -0
  466. package/dist/result/bug.js.map +1 -0
  467. package/dist/result/errors.d.ts +270 -0
  468. package/dist/result/errors.d.ts.map +1 -0
  469. package/dist/result/errors.js +317 -0
  470. package/dist/result/errors.js.map +1 -0
  471. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  472. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  473. package/dist/result/kernelErrorTranslation.js +102 -0
  474. package/dist/result/kernelErrorTranslation.js.map +1 -0
  475. package/dist/result/result.d.ts +213 -0
  476. package/dist/result/result.d.ts.map +1 -0
  477. package/dist/result/result.js +336 -0
  478. package/dist/result/result.js.map +1 -0
  479. package/dist/result/vec3.d.ts +12 -0
  480. package/dist/result/vec3.d.ts.map +1 -0
  481. package/dist/result/vec3.js +14 -0
  482. package/dist/result/vec3.js.map +1 -0
  483. package/dist/runtime-state.d.ts +9 -0
  484. package/dist/runtime-state.d.ts.map +1 -1
  485. package/dist/runtime-state.js.map +1 -1
  486. package/dist/sdk.d.ts +3 -1
  487. package/dist/sdk.d.ts.map +1 -1
  488. package/dist/sdk.js +2 -1
  489. package/dist/sdk.js.map +1 -1
  490. package/dist/shape.d.ts +43 -1
  491. package/dist/shape.d.ts.map +1 -1
  492. package/dist/shape.js +57 -1
  493. package/dist/shape.js.map +1 -1
  494. package/dist/topology/naming/geom-hint.js +1 -1
  495. package/dist/topology/naming/geom-hint.js.map +1 -1
  496. package/dist/topology/naming/score.js +1 -1
  497. package/dist/topology/naming/score.js.map +1 -1
  498. package/package.json +6 -16
@@ -1 +1 @@
1
- {"version":3,"file":"topologyExt.js","sourceRoot":"","sources":["../../src/occt-kernel/topologyExt.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BrepHandle, BrepMeshResult, BrepBoundingBox, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asEdgeId, asFaceId, asOccurrenceId, asShapeId } from '../identity'\n\n/**\n * Safe getBoundingBox wrapper: tries useTriangulation=false first,\n * falls back to true, then finally computes from mesh positions.\n * This handles compound shapes from boolean operations where OCCT's\n * getBoundingBox may fail in the browser WASM environment.\n */\nfunction tryGetBoundingBox(\n kernel: { getBoundingBox(s: BrepHandle, t: boolean): BrepBoundingBox },\n shape: BrepHandle,\n meshPositions?: Float32Array,\n): BrepBoundingBox {\n try {\n return kernel.getBoundingBox(shape, false)\n } catch {\n // try with triangulation\n }\n try {\n return kernel.getBoundingBox(shape, true)\n } catch {\n // fall through to mesh-based computation\n }\n // Final fallback: compute bbox from mesh vertex positions\n if (meshPositions && meshPositions.length >= 3) {\n let xmin = Infinity, ymin = Infinity, zmin = Infinity\n let xmax = -Infinity, ymax = -Infinity, zmax = -Infinity\n for (let i = 0; i < meshPositions.length; i += 3) {\n const x = meshPositions[i], y = meshPositions[i + 1], z = meshPositions[i + 2]\n if (x < xmin) xmin = x\n if (y < ymin) ymin = y\n if (z < zmin) zmin = z\n if (x > xmax) xmax = x\n if (y > ymax) ymax = y\n if (z > zmax) zmax = z\n }\n return { xmin, ymin, zmin, xmax, ymax, zmax }\n }\n // Last resort: return a default bbox\n return { xmin: -100, ymin: -100, zmin: -100, xmax: 100, ymax: 100, zmax: 100 }\n}\n\n// Topology data stays in mm — the viewer's buildSelectorRuntime is called\n// with scale:1 (scene base unit is mm), so no conversion needed.\n\n// OCCT's TopTools_ShapeMapHasher returns a hash that the C++ facade\n// reduces modulo 2147483647 (INT32_MAX). All kernel-generated hashes\n// (faceGroups, edgeGroups, edgeToFaceMap) use this same bound, so we\n// must pass 2147483647 to hashCode() for the hashes to match.\nconst HASH_BOUND = 2147483647\n// Python SelectorOptions(digits=6) — 所有浮点值输出前舍入到 6 位小数\nconst ROUND_DIGITS = 6\n\nconst OCCURRENCE_COLUMNS = [\n 'id', 'path', 'name', 'sourceName', 'parentId', 'transform',\n 'bbox', 'shapeStart', 'shapeCount', 'faceStart', 'faceCount',\n 'edgeStart', 'edgeCount',\n]\n\nconst SHAPE_COLUMNS = [\n 'id', 'occurrenceId', 'ordinal', 'kind', 'bbox', 'center',\n 'area', 'volume', 'faceStart', 'faceCount', 'edgeStart', 'edgeCount',\n]\n\nconst FACE_COLUMNS = [\n 'id', 'occurrenceId', 'shapeId', 'ordinal', 'surfaceType',\n 'area', 'center', 'normal', 'bbox', 'edgeStart', 'edgeCount',\n 'relevance', 'flags', 'params', 'triangleStart', 'triangleCount',\n]\n\nconst EDGE_COLUMNS = [\n 'id', 'occurrenceId', 'shapeId', 'ordinal', 'curveType',\n 'length', 'center', 'bbox', 'faceStart', 'faceCount',\n 'relevance', 'flags', 'params', 'segmentStart', 'segmentCount',\n]\n\nconst IDENTITY_16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]\n\ninterface SelectorManifestOptions {\n stepHash?: string\n cadPath?: string\n}\n\ninterface BBox {\n min: number[]\n max: number[]\n}\n\n/** Input for building a per-part selector manifest. */\nexport interface SelectorManifestInput {\n shapeHandle: BrepHandle\n meshWithGroups: BrepMeshResult\n}\n\nfunction bboxFromOcc(bb: BrepBoundingBox): BBox {\n return { min: [bb.xmin, bb.ymin, bb.zmin], max: [bb.xmax, bb.ymax, bb.zmax] }\n}\n\nfunction bboxCenter(bbox: BBox): number[] {\n return [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n}\n\nfunction bboxArray(bbox: BBox): Record<string, number[]> {\n return { min: roundPoint(bbox.min), max: roundPoint(bbox.max) }\n}\n\nfunction vec3ToArray(v: BrepVec3): number[] {\n return [v.x, v.y, v.z]\n}\n\n// ── Rounding helpers (match Python _round_value / _round_point with digits=6) ──\nfunction roundVal(v: number, digits: number = ROUND_DIGITS): number {\n if (!Number.isFinite(v)) return v\n const p = Math.pow(10, digits)\n return Math.round(v * p) / p\n}\n\nfunction roundPoint(p: number[], digits: number = ROUND_DIGITS): number[] {\n return [roundVal(p[0], digits), roundVal(p[1], digits), roundVal(p[2], digits)]\n}\n\nfunction mergeBboxes(bboxes: BBox[]): BBox {\n const min = [Infinity, Infinity, Infinity]\n const max = [-Infinity, -Infinity, -Infinity]\n for (const b of bboxes) {\n if (b.min[0] < min[0]) min[0] = b.min[0]\n if (b.min[1] < min[1]) min[1] = b.min[1]\n if (b.min[2] < min[2]) min[2] = b.min[2]\n if (b.max[0] > max[0]) max[0] = b.max[0]\n if (b.max[1] > max[1]) max[1] = b.max[1]\n if (b.max[2] > max[2]) max[2] = b.max[2]\n }\n return { min, max }\n}\n\n// ── BBox with center/size/diag (matches Python _bbox_from_points) ──\ninterface FullBBox {\n min: number[]\n max: number[]\n center: number[]\n size: number[]\n diag: number\n}\n\nfunction fullBBoxFromPoints(points: number[][]): FullBBox {\n if (points.length === 0) {\n return { min: [0, 0, 0], max: [0, 0, 0], center: [0, 0, 0], size: [0, 0, 0], diag: 0 }\n }\n let minX = points[0][0], maxX = points[0][0]\n let minY = points[0][1], maxY = points[0][1]\n let minZ = points[0][2], maxZ = points[0][2]\n for (let i = 1; i < points.length; i++) {\n const p = points[i]\n if (p[0] < minX) minX = p[0]\n if (p[0] > maxX) maxX = p[0]\n if (p[1] < minY) minY = p[1]\n if (p[1] > maxY) maxY = p[1]\n if (p[2] < minZ) minZ = p[2]\n if (p[2] > maxZ) maxZ = p[2]\n }\n const sizeX = maxX - minX\n const sizeY = maxY - minY\n const sizeZ = maxZ - minZ\n return {\n min: [minX, minY, minZ],\n max: [maxX, maxY, maxZ],\n center: [minX + sizeX * 0.5, minY + sizeY * 0.5, minZ + sizeZ * 0.5],\n size: [sizeX, sizeY, sizeZ],\n diag: Math.sqrt(sizeX * sizeX + sizeY * sizeY + sizeZ * sizeZ),\n }\n}\n\n// ── Cross product of AB x AC ──\nfunction cross(a: number[], b: number[], c: number[]): [number, number, number] {\n const abx = b[0] - a[0]\n const aby = b[1] - a[1]\n const abz = b[2] - a[2]\n const acx = c[0] - a[0]\n const acy = c[1] - a[1]\n const acz = c[2] - a[2]\n return [\n aby * acz - abz * acy,\n abz * acx - abx * acz,\n abx * acy - aby * acx,\n ]\n}\n\nfunction normalize(v: number[]): number[] | null {\n const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])\n if (len <= 1e-12) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\nfunction distance(a: number[], b: number[]): number {\n const dx = a[0] - b[0]\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n return Math.sqrt(dx * dx + dy * dy + dz * dz)\n}\n\n// ── Polyline helpers (matches Python _dedupe_consecutive, _decimate_polyline, _polyline_length, _polyline_center) ──\n\nfunction dedupeConsecutive(points: number[][], tolerance: number): number[][] {\n if (points.length === 0) return points\n const deduped = [points[0]]\n for (let i = 1; i < points.length; i++) {\n if (distance(deduped[deduped.length - 1], points[i]) > tolerance) {\n deduped.push(points[i])\n }\n }\n return deduped\n}\n\nfunction decimatePolyline(points: number[][], maxPoints: number): number[][] {\n if (maxPoints <= 1 || points.length <= maxPoints) return points\n const stride = (points.length - 1) / (maxPoints - 1)\n const result: number[][] = []\n let lastIndex = -1\n for (let i = 0; i < maxPoints; i++) {\n let index = Math.round(i * stride)\n if (index >= points.length) index = points.length - 1\n if (index !== lastIndex) {\n result.push(points[index])\n lastIndex = index\n }\n }\n if (result.length > 0 && result[result.length - 1] !== points[points.length - 1]) {\n result[result.length - 1] = points[points.length - 1]\n }\n return result\n}\n\nfunction polylineLength(points: number[][], closed: boolean): number {\n if (points.length < 2) return 0\n let total = 0\n for (let i = 0; i < points.length - 1; i++) {\n total += distance(points[i], points[i + 1])\n }\n if (closed && distance(points[0], points[points.length - 1]) > 1e-9) {\n total += distance(points[points.length - 1], points[0])\n }\n return total\n}\n\nfunction polylineCenter(points: number[][]): number[] {\n if (points.length === 0) return [0, 0, 0]\n let tx = 0, ty = 0, tz = 0\n for (const p of points) {\n tx += p[0]\n ty += p[1]\n tz += p[2]\n }\n const inv = 1 / points.length\n return [tx * inv, ty * inv, tz * inv]\n}\n\n// ── Edge polyline extraction from wireframe with dedup/decimation ──\n// wireframe().edgeGroups format: [pointStart_float, pointCount_float, edgeHash]\n// pointStart is a float offset into edgeData.points; pointCount is the number\n// of floats (not points) for this edge.\nfunction extractEdgePolylineFromWireframe(\n edgePoints: Float32Array,\n pointStart: number,\n pointCount: number,\n maxEdgePoints: number,\n): number[][] {\n if (pointCount < 6) return [] // need at least 2 points (6 floats)\n const numPoints = Math.floor(pointCount / 3)\n const raw: number[][] = []\n for (let p = 0; p < numPoints; p++) {\n const off = pointStart + p * 3\n raw.push([edgePoints[off], edgePoints[off + 1], edgePoints[off + 2]])\n }\n let points = dedupeConsecutive(raw, 1e-9)\n if (points.length > 1 && maxEdgePoints > 1) {\n points = decimatePolyline(points, maxEdgePoints)\n }\n return points\n}\n\n// ── Compute geometric axis from surface tangents (unoriented by face) ──\n// For a parametric surface S(u,v):\n// dS/du ≈ (S(u+du,v) - S(u,v))/du\n// dS/dv ≈ (S(u,v+dv) - S(u,v))/dv\n// axis = normalize(cross(dS/du, dS/dv))\nfunction geometricNormal(\n kernel: BrepEngineApi,\n face: BrepHandle,\n u: number,\n v: number,\n): number[] | null {\n const du = 1e-4\n const dv = 1e-4\n const p00 = vec3ToArray(kernel.pointOnSurface(face, u, v))\n const p10 = vec3ToArray(kernel.pointOnSurface(face, u + du, v))\n const p01 = vec3ToArray(kernel.pointOnSurface(face, u, v + dv))\n const dSu: number[] = [p10[0] - p00[0], p10[1] - p00[1], p10[2] - p00[2]]\n const dSv: number[] = [p01[0] - p00[0], p01[1] - p00[1], p01[2] - p00[2]]\n const crossVec: number[] = [\n dSu[1] * dSv[2] - dSu[2] * dSv[1],\n dSu[2] * dSv[0] - dSu[0] * dSv[2],\n dSu[0] * dSv[1] - dSu[1] * dSv[0],\n ]\n return normalize(crossVec)\n}\n\n// ── Surface params (matches Python _surface_params exactly) ──\nfunction getSurfaceParams(kernel: BrepEngineApi, face: BrepHandle): Record<string, unknown> | null {\n const surfaceType = kernel.surfaceType(face)\n const params: Record<string, unknown> = {}\n const uv = kernel.uvBounds(face)\n const uMin = uv.uMin, vMin = uv.vMin\n\n if (surfaceType === 'plane') {\n // Python: plane.Location() = origin, plane.Axis().Direction() = axis\n // S(u,v) = O + u*XDir + v*YDir, so S(0,0) = O = origin\n params.origin = roundPoint(vec3ToArray(kernel.pointOnSurface(face, 0, 0)))\n const axis = geometricNormal(kernel, face, uMin, vMin)\n if (axis) params.axis = roundPoint(axis)\n } else if (surfaceType === 'cylinder') {\n // Python: cylinder.Location() = point on axis, cylinder.Axis().Direction() = axis direction\n // Key order: origin, axis, radius (matches Python output)\n const cyl = kernel.getFaceCylinderData(face)\n\n // Compute axis direction from V-direction: S(u,v+1) - S(u,v) = Axis direction\n const p0 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin))\n const p1 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin + 1))\n const axisDir = normalize([p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]])\n if (axisDir && cyl) {\n // Compute axis origin using surfaceNormal API (exact, no finite-difference error).\n // surfaceNormal includes face orientation, so correct for reversed faces.\n let sn = kernel.surfaceNormal(face, uMin, vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n // P - R * outward_geometric_normal = point on cylinder axis\n const origin: number[] = [\n p0[0] - cyl.radius * sn.x,\n p0[1] - cyl.radius * sn.y,\n p0[2] - cyl.radius * sn.z,\n ]\n params.origin = roundPoint(origin)\n params.axis = roundPoint(axisDir)\n params.radius = roundVal(cyl.radius)\n }\n } else if (surfaceType === 'cone') {\n const p0 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin))\n const p1 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin + 1))\n const axisDir = normalize([p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]])\n if (axisDir) {\n params.origin = roundPoint(p0)\n params.axis = roundPoint(axisDir)\n }\n } else if (surfaceType === 'sphere') {\n // Python: sphere.Location() = center\n const center = kernel.getSurfaceCenterOfMass(face)\n params.center = roundPoint(vec3ToArray(center))\n } else if (surfaceType === 'torus') {\n // Python: torus.Location() = center on axis\n const center = kernel.getSurfaceCenterOfMass(face)\n params.center = roundPoint(vec3ToArray(center))\n const gn = geometricNormal(kernel, face, uMin, vMin)\n if (gn) params.axis = roundPoint(gn)\n }\n\n return Object.keys(params).length > 0 ? params : null\n}\n\n// ── Curve params (matches Python _curve_params) ──\nfunction getCurveParams(kernel: BrepEngineApi, edge: BrepHandle): Record<string, unknown> | null {\n const curveType = kernel.curveType(edge)\n const params: Record<string, unknown> = {}\n\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n params.origin = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, first)))\n params.direction = roundPoint(vec3ToArray(kernel.curveTangent(edge, first)))\n } else if (curveType === 'circle') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n const p0 = kernel.curvePointAtParam(edge, first)\n const pm = kernel.curvePointAtParam(edge, mid)\n params.center = roundPoint([(p0.x + pm.x) / 2, (p0.y + pm.y) / 2, (p0.z + pm.z) / 2])\n const quarter = (first * 3 + last) / 4\n const tA = kernel.curveTangent(edge, first)\n const tQ = kernel.curveTangent(edge, quarter)\n const crossVec: number[] = [\n tA.y * tQ.z - tA.z * tQ.y,\n tA.z * tQ.x - tA.x * tQ.z,\n tA.x * tQ.y - tA.y * tQ.x,\n ]\n const norm = normalize(crossVec)\n if (norm) params.axis = roundPoint(norm)\n const c = params.center as number[]\n const dx = p0.x - c[0], dy = p0.y - c[1], dz = p0.z - c[2]\n params.radius = roundVal(Math.sqrt(dx * dx + dy * dy + dz * dz))\n } else if (curveType === 'ellipse') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'hyperbola') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'parabola') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'bezier' || curveType === 'bspline') {\n try {\n const nc = kernel.getNurbsCurveData(edge)\n if (nc) {\n params.degree = nc.degree\n params.periodic = nc.periodic\n params.rational = nc.rational\n }\n } catch {\n // getNurbsCurveData may fail for non-NURBS edges\n }\n }\n\n return Object.keys(params).length > 0 ? params : null\n}\n\n// ── Face flags (matches Python _face_flags) ──\nfunction faceFlags(referenceable: boolean): number {\n return referenceable ? 0 : 1\n}\n\n// ── Edge flags (matches Python _edge_flags) ──\nfunction edgeFlags(closed: boolean, degenerated: boolean, seam: boolean, referenceable: boolean): number {\n let flags = 0\n if (closed) flags |= 1\n if (degenerated) flags |= 2\n if (seam) flags |= 4\n if (!referenceable) flags |= 8\n return flags\n}\n\n// ── Extract face geometry from mesh data (matches Python _extract_face_geometry) ──\ninterface FaceGeometry {\n area: number\n center: number[]\n normal: number[] | null\n bbox: BBox\n triangleCount: number\n}\n\nfunction extractFaceGeometry(\n positions: Float32Array,\n indices: Uint32Array,\n triStart: number,\n triCount: number,\n): FaceGeometry {\n if (triCount === 0) {\n return { area: 0, center: [0, 0, 0], normal: null, bbox: { min: [0, 0, 0], max: [0, 0, 0] }, triangleCount: 0 }\n }\n\n let areaSum = 0\n const centroidSum = [0, 0, 0]\n const normalSum = [0, 0, 0]\n const allNodes: number[][] = []\n const nodeSet = new Set<number>()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices[(triStart + t) * 3]\n const i1 = indices[(triStart + t) * 3 + 1]\n const i2 = indices[(triStart + t) * 3 + 2]\n nodeSet.add(i0)\n nodeSet.add(i1)\n nodeSet.add(i2)\n\n const p0: number[] = [positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2]]\n const p1: number[] = [positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]]\n const p2: number[] = [positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]]\n\n const [nx, ny, nz] = cross(p0, p1, p2)\n const twiceArea = Math.sqrt(nx * nx + ny * ny + nz * nz)\n // Python uses twiceArea <= 1e-9 to skip degenerate triangles\n if (twiceArea <= 1e-9) continue\n\n const area = twiceArea * 0.5\n centroidSum[0] += (p0[0] + p1[0] + p2[0]) * area / 3\n centroidSum[1] += (p0[1] + p1[1] + p2[1]) * area / 3\n centroidSum[2] += (p0[2] + p1[2] + p2[2]) * area / 3\n areaSum += area\n\n // Area-weighted normal sum (matches Python: raw cross products, not unit vectors).\n // Python sums the raw cross products (proportional to triangle area) and\n // normalizes at the end. This gives the area-weighted face normal.\n normalSum[0] += nx\n normalSum[1] += ny\n normalSum[2] += nz\n }\n\n for (const ni of nodeSet) {\n allNodes.push([positions[ni * 3], positions[ni * 3 + 1], positions[ni * 3 + 2]])\n }\n\n let center: number[]\n if (allNodes.length === 0) {\n center = [0, 0, 0]\n } else if (areaSum > 1e-12) {\n center = [centroidSum[0] / areaSum, centroidSum[1] / areaSum, centroidSum[2] / areaSum]\n } else {\n center = fullBBoxFromPoints(allNodes).center\n }\n\n const normal = normalize([normalSum[0], normalSum[1], normalSum[2]])\n const b = fullBBoxFromPoints(allNodes)\n const bbox: BBox = { min: b.min, max: b.max }\n\n return { area: areaSum, center, normal, bbox, triangleCount: areaSum > 0 ? 1 : 0 }\n}\n\n// ── Build a hash→ordinal lookup for fast edge matching ──\n// Uses the same TopTools_ShapeMapHasher as the C++ facade, so hashes\n// are consistent across getSubShapes, wireframe, meshShape, and hashCode.\n// Collisions (extremely rare with HASH_BOUND=INT32_MAX) are resolved by\n// isSame() — the OCCT identity check.\nfunction buildEdgeOrdLookup(\n kernel: BrepEngineApi,\n edgeHandles: BrepHandle[],\n): Map<number, number[]> {\n const lookup = new Map<number, number[]>()\n for (let ei = 0; ei < edgeHandles.length; ei++) {\n const h = kernel.hashCode(edgeHandles[ei], HASH_BOUND)\n const list = lookup.get(h)\n if (list) list.push(ei + 1)\n else lookup.set(h, [ei + 1])\n }\n return lookup\n}\n\nfunction buildFaceOrdLookup(\n kernel: BrepEngineApi,\n faceHandles: BrepHandle[],\n): Map<number, number[]> {\n const lookup = new Map<number, number[]>()\n for (let fi = 0; fi < faceHandles.length; fi++) {\n const h = kernel.hashCode(faceHandles[fi], HASH_BOUND)\n const list = lookup.get(h)\n if (list) list.push(fi + 1)\n else lookup.set(h, [fi + 1])\n }\n return lookup\n}\n\n// Find the global ordinal of a sub-shape by hash lookup + isSame collision resolution\nfunction findOrdinal(\n kernel: BrepEngineApi,\n subShape: BrepHandle,\n globalHandles: BrepHandle[],\n lookup: Map<number, number[]>,\n): number | undefined {\n const h = kernel.hashCode(subShape, HASH_BOUND)\n const candidates = lookup.get(h)\n if (!candidates) return undefined\n for (const ord of candidates) {\n if (kernel.isSame(subShape, globalHandles[ord - 1])) return ord\n }\n return undefined\n}\n\n/**\n * Build a selector manifest for a single part's topology.\n *\n * Enumerates the shape's faces and edges and their relations, extracts edge\n * polylines from the kernel wireframe and face geometry from the mesh, computes\n * relevance scores, and assembles everything into a columnar selector manifest\n * plus its binary attribute buffers.\n *\n * @param kernel - the OCCT kernel\n * @param input - the shape handle and mesh-with-groups input\n * @param options - optional metadata (step hash and CAD path)\n * @param occurrenceId - the occurrence ID to prefix this part's ids (default 'o1')\n * @returns the assembled manifest and its binary buffers\n */\nexport function buildSelectorManifest(\n kernel: BrepEngineApi,\n input: SelectorManifestInput,\n options: SelectorManifestOptions,\n occurrenceId: string = 'o1',\n): { manifest: Record<string, unknown>; buffers: Record<string, Float32Array | Uint32Array> } {\n // getSubShapes 返回的每个子形都是独立 arena 句柄,manifest 构建只用它们做\n // 查询(输出是纯数据),全部登记到 transient 并在 finally 批量释放——否则\n // 每次构建泄漏 O(faces + edges) 个存活句柄(compat e2e ⑦ 实测 +63/次)。\n const transient: BrepHandle[] = []\n try {\n return buildSelectorManifestCore(kernel, input, options, occurrenceId, transient)\n } finally {\n for (const h of transient) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\nfunction buildSelectorManifestCore(\n kernel: BrepEngineApi,\n input: SelectorManifestInput,\n options: SelectorManifestOptions,\n occurrenceId: string,\n transient: BrepHandle[],\n): { manifest: Record<string, unknown>; buffers: Record<string, Float32Array | Uint32Array> } {\n const { stepHash, cadPath } = options\n const shape = input.shapeHandle\n const mesh = input.meshWithGroups\n const posArr = mesh.positions\n const normArr = mesh.normals\n const idxArr = mesh.indices\n const faceGroups = mesh.faceGroups ?? new Int32Array(0)\n\n // ── 1. Enumerate faces and edges ──\n // getSubShapes uses TopExp::MapShapes + NCollection_IndexedMap — the same\n // enumeration method as wireframe() and meshShape(), so ordinals are\n // consistent with kernel-generated faceGroups/edgeGroups.\n const faceHandles = kernel.getSubShapes(shape, 'face')\n const edgeHandles = kernel.getSubShapes(shape, 'edge')\n transient.push(...faceHandles, ...edgeHandles)\n const faceCount = faceHandles.length\n const edgeCount = edgeHandles.length\n\n // ── 2. Build hash→data maps from kernel-generated buffers ──\n\n // Face hash → {triStart, triCount} from mesh.faceGroups.\n // faceGroups format: [triStart_idx, triCount_idx, faceHash] — values are in\n // index units (3 per triangle). Faces without triangulation are skipped by\n // the C++ side, so faceGroups may have fewer entries than faceCount.\n const faceGroupByHash = new Map<number, { triStart: number; triCount: number }>()\n for (let gi = 0; gi * 3 + 2 < faceGroups.length; gi++) {\n const triStartIdx = faceGroups[gi * 3] // index offset\n const triCountIdx = faceGroups[gi * 3 + 1] // index count\n const faceHash = faceGroups[gi * 3 + 2]\n // Convert from index units to triangle units\n faceGroupByHash.set(faceHash, { triStart: triStartIdx / 3, triCount: triCountIdx / 3 })\n }\n\n // Edge hash → {pointStart, pointCount} from wireframe().edgeGroups.\n // wireframe() uses TopExp::MapShapes + IndexedMap (same as getSubShapes),\n // so edge ordinals match. edgeGroups format: [pointStart_float,\n // pointCount_float, edgeHash] — values are in float units (3 per point).\n // Each edge gets its own independent polyline (NOT connected chains).\n const shapeBbox = tryGetBoundingBox(kernel, shape, posArr)\n const shapeDiag = Math.sqrt(\n (shapeBbox.xmax - shapeBbox.xmin) ** 2 +\n (shapeBbox.ymax - shapeBbox.ymin) ** 2 +\n (shapeBbox.zmax - shapeBbox.zmin) ** 2,\n )\n // Deflection proportional to shape size: 0.1% of diagonal, min 0.01mm.\n // GCPnts_TangentialDeflection adapts to curvature automatically.\n const wireframeDeflection = Math.max(shapeDiag * 0.001, 0.01)\n const wfData = kernel.wireframe(shape, wireframeDeflection)\n const edgeGroupByHash = new Map<number, { pointStart: number; pointCount: number }>()\n for (let ei = 0; ei * 3 + 2 < wfData.edgeGroups.length; ei++) {\n const pointStart = wfData.edgeGroups[ei * 3] // float offset\n const pointCount = wfData.edgeGroups[ei * 3 + 1] // float count\n const edgeHash = wfData.edgeGroups[ei * 3 + 2]\n edgeGroupByHash.set(edgeHash, { pointStart, pointCount })\n }\n\n // ── 3. Build face→edge and edge→face ordinals via isSame() ──\n // For each face, enumerate its edges (getSubShapes deduplicates via\n // IndexedMap, so seam edges appear once). Match each face edge to its\n // global ordinal by hash lookup + isSame() collision resolution.\n const edgeOrdLookup = buildEdgeOrdLookup(kernel, edgeHandles)\n const faceEdgeOrdinals: number[][] = []\n const edgeFaceOrdinals: number[][] = []\n for (let ei = 0; ei < edgeCount; ei++) edgeFaceOrdinals.push([])\n\n for (let fi = 0; fi < faceCount; fi++) {\n const faceEdges = kernel.getSubShapes(faceHandles[fi], 'edge')\n transient.push(...faceEdges)\n const ords: number[] = []\n const seen = new Set<number>()\n for (const fe of faceEdges) {\n const ord = findOrdinal(kernel, fe, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !seen.has(ord)) {\n seen.add(ord)\n ords.push(ord)\n edgeFaceOrdinals[ord - 1].push(fi + 1)\n }\n }\n faceEdgeOrdinals.push(ords)\n }\n\n // ── 4. Detect seam edges ──\n // Real gap: no BRep_Tool.IsClosed(edge, face) API. Heuristic: in a closed\n // solid, every edge should be shared by exactly 2 faces. An edge with only 1\n // adjacent face means it appears twice in that face's wire (once for each\n // parametric direction) — IndexedMap deduplicates, so faceCount=1.\n // This applies to ALL edge types (line, circle, etc.), not just closed curves.\n // In an open shell, boundary edges also have faceCount=1, so we check isSolid.\n const topSolids = kernel.getSubShapes(shape, 'solid')\n transient.push(...topSolids)\n const isSolid = topSolids.length > 0\n const seamEdgeSet = new Set<number>()\n for (let ei = 0; ei < edgeCount; ei++) {\n if (isSolid && edgeFaceOrdinals[ei].length === 1) {\n seamEdgeSet.add(ei + 1)\n }\n }\n\n // ── 5. Build shape entries (SOLID/SHELL/compound) ──\n const solidHandles = kernel.getSubShapes(shape, 'solid')\n const shellHandles = kernel.getSubShapes(shape, 'shell')\n transient.push(...solidHandles, ...shellHandles)\n type ShapeEntry = { ordinal: number; shape: BrepHandle; kind: string }\n let shapeEntries: ShapeEntry[]\n if (solidHandles.length > 0) {\n shapeEntries = solidHandles.map((s, i) => ({ ordinal: i + 1, shape: s, kind: 'solid' }))\n } else if (shellHandles.length > 0) {\n shapeEntries = shellHandles.map((s, i) => ({ ordinal: i + 1, shape: s, kind: 'shell' }))\n } else {\n shapeEntries = [{ ordinal: 1, shape, kind: 'compound' }]\n }\n if (shapeEntries.length === 0 && (faceCount > 0 || edgeCount > 0)) {\n shapeEntries = [{ ordinal: 1, shape, kind: 'compound' }]\n }\n\n // Build shape→face and shape→edge ordinals via isSame()\n const faceOrdLookup = buildFaceOrdLookup(kernel, faceHandles)\n const shapeEntriesWithOrdinals = shapeEntries.map(entry => {\n const faceOrds: number[] = []\n const edgeOrds: number[] = []\n const faceSeen = new Set<number>()\n const edgeSeen = new Set<number>()\n const entryFaces = kernel.getSubShapes(entry.shape, 'face')\n transient.push(...entryFaces)\n for (const f of entryFaces) {\n const ord = findOrdinal(kernel, f, faceHandles, faceOrdLookup)\n if (ord !== undefined && !faceSeen.has(ord)) { faceOrds.push(ord); faceSeen.add(ord) }\n }\n const entryEdges = kernel.getSubShapes(entry.shape, 'edge')\n transient.push(...entryEdges)\n for (const e of entryEdges) {\n const ord = findOrdinal(kernel, e, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !edgeSeen.has(ord)) { edgeOrds.push(ord); edgeSeen.add(ord) }\n }\n return { ...entry, faceOrdinals: faceOrds, edgeOrdinals: edgeOrds }\n })\n\n const occId = asOccurrenceId(occurrenceId)\n const shapeId = asShapeId(`${occId}.s1`)\n\n // ── 6. Build edge rows — wireframe polyline per edge ──\n // Each edge's polyline comes from kernel.wireframe() (GCPnts_TangentialDeflection),\n // looked up by edge hash. Line edges use exactly 2 endpoints for 1 segment.\n const edgeRows: unknown[][] = []\n const edgePositionsData: number[] = []\n const edgeIndicesData: number[] = []\n const edgeIdsData: number[] = []\n let totalEdgeLength = 0\n const edgeBboxes: BBox[] = []\n const maxEdgePoints = 30\n\n for (let ei = 0; ei < edgeCount; ei++) {\n const edge = edgeHandles[ei]\n const ordinal = ei + 1\n const curveType = kernel.curveType(edge)\n const curveLen = kernel.curveLength(edge)\n\n // Look up edge polyline from wireframe data by hash\n const edgeHash = kernel.hashCode(edge, HASH_BOUND)\n const egEntry = edgeGroupByHash.get(edgeHash)\n\n let polyline: number[][]\n if (curveType === 'line') {\n // Line edges: exactly 2 endpoints → 1 segment (wireframe also produces\n // 2 points for lines, but this guarantees it)\n const { first, last } = kernel.curveParameters(edge)\n const pt0 = kernel.curvePointAtParam(edge, first)\n const pt1 = kernel.curvePointAtParam(edge, last)\n polyline = [[pt0.x, pt0.y, pt0.z], [pt1.x, pt1.y, pt1.z]]\n } else if (egEntry) {\n // Curved edges: extract polyline from wireframe data\n polyline = extractEdgePolylineFromWireframe(\n wfData.points, egEntry.pointStart, egEntry.pointCount, maxEdgePoints,\n )\n // Fallback to curve sampling if wireframe gave too few points\n if (polyline.length < 2) {\n const { first, last } = kernel.curveParameters(edge)\n const numPts = Math.min(maxEdgePoints, Math.max(2, Math.ceil(curveLen / 7.5) + 1))\n polyline = []\n for (let p = 0; p < numPts; p++) {\n const t = numPts > 1 ? first + (last - first) * p / (numPts - 1) : first\n const pt = kernel.curvePointAtParam(edge, t)\n polyline.push([pt.x, pt.y, pt.z])\n }\n }\n } else {\n // No wireframe match — fall back to curve sampling\n const { first, last } = kernel.curveParameters(edge)\n const numPts = Math.min(maxEdgePoints, Math.max(2, Math.ceil(curveLen / 7.5) + 1))\n polyline = []\n for (let p = 0; p < numPts; p++) {\n const t = numPts > 1 ? first + (last - first) * p / (numPts - 1) : first\n const pt = kernel.curvePointAtParam(edge, t)\n polyline.push([pt.x, pt.y, pt.z])\n }\n }\n\n // Edge bbox from polyline points (matches Python _bbox_from_points).\n const edgeBBoxPts = polyline.length >= 2 ? polyline : []\n const efbb = fullBBoxFromPoints(edgeBBoxPts)\n const bb: BBox = { min: efbb.min, max: efbb.max }\n edgeBboxes.push(bb)\n\n // Edge properties\n const closed = kernel.curveIsClosed(edge)\n\n // Edge length: polyline chord length (matches Python _polyline_length)\n const edgeLen = polyline.length >= 2 ? polylineLength(polyline, closed) : curveLen\n totalEdgeLength += edgeLen\n\n // Edge center: arithmetic mean of polyline points (matches Python _polyline_center)\n const center = polyline.length >= 2 ? polylineCenter(polyline) : [0, 0, 0]\n\n const segmentStart = edgeIdsData.length\n\n // Build edge proxy data from polyline\n if (polyline.length >= 2) {\n const vertexOffset = edgePositionsData.length / 3\n for (const pt of polyline) {\n edgePositionsData.push(pt[0], pt[1], pt[2])\n }\n for (let s = 0; s < polyline.length - 1; s++) {\n edgeIndicesData.push(vertexOffset + s, vertexOffset + s + 1)\n edgeIdsData.push(ei)\n }\n // Closed edge closing segment (matches Python)\n if (closed && distance(polyline[0], polyline[polyline.length - 1]) > 1e-9) {\n edgeIndicesData.push(vertexOffset + polyline.length - 1, vertexOffset)\n edgeIdsData.push(ei)\n }\n }\n\n const params = getCurveParams(kernel, edge)\n const segmentCountFinal = edgeIdsData.length - segmentStart\n\n edgeRows.push([\n asEdgeId(`${occId}.e${ordinal}`), occId, shapeId, ordinal, curveType, roundVal(edgeLen),\n roundPoint(center), bboxArray(bb),\n 0, 0, // faceStart, faceCount — filled later\n 0, 0, // relevance, flags\n params, segmentStart, segmentCountFinal,\n ])\n }\n\n // ── 7. Build face rows — hash-based triangle lookup ──\n const faceRows: unknown[][] = []\n const faceRunData: number[] = []\n let totalFaceArea = 0\n const faceBboxes: BBox[] = []\n\n for (let fi = 0; fi < faceCount; fi++) {\n const face = faceHandles[fi]\n const ordinal = fi + 1\n\n // Look up triangle data by face hash (pure hash Map, no index fallback).\n // No match (face without triangulation) → triStart/triCount = 0.\n const fh = kernel.hashCode(face, HASH_BOUND)\n const fgEntry = faceGroupByHash.get(fh)\n const triStart = fgEntry ? fgEntry.triStart : 0\n const triCount = fgEntry ? fgEntry.triCount : 0\n\n // Extract face geometry with degenerate triangle filtering\n const geom = extractFaceGeometry(posArr, idxArr, triStart, triCount)\n\n const surfaceType = kernel.surfaceType(face)\n const area = geom.area\n totalFaceArea += area\n const center = geom.center\n const bb = geom.bbox\n faceBboxes.push(bb)\n\n // Face normal: for planar faces, use mesh-based area-weighted cross products.\n // For non-planar faces, use per-vertex normals from mesh.normals (computed\n // by OCCT's own normal estimator) averaged over the face's triangles.\n let normal = geom.normal\n if (surfaceType !== 'plane' && triCount > 0) {\n const ns = [0, 0, 0]\n for (let t = 0; t < triCount; t++) {\n for (let vi = 0; vi < 3; vi++) {\n const idx = idxArr[(triStart + t) * 3 + vi]\n ns[0] += normArr[idx * 3]\n ns[1] += normArr[idx * 3 + 1]\n ns[2] += normArr[idx * 3 + 2]\n }\n }\n const meshNormal = normalize(ns)\n if (meshNormal) normal = meshNormal\n }\n if (!normal) normal = [0, 0, 1]\n\n const params = getSurfaceParams(kernel, face)\n\n faceRows.push([\n asFaceId(`${occId}.f${ordinal}`), occId, shapeId, ordinal, surfaceType, roundVal(area),\n roundPoint(center), normal ? roundPoint(normal) : null, bboxArray(bb),\n 0, 0, // edgeStart, edgeCount — filled later\n 0, 0, // relevance, flags\n params, triStart, triCount,\n ])\n\n if (triCount > 0) {\n faceRunData.push(0, 0, triStart, triCount, fi)\n }\n }\n\n // ── 8. Build face→edge and edge→face relation tables ──\n const faceEdgeRowsData: number[] = []\n const edgeFaceRowsData: number[] = []\n\n for (let fi = 0; fi < faceCount; fi++) {\n const edgeOrds = faceEdgeOrdinals[fi]\n const edgeStart = faceEdgeRowsData.length\n ;(faceRows[fi] as unknown[])[9] = edgeStart\n ;(faceRows[fi] as unknown[])[10] = edgeOrds.length\n for (const eo of edgeOrds) {\n faceEdgeRowsData.push(eo - 1)\n }\n }\n\n for (let ei = 0; ei < edgeCount; ei++) {\n const faceOrds = edgeFaceOrdinals[ei]\n const faceStart = edgeFaceRowsData.length\n ;(edgeRows[ei] as unknown[])[8] = faceStart\n ;(edgeRows[ei] as unknown[])[9] = faceOrds.length\n for (const fo of faceOrds) {\n edgeFaceRowsData.push(fo - 1)\n }\n }\n\n // ── 9. Compute relevance scores (matches Python) ──\n const mergedBbox = faceBboxes.length > 0 ? mergeBboxes(faceBboxes) : { min: [0, 0, 0], max: [0, 0, 0] }\n const mergedDiag = Math.sqrt(\n (mergedBbox.max[0] - mergedBbox.min[0]) ** 2 +\n (mergedBbox.max[1] - mergedBbox.min[1]) ** 2 +\n (mergedBbox.max[2] - mergedBbox.min[2]) ** 2,\n )\n const totalArea = Math.max(totalFaceArea, 1e-12)\n const totalLength = Math.max(totalEdgeLength, 1e-12)\n const sizeFloor = Math.max(mergedDiag * mergedDiag * 1e-6, 1e-12)\n const lengthFloor = Math.max(mergedDiag * 1e-5, 1e-12)\n\n for (let fi = 0; fi < faceRows.length; fi++) {\n const area = faceRows[fi][5] as number\n const surfaceType = faceRows[fi][4] as string\n let score = 100 * Math.sqrt(Math.max(area, 0) / totalArea)\n if (['plane', 'cylinder', 'cone', 'sphere', 'torus'].includes(surfaceType)) score += 8\n if (area < sizeFloor) score -= 45\n const triCount = faceRows[fi][15] as number\n const ref = triCount > 0 && area > 1e-12\n if (!ref) score = 0\n ;(faceRows[fi] as unknown[])[11] = Math.max(0, Math.min(100, Math.round(score)))\n ;(faceRows[fi] as unknown[])[12] = faceFlags(ref)\n }\n\n for (let ei = 0; ei < edgeRows.length; ei++) {\n const length = edgeRows[ei][5] as number\n const curveType = edgeRows[ei][4] as string\n const edge = edgeHandles[ei]\n const closed = kernel.curveIsClosed(edge)\n const degenerated = kernel.curveLength(edge) < 1e-12\n const seam = seamEdgeSet.has(ei + 1)\n const segmentCount = edgeRows[ei][14] as number\n const ref = !degenerated && segmentCount > 0\n\n let score = 100 * Math.sqrt(Math.max(length, 0) / totalLength)\n if (['line', 'circle', 'ellipse'].includes(curveType)) score += 10\n if (seam) score -= 30\n if (degenerated) score -= 80\n if (length < lengthFloor) score -= 35\n if (!ref) score = 0\n ;(edgeRows[ei] as unknown[])[10] = Math.max(0, Math.min(100, Math.round(score)))\n ;(edgeRows[ei] as unknown[])[11] = edgeFlags(closed, degenerated, seam, ref)\n }\n\n // ── 11. Build shape rows (matches Python emit_leaf) ──\n const shapeRows: unknown[][] = []\n for (const entry of shapeEntriesWithOrdinals) {\n const bboxes: BBox[] = entry.faceOrdinals\n .map(fo => faceBboxes[fo - 1])\n .filter((b): b is BBox => !!b)\n const entryBbox = bboxes.length > 0 ? mergeBboxes(bboxes) : bboxFromOcc(tryGetBoundingBox(kernel, entry.shape, posArr))\n const entryArea = entry.faceOrdinals.reduce((sum, fo) => sum + (faceRows[fo - 1][5] as number), 0)\n let entryVolume: number | null = null\n let entryCenter: number[]\n if (entry.kind === 'solid') {\n entryVolume = kernel.getVolume(entry.shape)\n const cm = kernel.getCenterOfMass(entry.shape)\n entryCenter = [cm.x, cm.y, cm.z]\n } else {\n entryCenter = bboxCenter(entryBbox)\n }\n\n const firstFaceGlobal = entry.faceOrdinals.length > 0 ? entry.faceOrdinals[0] - 1 : faceRows.length\n const firstEdgeGlobal = entry.edgeOrdinals.length > 0 ? entry.edgeOrdinals[0] - 1 : edgeRows.length\n\n shapeRows.push([\n asShapeId(`${occId}.s${entry.ordinal}`), occId, entry.ordinal, entry.kind,\n bboxArray(entryBbox), roundPoint(entryCenter), roundVal(entryArea), entryVolume !== null ? roundVal(entryVolume) : null,\n firstFaceGlobal, entry.faceOrdinals.length,\n firstEdgeGlobal, entry.edgeOrdinals.length,\n ])\n }\n\n // ── 12. Build occurrence rows ──\n const meshBbox = faceBboxes.length > 0 ? mergedBbox : { min: [0, 0, 0], max: [0, 0, 0] }\n const occurrenceRows: unknown[][] = [[\n occId, '1', null, null, null, IDENTITY_16, bboxArray(meshBbox),\n 0, shapeRows.length, 0, faceRows.length, 0, edgeRows.length,\n ]]\n\n // ── 13. Build manifest ──\n const manifest: Record<string, unknown> = {\n schemaVersion: 2,\n profile: 'selector',\n cadRef: cadPath,\n stepPath: cadPath ? `${cadPath}.step` : undefined,\n stepHash,\n bbox: bboxArray(meshBbox),\n stats: {\n occurrenceCount: occurrenceRows.length,\n leafOccurrenceCount: occurrenceRows.length,\n shapeCount: shapeRows.length,\n faceCount: faceRows.length,\n edgeCount: edgeRows.length,\n faceProxyRunCount: faceRunData.length / 5,\n edgeProxyPointCount: edgePositionsData.length / 3,\n edgeProxySegmentCount: edgeIdsData.length,\n },\n tables: {\n occurrenceColumns: OCCURRENCE_COLUMNS,\n shapeColumns: SHAPE_COLUMNS,\n faceColumns: FACE_COLUMNS,\n edgeColumns: EDGE_COLUMNS,\n },\n occurrences: occurrenceRows,\n shapes: shapeRows,\n faces: faceRows,\n edges: edgeRows,\n faceProxy: {\n source: cadPath ? `.${cadPath.split(/[/\\\\]/).pop()!}.step.3mf` : undefined,\n runsView: 'faceRuns',\n runColumns: ['occurrenceRow', 'primitiveIndex', 'triangleStart', 'triangleCount', 'faceRow'],\n },\n edgeProxy: {\n positionsView: 'edgePositions',\n indicesView: 'edgeIndices',\n edgeIdsView: 'edgeIds',\n },\n relations: {\n faceEdgeRowsView: 'faceEdgeRows',\n edgeFaceRowsView: 'edgeFaceRows',\n },\n }\n\n const buffers: Record<string, Float32Array | Uint32Array> = {\n faceRuns: new Uint32Array(faceRunData),\n edgePositions: new Float32Array(edgePositionsData),\n edgeIndices: new Uint32Array(edgeIndicesData),\n edgeIds: new Uint32Array(edgeIdsData),\n faceEdgeRows: new Uint32Array(faceEdgeRowsData),\n edgeFaceRows: new Uint32Array(edgeFaceRowsData),\n }\n\n return { manifest, buffers }\n}\n\n// ── Assembly-level topology ──\n\n/** Input for per-part topology identification in an assembly. */\nexport interface PartTopologyInput {\n labelPath: string\n shapeHandle: BrepHandle\n meshWithGroups: BrepMeshResult\n}\n\n/** Result of assembly-level topology identification. */\nexport interface AssemblyTopologyResult {\n manifest: Record<string, unknown>\n buffers: Record<string, Float32Array | Uint32Array>\n}\n\n/**\n * Build a selector manifest for an assembly (multi-part) topology.\n *\n * For each part, runs the per-part topology identification (face/edge enumeration,\n * wireframe, relations) and merges into a single assembly manifest.\n *\n * Occurrence IDs use the part's labelPath (e.g., \"o0\", \"o0.o1\").\n *\n * Face/edge triangle ranges are per-mesh (each part has its own mesh),\n * identified by the occurrenceRow index in faceRuns.\n *\n * @param kernel - the OCCT kernel\n * @param parts - per-part topology inputs for the assembly\n * @param opts - optional step hash and CAD path metadata\n * @returns the merged assembly manifest and its binary buffers\n */\nexport function buildAssemblySelectorManifest(\n kernel: BrepEngineApi,\n parts: PartTopologyInput[],\n opts: SelectorManifestOptions = {},\n): AssemblyTopologyResult {\n const { stepHash, cadPath } = opts\n\n // Accumulated data\n const allOccurrences: unknown[][] = []\n const allShapes: unknown[][] = []\n const allFaces: unknown[][] = []\n const allEdges: unknown[][] = []\n\n // Buffer accumulators\n const faceRunData: number[] = []\n const edgePositionsData: number[] = []\n const edgeIndicesData: number[] = []\n const edgeIdsData: number[] = []\n const faceEdgeRowsData: number[] = []\n const edgeFaceRowsData: number[] = []\n\n let totalFaceArea = 0\n let totalEdgeLength = 0\n const allFaceBboxes: BBox[] = []\n const allEdgeBboxes: BBox[] = []\n\n // Process each part\n for (let partIdx = 0; partIdx < parts.length; partIdx++) {\n const part = parts[partIdx]\n const occId = asOccurrenceId(part.labelPath)\n\n // Run per-part manifest (uses the existing buildSelectorManifest logic)\n const partResult = buildSelectorManifest(\n kernel,\n { shapeHandle: part.shapeHandle, meshWithGroups: part.meshWithGroups },\n { stepHash, cadPath },\n occId,\n )\n const partManifest = partResult.manifest\n const partBuffers = partResult.buffers\n\n // Extract per-part data\n const partOcc = (partManifest.occurrences as unknown[][]) ?? []\n const partShapes = (partManifest.shapes as unknown[][]) ?? []\n const partFaces = (partManifest.faces as unknown[][]) ?? []\n const partEdges = (partManifest.edges as unknown[][]) ?? []\n\n const occRowIdx = allOccurrences.length // 0-based occurrence index for this part\n\n // Occurrence row: use labelPath as id, parentId null (flat for now)\n // CRITICAL: update shapeStart/faceStart/edgeStart to GLOBAL indices.\n // buildSelectorManifest sets them to 0 (local), so without this fix\n // every part's occurrence points to part 0's shapes/faces/edges.\n const globalShapeStart = allShapes.length\n const globalFaceStart = allFaces.length\n const globalEdgeStart = allEdges.length\n for (const occ of partOcc) {\n const row = [...occ] as unknown[]\n row[0] = occId // id\n row[1] = occId // path\n row[2] = '' // name (from XCAF, not available here)\n row[3] = '' // sourceName\n row[4] = null // parentId (flat for now)\n row[7] = globalShapeStart // shapeStart (global)\n // row[8] shapeCount — already correct (local count = global count for this part)\n row[9] = globalFaceStart // faceStart (global)\n // row[10] faceCount — already correct\n row[11] = globalEdgeStart // edgeStart (global)\n // row[12] edgeCount — already correct\n allOccurrences.push(row)\n }\n\n // Shape rows: replace occurrenceId\n for (const shape of partShapes) {\n const row = [...shape] as unknown[]\n row[1] = occId // occurrenceId\n // Update faceStart/faceCount/edgeStart/edgeCount to global indices\n const faceCount = row[9] as number\n const edgeCount = row[11] as number\n row[8] = allFaces.length // global faceStart\n row[9] = faceCount\n row[10] = allEdges.length // global edgeStart\n row[11] = edgeCount\n allShapes.push(row)\n }\n\n // Face rows: replace occurrenceId/shapeId, update triangleStart (per-mesh,\n // keep local), update edgeStart/edgeCount to global indices\n const partFaceEdgeStart = faceEdgeRowsData.length\n for (let fi = 0; fi < partFaces.length; fi++) {\n const face = [...partFaces[fi]] as unknown[]\n face[1] = occId // occurrenceId\n face[2] = asShapeId(`${occId}.s1`) // shapeId\n // Update edgeStart/edgeCount to global indices\n const edgeStart = face[9] as number\n const edgeCount = face[10] as number\n face[9] = partFaceEdgeStart + edgeStart // global faceEdgeRows offset\n face[10] = edgeCount\n // triangleStart/triangleCount stay local (per-mesh)\n allFaces.push(face)\n totalFaceArea += (face[5] as number)\n // Collect bbox for global merge\n const fb = face[8] as Record<string, number[]>\n if (fb?.min && fb?.max) {\n allFaceBboxes.push({ min: fb.min, max: fb.max })\n }\n }\n\n // Edge rows: replace occurrenceId/shapeId, update faceStart/faceCount\n const partEdgeFaceStart = edgeFaceRowsData.length\n for (let ei = 0; ei < partEdges.length; ei++) {\n const edge = [...partEdges[ei]] as unknown[]\n edge[1] = occId // occurrenceId\n edge[2] = asShapeId(`${occId}.s1`) // shapeId\n // Update faceStart/faceCount to global indices\n const faceStart = edge[8] as number\n const edgeCount = edge[9] as number\n edge[8] = partEdgeFaceStart + faceStart // global edgeFaceRows offset\n edge[9] = edgeCount\n // Update segmentStart to global offset\n const segCount = edge[14] as number\n edge[13] = edgeIdsData.length // global segmentStart (will be set below)\n edge[14] = segCount\n allEdges.push(edge)\n totalEdgeLength += (edge[5] as number)\n // Collect bbox\n const eb = edge[7] as Record<string, number[]>\n if (eb?.min && eb?.max) {\n allEdgeBboxes.push({ min: eb.min, max: eb.max })\n }\n }\n\n // Merge faceRuns: update occurrenceRow to global index\n const partFaceRuns = (partBuffers.faceRuns as Uint32Array) ?? new Uint32Array(0)\n for (let ri = 0; ri < partFaceRuns.length; ri += 5) {\n faceRunData.push(\n occRowIdx, // occurrenceRow (global)\n partFaceRuns[ri + 1], // primitiveIndex\n partFaceRuns[ri + 2], // triangleStart (local to mesh)\n partFaceRuns[ri + 3], // triangleCount\n allFaces.length - partFaces.length + partFaceRuns[ri + 4], // faceRow (global)\n )\n }\n\n // Merge edge proxy buffers\n const partEdgePos = (partBuffers.edgePositions as Float32Array) ?? new Float32Array(0)\n const partEdgeIdx = (partBuffers.edgeIndices as Uint32Array) ?? new Uint32Array(0)\n const partEdgeIds = (partBuffers.edgeIds as Uint32Array) ?? new Uint32Array(0)\n\n // Edge positions: concatenate (vertex offset = current length / 3)\n const vertexOffset = edgePositionsData.length / 3\n for (let p = 0; p < partEdgePos.length; p++) {\n edgePositionsData.push(partEdgePos[p])\n }\n // Edge indices: add vertex offset to each index (indices reference edgePositions)\n for (let p = 0; p < partEdgeIdx.length; p++) {\n edgeIndicesData.push(partEdgeIdx[p] + vertexOffset)\n }\n // Edge IDs: offset by global edge index base\n const edgeIdBase = allEdges.length - partEdges.length\n for (let p = 0; p < partEdgeIds.length; p++) {\n edgeIdsData.push(partEdgeIds[p] + edgeIdBase)\n }\n\n // Merge relation buffers\n const partFaceEdgeRows = (partBuffers.faceEdgeRows as Uint32Array) ?? new Uint32Array(0)\n for (let p = 0; p < partFaceEdgeRows.length; p++) {\n faceEdgeRowsData.push(partFaceEdgeRows[p])\n }\n\n const partEdgeFaceRows = (partBuffers.edgeFaceRows as Uint32Array) ?? new Uint32Array(0)\n for (let p = 0; p < partEdgeFaceRows.length; p++) {\n edgeFaceRowsData.push(partEdgeFaceRows[p])\n }\n\n // Fix edge segmentStart (now that we know the global offset)\n const segBase = edgeIdsData.length - partEdgeIds.length\n for (let ei = 0; ei < partEdges.length; ei++) {\n const globalEdgeIdx = allEdges.length - partEdges.length + ei\n const origSegStart = partEdges[ei][13] as number\n ;(allEdges[globalEdgeIdx] as unknown[])[13] = segBase + origSegStart\n }\n }\n\n // Compute merged bbox\n const mergedBbox = allFaceBboxes.length > 0\n ? mergeBboxes(allFaceBboxes)\n : { min: [0, 0, 0], max: [0, 0, 0] }\n\n // Recompute relevance scores for assembly (global scale)\n const mergedDiag = Math.sqrt(\n (mergedBbox.max[0] - mergedBbox.min[0]) ** 2 +\n (mergedBbox.max[1] - mergedBbox.min[1]) ** 2 +\n (mergedBbox.max[2] - mergedBbox.min[2]) ** 2,\n )\n const totalArea = Math.max(totalFaceArea, 1e-12)\n const totalLength = Math.max(totalEdgeLength, 1e-12)\n const sizeFloor = Math.max(mergedDiag * mergedDiag * 1e-6, 1e-12)\n const lengthFloor = Math.max(mergedDiag * 1e-5, 1e-12)\n\n for (let fi = 0; fi < allFaces.length; fi++) {\n const area = allFaces[fi][5] as number\n const surfaceType = allFaces[fi][4] as string\n let score = 100 * Math.sqrt(Math.max(area, 0) / totalArea)\n if (['plane', 'cylinder', 'cone', 'sphere', 'torus'].includes(surfaceType)) score += 8\n if (area < sizeFloor) score -= 45\n const triCount = allFaces[fi][15] as number\n const ref = triCount > 0 && area > 1e-12\n if (!ref) score = 0\n ;(allFaces[fi] as unknown[])[11] = Math.max(0, Math.min(100, Math.round(score)))\n ;(allFaces[fi] as unknown[])[12] = faceFlags(ref)\n }\n\n for (let ei = 0; ei < allEdges.length; ei++) {\n const length = allEdges[ei][5] as number\n const curveType = allEdges[ei][4] as string\n const segCount = allEdges[ei][14] as number\n const ref = segCount > 0 && length > 1e-12\n let score = 100 * Math.sqrt(Math.max(length, 0) / totalLength)\n if (['line', 'circle', 'ellipse'].includes(curveType)) score += 10\n if (length < lengthFloor) score -= 35\n if (!ref) score = 0\n ;(allEdges[ei] as unknown[])[10] = Math.max(0, Math.min(100, Math.round(score)))\n // flags already set per-part\n }\n\n // Build assembly manifest\n const manifest: Record<string, unknown> = {\n schemaVersion: 2,\n profile: 'selector',\n cadRef: cadPath,\n stepPath: cadPath ? `${cadPath}.step` : undefined,\n stepHash,\n bbox: bboxArray(mergedBbox),\n stats: {\n occurrenceCount: allOccurrences.length,\n leafOccurrenceCount: allOccurrences.length,\n shapeCount: allShapes.length,\n faceCount: allFaces.length,\n edgeCount: allEdges.length,\n faceProxyRunCount: faceRunData.length / 5,\n edgeProxyPointCount: edgePositionsData.length / 3,\n edgeProxySegmentCount: edgeIdsData.length,\n },\n tables: {\n occurrenceColumns: OCCURRENCE_COLUMNS,\n shapeColumns: SHAPE_COLUMNS,\n faceColumns: FACE_COLUMNS,\n edgeColumns: EDGE_COLUMNS,\n },\n occurrences: allOccurrences,\n shapes: allShapes,\n faces: allFaces,\n edges: allEdges,\n faceProxy: {\n source: cadPath ? `.${cadPath.split(/[/\\\\]/).pop()!}.step.3mf` : undefined,\n runsView: 'faceRuns',\n runColumns: ['occurrenceRow', 'primitiveIndex', 'triangleStart', 'triangleCount', 'faceRow'],\n },\n edgeProxy: {\n positionsView: 'edgePositions',\n indicesView: 'edgeIndices',\n edgeIdsView: 'edgeIds',\n },\n relations: {\n faceEdgeRowsView: 'faceEdgeRows',\n edgeFaceRowsView: 'edgeFaceRows',\n },\n }\n\n const buffers: Record<string, Float32Array | Uint32Array> = {\n faceRuns: new Uint32Array(faceRunData),\n edgePositions: new Float32Array(edgePositionsData),\n edgeIndices: new Uint32Array(edgeIndicesData),\n edgeIds: new Uint32Array(edgeIdsData),\n faceEdgeRows: new Uint32Array(faceEdgeRowsData),\n edgeFaceRows: new Uint32Array(edgeFaceRowsData),\n }\n\n return { manifest, buffers }\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n//\n// 供 TopoRef 命名层做 edge/vertex lineage 解析。与 buildSelectorManifest\n// 内部的 face→edge 邻接同源(同一次 TopExp::MapShapes 枚举),选择器\n// manifest 输出保持不变——这是命名层的独立查询出口。\n// ═══════════════════════════════════════════════════════════════════════\n\n/** 拓扑邻接表:ordinal(1 起) ↔ 邻接 ordinal 列表。 */\nexport interface TopologyAdjacency {\n /** face ordinal(1 起) → 邻接 edge ordinal 列表。 */\n readonly faceEdgeOrdinals: ReadonlyArray<readonly number[]>\n /** edge ordinal(1 起) → 邻接 face ordinal 列表。 */\n readonly edgeFaceOrdinals: ReadonlyArray<readonly number[]>\n /** face ordinal(1 起) → 邻接 vertex ordinal 列表。 */\n readonly faceVertexOrdinals: ReadonlyArray<readonly number[]>\n}\n\n/**\n * 构建一个 solid 的拓扑邻接表(edge/vertex lineage 解析用,§4.2/§4.4)。\n *\n * 与 buildSelectorManifest 同一枚举序(getSubShapes ↔ subShapeHashes ↔\n * manifest 行序),hash 碰撞按既有办法用 isSame 消解(findOrdinal)。\n * 每次调用重新枚举(解析是低频路径,不建缓存)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the solid to query.\n * @returns the adjacency tables (face→edge, edge→face, face→vertex).\n */\nexport function buildTopologyAdjacency(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): TopologyAdjacency {\n const faceHandles = kernel.getSubShapes(shape, 'face')\n const edgeHandles = kernel.getSubShapes(shape, 'edge')\n const vertexHandles = kernel.getSubShapes(shape, 'vertex')\n const faceCount = faceHandles.length\n const edgeCount = edgeHandles.length\n\n const edgeOrdLookup = buildEdgeOrdLookup(kernel, edgeHandles)\n const vertexOrdLookup = buildFaceOrdLookup(kernel, vertexHandles)\n\n const faceEdgeOrdinals: number[][] = []\n const edgeFaceOrdinals: number[][] = []\n const faceVertexOrdinals: number[][] = []\n for (let ei = 0; ei < edgeCount; ei++) edgeFaceOrdinals.push([])\n\n for (let fi = 0; fi < faceCount; fi++) {\n // face → edge(与 manifest 的 faceEdgeRows 同源)\n const faceEdges = kernel.getSubShapes(faceHandles[fi], 'edge')\n const edgeOrds: number[] = []\n const seen = new Set<number>()\n for (const fe of faceEdges) {\n const ord = findOrdinal(kernel, fe, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !seen.has(ord)) {\n seen.add(ord)\n edgeOrds.push(ord)\n edgeFaceOrdinals[ord - 1].push(fi + 1)\n }\n }\n faceEdgeOrdinals.push(edgeOrds)\n\n // face → vertex(§4.4:内核 getSubShapes(face,'vertex') 可用)\n const faceVertices = kernel.getSubShapes(faceHandles[fi], 'vertex')\n const vertexOrds: number[] = []\n const seenV = new Set<number>()\n for (const fv of faceVertices) {\n const ord = findOrdinal(kernel, fv, vertexHandles, vertexOrdLookup)\n if (ord !== undefined && !seenV.has(ord)) {\n seenV.add(ord)\n vertexOrds.push(ord)\n }\n }\n faceVertexOrdinals.push(vertexOrds)\n }\n\n return { faceEdgeOrdinals, edgeFaceOrdinals, faceVertexOrdinals }\n}\n"]}
1
+ {"version":3,"file":"topologyExt.js","sourceRoot":"","sources":["../../src/occt-kernel/topologyExt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE3E;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,MAAsE,EACtE,KAAiB,EACjB,aAA4B;IAE5B,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IACD,0DAA0D;IAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAA;QACrD,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAA;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAC9E,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAC/C,CAAC;IACD,qCAAqC;IACrC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;AAChF,CAAC;AAED,0EAA0E;AAC1E,iEAAiE;AAEjE,oEAAoE;AACpE,qEAAqE;AACrE,qEAAqE;AACrE,8DAA8D;AAC9D,MAAM,UAAU,GAAG,UAAU,CAAA;AAC7B,uDAAuD;AACvD,MAAM,YAAY,GAAG,CAAC,CAAA;AAEtB,MAAM,kBAAkB,GAAG;IACzB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW;IAC3D,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW;IAC5D,WAAW,EAAE,WAAW;CACzB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;IACzD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW;CACrE,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa;IACzD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAC5D,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe;CACjE,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW;IACvD,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IACpD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc;CAC/D,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAkBpE,SAAS,WAAW,CAAC,EAAmB;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;AAC/E,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO;QACL,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;KAChC,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAU;IAC3B,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,CAAW;IAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC;AAED,kFAAkF;AAClF,SAAS,QAAQ,CAAC,CAAS,EAAE,SAAiB,YAAY;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,SAAiB,YAAY;IAC5D,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAA;IAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACrB,CAAC;AAWD,SAAS,kBAAkB,CAAC,MAAkB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACxF,CAAC;IACD,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACvB,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC;QACpE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;KAC/D,CAAA;AACH,CAAC;AAED,iCAAiC;AACjC,SAAS,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE,CAAW;IAClD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO;QACL,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;QACrB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;QACrB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;KACtB,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAW;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,CAAW,EAAE,CAAW;IACxC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED,sHAAsH;AAEtH,SAAS,iBAAiB,CAAC,MAAkB,EAAE,SAAiB;IAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkB,EAAE,SAAiB;IAC7D,IAAI,SAAS,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,MAAM,CAAA;IAC/D,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IACpD,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC,CAAA;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;QAClC,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAC1B,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB,EAAE,MAAe;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;QACpE,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACV,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACV,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,CAAA;AACvC,CAAC;AAED,sEAAsE;AACtE,gFAAgF;AAChF,8EAA8E;AAC9E,wCAAwC;AACxC,SAAS,gCAAgC,CACvC,UAAwB,EACxB,UAAkB,EAClB,UAAkB,EAClB,aAAqB;IAErB,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA,CAAE,oCAAoC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IAC5C,MAAM,GAAG,GAAe,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,CAAA;QAC9B,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,0EAA0E;AAC1E,mCAAmC;AACnC,oCAAoC;AACpC,oCAAoC;AACpC,0CAA0C;AAC1C,SAAS,eAAe,CACtB,MAAqB,EACrB,IAAgB,EAChB,CAAS,EACT,CAAS;IAET,MAAM,EAAE,GAAG,IAAI,CAAA;IACf,MAAM,EAAE,GAAG,IAAI,CAAA;IACf,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC/D,MAAM,GAAG,GAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,GAAG,GAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,QAAQ,GAAa;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;KAClC,CAAA;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB,CAAC,MAAqB,EAAE,IAAgB;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI,CAAA;IAEpC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC5B,qEAAqE;QACrE,uDAAuD;QACvD,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACtD,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;SAAM,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QACtC,4FAA4F;QAC5F,0DAA0D;QAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAE5C,8EAA8E;QAC9E,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/D,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;YACnB,mFAAmF;YACnF,0EAA0E;YAC1E,IAAI,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YAC/C,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;gBACjD,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;YACvC,CAAC;YACD,4DAA4D;YAC5D,MAAM,MAAM,GAAa;gBACvB,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBACzB,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBACzB,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;aAC1B,CAAA;YACD,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;YAClC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/D,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;YAC9B,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,qCAAqC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC;SAAM,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QACnC,4CAA4C;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACpD,IAAI,EAAE;YAAE,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AACvD,CAAC;AAED,oDAAoD;AACpD,SAAS,cAAc,CAAC,MAAqB,EAAE,IAAgB;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;QAC9E,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACrF,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAa;YACzB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SAC1B,CAAA;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;QAChC,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAkB,CAAA;QACnC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAClE,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAA;gBACzB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAA;gBAC7B,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AACvD,CAAC;AAED,gDAAgD;AAChD,SAAS,SAAS,CAAC,aAAsB;IACvC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,gDAAgD;AAChD,SAAS,SAAS,CAAC,MAAe,EAAE,WAAoB,EAAE,IAAa,EAAE,aAAsB;IAC7F,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM;QAAE,KAAK,IAAI,CAAC,CAAA;IACtB,IAAI,WAAW;QAAE,KAAK,IAAI,CAAC,CAAA;IAC3B,IAAI,IAAI;QAAE,KAAK,IAAI,CAAC,CAAA;IACpB,IAAI,CAAC,aAAa;QAAE,KAAK,IAAI,CAAC,CAAA;IAC9B,OAAO,KAAK,CAAA;AACd,CAAC;AAWD,SAAS,mBAAmB,CAC1B,SAAuB,EACvB,OAAoB,EACpB,QAAgB,EAChB,QAAgB;IAEhB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;IACjH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,MAAM,QAAQ,GAAe,EAAE,CAAA;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACtC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEf,MAAM,EAAE,GAAa,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACtF,MAAM,EAAE,GAAa,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACtF,MAAM,EAAE,GAAa,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAEtF,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;QACxD,6DAA6D;QAC7D,IAAI,SAAS,IAAI,IAAI;YAAE,SAAQ;QAE/B,MAAM,IAAI,GAAG,SAAS,GAAG,GAAG,CAAA;QAC5B,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;QACpD,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;QACpD,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;QACpD,OAAO,IAAI,IAAI,CAAA;QAEf,mFAAmF;QACnF,yEAAyE;QACzE,mEAAmE;QACnE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAClB,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAClB,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACpB,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAClF,CAAC;IAED,IAAI,MAAgB,CAAA;IACpB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,CAAC;SAAM,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACzF,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,IAAI,GAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;IAE7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACpF,CAAC;AAED,2DAA2D;AAC3D,qEAAqE;AACrE,0EAA0E;AAC1E,wEAAwE;AACxE,sCAAsC;AACtC,SAAS,kBAAkB,CACzB,MAAqB,EACrB,WAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAqB,EACrB,WAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAClB,MAAqB,EACrB,QAAoB,EACpB,aAA2B,EAC3B,MAA6B;IAE7B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAA;IACjE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAqB,EACrB,KAA4B,EAC5B,OAAgC,EAChC,eAAuB,IAAI;IAE3B,qDAAqD;IACrD,iDAAiD;IACjD,wDAAwD;IACxD,MAAM,SAAS,GAAiB,EAAE,CAAA;IAClC,IAAI,CAAC;QACH,OAAO,yBAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;IACnF,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,MAAqB,EACrB,KAA4B,EAC5B,OAAgC,EAChC,YAAoB,EACpB,SAAuB;IAEvB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAA;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAA;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAEvD,qCAAqC;IACrC,0EAA0E;IAC1E,qEAAqE;IACrE,0DAA0D;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAA;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAA;IAEpC,8DAA8D;IAE9D,yDAAyD;IACzD,4EAA4E;IAC5E,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkD,CAAA;IACjF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA,CAAO,eAAe;QAC5D,MAAM,WAAW,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAI,cAAc;QAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACvC,6CAA6C;QAC7C,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,CAAA;IACzF,CAAC;IAED,oEAAoE;IACpE,0EAA0E;IAC1E,gEAAgE;IAChE,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAA;IACD,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,IAAI,CAAC,CAAA;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAC3D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsD,CAAA;IACrF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA,CAAM,eAAe;QACjE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAI,cAAc;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9C,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,+DAA+D;IAC/D,oEAAoE;IACpE,sEAAsE;IACtE,iEAAiE;IACjE,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,gBAAgB,GAAe,EAAE,CAAA;IACvC,MAAM,gBAAgB,GAAe,EAAE,CAAA;IACvC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE;QAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEhE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;QAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QAC9B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,6BAA6B;IAC7B,0EAA0E;IAC1E,6EAA6E;IAC7E,0EAA0E;IAC1E,mEAAmE;IACnE,+EAA+E;IAC/E,+EAA+E;IAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACrD,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;IACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IACrC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxD,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAA;IAEhD,IAAI,YAA0B,CAAA;IAC9B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAC1F,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAC1F,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QAClE,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,wDAAwD;IACxD,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,wBAAwB,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxD,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QAClC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC3D,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;QAC7B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;YAC9D,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAAC,CAAC;QACxF,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC3D,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;QAC7B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;YAC9D,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAAC,CAAC;QACxF,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,KAAK,KAAK,CAAC,CAAA;IAExC,yDAAyD;IACzD,oFAAoF;IACpF,4EAA4E;IAC5E,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,MAAM,iBAAiB,GAAa,EAAE,CAAA;IACtC,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,MAAM,UAAU,GAAW,EAAE,CAAA;IAC7B,MAAM,aAAa,GAAG,EAAE,CAAA;IAExB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAEzC,oDAAoD;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE7C,IAAI,QAAoB,CAAA;QACxB,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,uEAAuE;YACvE,8CAA8C;YAC9C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAChD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,qDAAqD;YACrD,QAAQ,GAAG,gCAAgC,CACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,aAAa,CACrE,CAAA;YACD,8DAA8D;YAC9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAClF,QAAQ,GAAG,EAAE,CAAA;gBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAChC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;oBACxE,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;oBAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAClF,QAAQ,GAAG,EAAE,CAAA;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;gBACxE,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAA;QACjD,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEnB,kBAAkB;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QAEzC,uEAAuE;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAClF,eAAe,IAAI,OAAO,CAAA;QAE1B,oFAAoF;QACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAE1E,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAA;QAEvC,sCAAsC;QACtC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAA;YACjD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7C,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,eAAe,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC5D,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACtB,CAAC;YACD,+CAA+C;YAC/C,IAAI,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC1E,eAAe,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAA;gBACtE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC3C,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,GAAG,YAAY,CAAA;QAE3D,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC;YACvF,UAAU,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;YACjC,CAAC,EAAE,CAAC,EAAE,sCAAsC;YAC5C,CAAC,EAAE,CAAC,EAAE,mBAAmB;YACzB,MAAM,EAAE,YAAY,EAAE,iBAAiB;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,MAAM,UAAU,GAAW,EAAE,CAAA;IAE7B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;QAEtB,yEAAyE;QACzE,iEAAiE;QACjE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/C,2DAA2D;QAC3D,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAEpE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,aAAa,IAAI,IAAI,CAAA;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QACpB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEnB,8EAA8E;QAC9E,2EAA2E;QAC3E,sEAAsE;QACtE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACxB,IAAI,WAAW,KAAK,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;oBAC3C,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;oBACzB,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC7B,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC/B,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,UAAU;gBAAE,MAAM,GAAG,UAAU,CAAA;QACrC,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAE/B,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAE7C,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC;YACtF,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YACrE,CAAC,EAAE,CAAC,EAAE,sCAAsC;YAC5C,CAAC,EAAE,CAAC,EAAE,mBAAmB;YACzB,MAAM,EAAE,QAAQ,EAAE,QAAQ;SAC3B,CAAC,CAAA;QAEF,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,MAAM,gBAAgB,GAAa,EAAE,CAAA;IACrC,MAAM,gBAAgB,GAAa,EAAE,CAAA;IAErC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CACxC;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAC1C;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA;QAClD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CACxC;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAC1C;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA;QACjD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IACvG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7C,CAAA;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;IAEtD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QAC7C,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;QAC1D,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;QACtF,IAAI,IAAI,GAAG,SAAS;YAAE,KAAK,IAAI,EAAE,CAAA;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAW,CAAA;QAC3C,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,GAAG;YAAE,KAAK,GAAG,CAAC,CAClB;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC/E;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QACpD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACpC,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAW,CAAA;QAC/C,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,YAAY,GAAG,CAAC,CAAA;QAE5C,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;QAC9D,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,IAAI,EAAE,CAAA;QAClE,IAAI,IAAI;YAAE,KAAK,IAAI,EAAE,CAAA;QACrB,IAAI,WAAW;YAAE,KAAK,IAAI,EAAE,CAAA;QAC5B,IAAI,MAAM,GAAG,WAAW;YAAE,KAAK,IAAI,EAAE,CAAA;QACrC,IAAI,CAAC,GAAG;YAAE,KAAK,GAAG,CAAC,CAClB;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC/E;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAC9E,CAAC;IAED,wDAAwD;IACxD,MAAM,SAAS,GAAgB,EAAE,CAAA;IACjC,KAAK,MAAM,KAAK,IAAI,wBAAwB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAW,KAAK,CAAC,YAAY;aACtC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QACvH,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAI,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAY,EAAE,CAAC,CAAC,CAAA;QAClG,IAAI,WAAW,GAAkB,IAAI,CAAA;QACrC,IAAI,WAAqB,CAAA;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC9C,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;QACrC,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA;QACnG,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA;QAEnG,SAAS,CAAC,IAAI,CAAC;YACb,SAAS,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI;YACzE,SAAS,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YACvH,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;YAC1C,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;SAC3C,CAAC,CAAA;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IACxF,MAAM,cAAc,GAAgB,CAAC;YACnC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC9D,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM;SAC5D,CAAC,CAAA;IAEF,2BAA2B;IAC3B,MAAM,QAAQ,GAA4B;QACxC,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS;QACjD,QAAQ;QACR,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;QACzB,KAAK,EAAE;YACL,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,mBAAmB,EAAE,cAAc,CAAC,MAAM;YAC1C,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,iBAAiB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;YACzC,mBAAmB,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC;YACjD,qBAAqB,EAAE,WAAW,CAAC,MAAM;SAC1C;QACD,MAAM,EAAE;YACN,iBAAiB,EAAE,kBAAkB;YACrC,YAAY,EAAE,aAAa;YAC3B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,YAAY;SAC1B;QACD,WAAW,EAAE,cAAc;QAC3B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE;YACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAG,WAAW,CAAC,CAAC,CAAC,SAAS;YAC1E,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC;SAC7F;QACD,SAAS,EAAE;YACT,aAAa,EAAE,eAAe;YAC9B,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,SAAS;SACvB;QACD,SAAS,EAAE;YACT,gBAAgB,EAAE,cAAc;YAChC,gBAAgB,EAAE,cAAc;SACjC;KACF,CAAA;IAED,MAAM,OAAO,GAA+C;QAC1D,QAAQ,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC;QACtC,aAAa,EAAE,IAAI,YAAY,CAAC,iBAAiB,CAAC;QAClD,WAAW,EAAE,IAAI,WAAW,CAAC,eAAe,CAAC;QAC7C,OAAO,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC;QACrC,YAAY,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC;QAC/C,YAAY,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC;KAChD,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9B,CAAC;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAqB,EACrB,KAA0B,EAC1B,OAAgC,EAAE;IAElC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAElC,mBAAmB;IACnB,MAAM,cAAc,GAAgB,EAAE,CAAA;IACtC,MAAM,SAAS,GAAgB,EAAE,CAAA;IACjC,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAEhC,sBAAsB;IACtB,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,iBAAiB,GAAa,EAAE,CAAA;IACtC,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,gBAAgB,GAAa,EAAE,CAAA;IACrC,MAAM,gBAAgB,GAAa,EAAE,CAAA;IAErC,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,MAAM,aAAa,GAAW,EAAE,CAAA;IAChC,MAAM,aAAa,GAAW,EAAE,CAAA;IAEhC,oBAAoB;IACpB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,wEAAwE;QACxE,MAAM,UAAU,GAAG,qBAAqB,CACtC,MAAM,EACN,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,EACtE,EAAE,QAAQ,EAAE,OAAO,EAAE,EACrB,KAAK,CACN,CAAA;QACD,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAA;QACxC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAA;QAEtC,wBAAwB;QACxB,MAAM,OAAO,GAAI,YAAY,CAAC,WAA2B,IAAI,EAAE,CAAA;QAC/D,MAAM,UAAU,GAAI,YAAY,CAAC,MAAsB,IAAI,EAAE,CAAA;QAC7D,MAAM,SAAS,GAAI,YAAY,CAAC,KAAqB,IAAI,EAAE,CAAA;QAC3D,MAAM,SAAS,GAAI,YAAY,CAAC,KAAqB,IAAI,EAAE,CAAA;QAE3D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAA,CAAC,yCAAyC;QAEjF,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAA;QACzC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAA;QACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAc,CAAA;YACjC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA,CAAO,KAAK;YAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA,CAAO,OAAO;YAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA,CAAU,uCAAuC;YAC5D,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA,CAAU,aAAa;YAClC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA,CAAQ,0BAA0B;YAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAA,CAAE,sBAAsB;YACjD,iFAAiF;YACjF,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAA,CAAG,qBAAqB;YAChD,sCAAsC;YACtC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAA,CAAE,qBAAqB;YAChD,sCAAsC;YACtC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAc,CAAA;YACnC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA,CAAE,eAAe;YAC/B,mEAAmE;YACnE,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAW,CAAA;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAW,CAAA;YACnC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA,CAAE,mBAAmB;YAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;YAClB,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA,CAAE,mBAAmB;YAC9C,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;YACnB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;QAED,2EAA2E;QAC3E,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAA;QACjD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAc,CAAA;YAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA,CAAE,eAAe;YAChC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,KAAK,KAAK,CAAC,CAAA,CAAE,UAAU;YAC9C,+CAA+C;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAW,CAAA;YACpC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAAA,CAAE,6BAA6B;YACtE,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;YACpB,oDAAoD;YACpD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,aAAa,IAAK,IAAI,CAAC,CAAC,CAAY,CAAA;YACpC,gCAAgC;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAA6B,CAAA;YAC9C,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAA;QACjD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAc,CAAA;YAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA,CAAE,eAAe;YAChC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,KAAK,KAAK,CAAC,CAAA,CAAE,UAAU;YAC9C,+CAA+C;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;YACnC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAAA,CAAE,6BAA6B;YACtE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;YACnB,uCAAuC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAW,CAAA;YACnC,IAAI,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAA,CAAE,0CAA0C;YACzE,IAAI,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;YACnB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,eAAe,IAAK,IAAI,CAAC,CAAC,CAAY,CAAA;YACtC,eAAe;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAA6B,CAAA;YAC9C,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,MAAM,YAAY,GAAI,WAAW,CAAC,QAAwB,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QAChF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACnD,WAAW,CAAC,IAAI,CACd,SAAS,EAA2B,yBAAyB;YAC7D,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,EAAgB,iBAAiB;YACrD,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,EAAgB,gCAAgC;YACpE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,EAAgB,gBAAgB;YACpD,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAC1D,CAAA;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAI,WAAW,CAAC,aAA8B,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;QACtF,MAAM,WAAW,GAAI,WAAW,CAAC,WAA2B,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QAClF,MAAM,WAAW,GAAI,WAAW,CAAC,OAAuB,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QAE9E,mEAAmE;QACnE,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAA;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,CAAC;QACD,kFAAkF;QAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;QACrD,CAAC;QACD,6CAA6C;QAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA;QAC/C,CAAC;QAED,yBAAyB;QACzB,MAAM,gBAAgB,GAAI,WAAW,CAAC,YAA4B,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,gBAAgB,GAAI,WAAW,CAAC,YAA4B,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC;QAED,6DAA6D;QAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;QACvD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAA;YAC7D,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAW,CAC/C;YAAC,QAAQ,CAAC,aAAa,CAAe,CAAC,EAAE,CAAC,GAAG,OAAO,GAAG,YAAY,CAAA;QACtE,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC;QAC5B,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IAEtC,yDAAyD;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7C,CAAA;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;IAEtD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QAC7C,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;QAC1D,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;QACtF,IAAI,IAAI,GAAG,SAAS;YAAE,KAAK,IAAI,EAAE,CAAA;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAW,CAAA;QAC3C,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,GAAG;YAAE,KAAK,GAAG,CAAC,CAClB;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC/E;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAA;QAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAW,CAAA;QAC3C,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,CAAA;QAC1C,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;QAC9D,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,IAAI,EAAE,CAAA;QAClE,IAAI,MAAM,GAAG,WAAW;YAAE,KAAK,IAAI,EAAE,CAAA;QACrC,IAAI,CAAC,GAAG;YAAE,KAAK,GAAG,CAAC,CAClB;QAAC,QAAQ,CAAC,EAAE,CAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChF,6BAA6B;IAC/B,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAA4B;QACxC,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS;QACjD,QAAQ;QACR,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC;QAC3B,KAAK,EAAE;YACL,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,mBAAmB,EAAE,cAAc,CAAC,MAAM;YAC1C,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,iBAAiB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;YACzC,mBAAmB,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC;YACjD,qBAAqB,EAAE,WAAW,CAAC,MAAM;SAC1C;QACD,MAAM,EAAE;YACN,iBAAiB,EAAE,kBAAkB;YACrC,YAAY,EAAE,aAAa;YAC3B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,YAAY;SAC1B;QACD,WAAW,EAAE,cAAc;QAC3B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE;YACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAG,WAAW,CAAC,CAAC,CAAC,SAAS;YAC1E,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC;SAC7F;QACD,SAAS,EAAE;YACT,aAAa,EAAE,eAAe;YAC9B,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,SAAS;SACvB;QACD,SAAS,EAAE;YACT,gBAAgB,EAAE,cAAc;YAChC,gBAAgB,EAAE,cAAc;SACjC;KACF,CAAA;IAED,MAAM,OAAO,GAA+C;QAC1D,QAAQ,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC;QACtC,aAAa,EAAE,IAAI,YAAY,CAAC,iBAAiB,CAAC;QAClD,WAAW,EAAE,IAAI,WAAW,CAAC,eAAe,CAAC;QAC7C,OAAO,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC;QACrC,YAAY,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC;QAC/C,YAAY,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC;KAChD,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9B,CAAC;AAmBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAqB,EACrB,KAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAA;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAA;IAEpC,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAEjE,MAAM,gBAAgB,GAAe,EAAE,CAAA;IACvC,MAAM,gBAAgB,GAAe,EAAE,CAAA;IACvC,MAAM,kBAAkB,GAAe,EAAE,CAAA;IACzC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE;QAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEhE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QAC9B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACb,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAClB,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE/B,wDAAwD;QACxD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;QACnE,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/B,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,CAAA;YACnE,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACd,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;QACD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAA;AACnE,CAAC","sourcesContent":["import type { BrepHandle, BrepMeshResult, BrepBoundingBox, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asEdgeId, asFaceId, asOccurrenceId, asShapeId } from '../identity'\n\n/**\n * Safe getBoundingBox wrapper: tries useTriangulation=false first,\n * falls back to true, then finally computes from mesh positions.\n * This handles compound shapes from boolean operations where OCCT's\n * getBoundingBox may fail in the browser WASM environment.\n */\nfunction tryGetBoundingBox(\n kernel: { getBoundingBox(s: BrepHandle, t: boolean): BrepBoundingBox },\n shape: BrepHandle,\n meshPositions?: Float32Array,\n): BrepBoundingBox {\n try {\n return kernel.getBoundingBox(shape, false)\n } catch {\n // try with triangulation\n }\n try {\n return kernel.getBoundingBox(shape, true)\n } catch {\n // fall through to mesh-based computation\n }\n // Final fallback: compute bbox from mesh vertex positions\n if (meshPositions && meshPositions.length >= 3) {\n let xmin = Infinity, ymin = Infinity, zmin = Infinity\n let xmax = -Infinity, ymax = -Infinity, zmax = -Infinity\n for (let i = 0; i < meshPositions.length; i += 3) {\n const x = meshPositions[i], y = meshPositions[i + 1], z = meshPositions[i + 2]\n if (x < xmin) xmin = x\n if (y < ymin) ymin = y\n if (z < zmin) zmin = z\n if (x > xmax) xmax = x\n if (y > ymax) ymax = y\n if (z > zmax) zmax = z\n }\n return { xmin, ymin, zmin, xmax, ymax, zmax }\n }\n // Last resort: return a default bbox\n return { xmin: -100, ymin: -100, zmin: -100, xmax: 100, ymax: 100, zmax: 100 }\n}\n\n// Topology data stays in mm — the viewer's buildSelectorRuntime is called\n// with scale:1 (scene base unit is mm), so no conversion needed.\n\n// OCCT's TopTools_ShapeMapHasher returns a hash that the C++ facade\n// reduces modulo 2147483647 (INT32_MAX). All kernel-generated hashes\n// (faceGroups, edgeGroups, edgeToFaceMap) use this same bound, so we\n// must pass 2147483647 to hashCode() for the hashes to match.\nconst HASH_BOUND = 2147483647\n// Python SelectorOptions(digits=6) — 所有浮点值输出前舍入到 6 位小数\nconst ROUND_DIGITS = 6\n\nconst OCCURRENCE_COLUMNS = [\n 'id', 'path', 'name', 'sourceName', 'parentId', 'transform',\n 'bbox', 'shapeStart', 'shapeCount', 'faceStart', 'faceCount',\n 'edgeStart', 'edgeCount',\n]\n\nconst SHAPE_COLUMNS = [\n 'id', 'occurrenceId', 'ordinal', 'kind', 'bbox', 'center',\n 'area', 'volume', 'faceStart', 'faceCount', 'edgeStart', 'edgeCount',\n]\n\nconst FACE_COLUMNS = [\n 'id', 'occurrenceId', 'shapeId', 'ordinal', 'surfaceType',\n 'area', 'center', 'normal', 'bbox', 'edgeStart', 'edgeCount',\n 'relevance', 'flags', 'params', 'triangleStart', 'triangleCount',\n]\n\nconst EDGE_COLUMNS = [\n 'id', 'occurrenceId', 'shapeId', 'ordinal', 'curveType',\n 'length', 'center', 'bbox', 'faceStart', 'faceCount',\n 'relevance', 'flags', 'params', 'segmentStart', 'segmentCount',\n]\n\nconst IDENTITY_16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]\n\ninterface SelectorManifestOptions {\n stepHash?: string\n cadPath?: string\n}\n\ninterface BBox {\n min: number[]\n max: number[]\n}\n\n/** Input for building a per-part selector manifest. */\nexport interface SelectorManifestInput {\n shapeHandle: BrepHandle\n meshWithGroups: BrepMeshResult\n}\n\nfunction bboxFromOcc(bb: BrepBoundingBox): BBox {\n return { min: [bb.xmin, bb.ymin, bb.zmin], max: [bb.xmax, bb.ymax, bb.zmax] }\n}\n\nfunction bboxCenter(bbox: BBox): number[] {\n return [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n}\n\nfunction bboxArray(bbox: BBox): Record<string, number[]> {\n return { min: roundPoint(bbox.min), max: roundPoint(bbox.max) }\n}\n\nfunction vec3ToArray(v: BrepVec3): number[] {\n return [v.x, v.y, v.z]\n}\n\n// ── Rounding helpers (match Python _round_value / _round_point with digits=6) ──\nfunction roundVal(v: number, digits: number = ROUND_DIGITS): number {\n if (!Number.isFinite(v)) return v\n const p = Math.pow(10, digits)\n return Math.round(v * p) / p\n}\n\nfunction roundPoint(p: number[], digits: number = ROUND_DIGITS): number[] {\n return [roundVal(p[0], digits), roundVal(p[1], digits), roundVal(p[2], digits)]\n}\n\nfunction mergeBboxes(bboxes: BBox[]): BBox {\n const min = [Infinity, Infinity, Infinity]\n const max = [-Infinity, -Infinity, -Infinity]\n for (const b of bboxes) {\n if (b.min[0] < min[0]) min[0] = b.min[0]\n if (b.min[1] < min[1]) min[1] = b.min[1]\n if (b.min[2] < min[2]) min[2] = b.min[2]\n if (b.max[0] > max[0]) max[0] = b.max[0]\n if (b.max[1] > max[1]) max[1] = b.max[1]\n if (b.max[2] > max[2]) max[2] = b.max[2]\n }\n return { min, max }\n}\n\n// ── BBox with center/size/diag (matches Python _bbox_from_points) ──\ninterface FullBBox {\n min: number[]\n max: number[]\n center: number[]\n size: number[]\n diag: number\n}\n\nfunction fullBBoxFromPoints(points: number[][]): FullBBox {\n if (points.length === 0) {\n return { min: [0, 0, 0], max: [0, 0, 0], center: [0, 0, 0], size: [0, 0, 0], diag: 0 }\n }\n let minX = points[0][0], maxX = points[0][0]\n let minY = points[0][1], maxY = points[0][1]\n let minZ = points[0][2], maxZ = points[0][2]\n for (let i = 1; i < points.length; i++) {\n const p = points[i]\n if (p[0] < minX) minX = p[0]\n if (p[0] > maxX) maxX = p[0]\n if (p[1] < minY) minY = p[1]\n if (p[1] > maxY) maxY = p[1]\n if (p[2] < minZ) minZ = p[2]\n if (p[2] > maxZ) maxZ = p[2]\n }\n const sizeX = maxX - minX\n const sizeY = maxY - minY\n const sizeZ = maxZ - minZ\n return {\n min: [minX, minY, minZ],\n max: [maxX, maxY, maxZ],\n center: [minX + sizeX * 0.5, minY + sizeY * 0.5, minZ + sizeZ * 0.5],\n size: [sizeX, sizeY, sizeZ],\n diag: Math.sqrt(sizeX * sizeX + sizeY * sizeY + sizeZ * sizeZ),\n }\n}\n\n// ── Cross product of AB x AC ──\nfunction cross(a: number[], b: number[], c: number[]): [number, number, number] {\n const abx = b[0] - a[0]\n const aby = b[1] - a[1]\n const abz = b[2] - a[2]\n const acx = c[0] - a[0]\n const acy = c[1] - a[1]\n const acz = c[2] - a[2]\n return [\n aby * acz - abz * acy,\n abz * acx - abx * acz,\n abx * acy - aby * acx,\n ]\n}\n\nfunction normalize(v: number[]): number[] | null {\n const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])\n if (len <= 1e-12) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\nfunction distance(a: number[], b: number[]): number {\n const dx = a[0] - b[0]\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n return Math.sqrt(dx * dx + dy * dy + dz * dz)\n}\n\n// ── Polyline helpers (matches Python _dedupe_consecutive, _decimate_polyline, _polyline_length, _polyline_center) ──\n\nfunction dedupeConsecutive(points: number[][], tolerance: number): number[][] {\n if (points.length === 0) return points\n const deduped = [points[0]]\n for (let i = 1; i < points.length; i++) {\n if (distance(deduped[deduped.length - 1], points[i]) > tolerance) {\n deduped.push(points[i])\n }\n }\n return deduped\n}\n\nfunction decimatePolyline(points: number[][], maxPoints: number): number[][] {\n if (maxPoints <= 1 || points.length <= maxPoints) return points\n const stride = (points.length - 1) / (maxPoints - 1)\n const result: number[][] = []\n let lastIndex = -1\n for (let i = 0; i < maxPoints; i++) {\n let index = Math.round(i * stride)\n if (index >= points.length) index = points.length - 1\n if (index !== lastIndex) {\n result.push(points[index])\n lastIndex = index\n }\n }\n if (result.length > 0 && result[result.length - 1] !== points[points.length - 1]) {\n result[result.length - 1] = points[points.length - 1]\n }\n return result\n}\n\nfunction polylineLength(points: number[][], closed: boolean): number {\n if (points.length < 2) return 0\n let total = 0\n for (let i = 0; i < points.length - 1; i++) {\n total += distance(points[i], points[i + 1])\n }\n if (closed && distance(points[0], points[points.length - 1]) > 1e-9) {\n total += distance(points[points.length - 1], points[0])\n }\n return total\n}\n\nfunction polylineCenter(points: number[][]): number[] {\n if (points.length === 0) return [0, 0, 0]\n let tx = 0, ty = 0, tz = 0\n for (const p of points) {\n tx += p[0]\n ty += p[1]\n tz += p[2]\n }\n const inv = 1 / points.length\n return [tx * inv, ty * inv, tz * inv]\n}\n\n// ── Edge polyline extraction from wireframe with dedup/decimation ──\n// wireframe().edgeGroups format: [pointStart_float, pointCount_float, edgeHash]\n// pointStart is a float offset into edgeData.points; pointCount is the number\n// of floats (not points) for this edge.\nfunction extractEdgePolylineFromWireframe(\n edgePoints: Float32Array,\n pointStart: number,\n pointCount: number,\n maxEdgePoints: number,\n): number[][] {\n if (pointCount < 6) return [] // need at least 2 points (6 floats)\n const numPoints = Math.floor(pointCount / 3)\n const raw: number[][] = []\n for (let p = 0; p < numPoints; p++) {\n const off = pointStart + p * 3\n raw.push([edgePoints[off], edgePoints[off + 1], edgePoints[off + 2]])\n }\n let points = dedupeConsecutive(raw, 1e-9)\n if (points.length > 1 && maxEdgePoints > 1) {\n points = decimatePolyline(points, maxEdgePoints)\n }\n return points\n}\n\n// ── Compute geometric axis from surface tangents (unoriented by face) ──\n// For a parametric surface S(u,v):\n// dS/du ≈ (S(u+du,v) - S(u,v))/du\n// dS/dv ≈ (S(u,v+dv) - S(u,v))/dv\n// axis = normalize(cross(dS/du, dS/dv))\nfunction geometricNormal(\n kernel: BrepEngineApi,\n face: BrepHandle,\n u: number,\n v: number,\n): number[] | null {\n const du = 1e-4\n const dv = 1e-4\n const p00 = vec3ToArray(kernel.pointOnSurface(face, u, v))\n const p10 = vec3ToArray(kernel.pointOnSurface(face, u + du, v))\n const p01 = vec3ToArray(kernel.pointOnSurface(face, u, v + dv))\n const dSu: number[] = [p10[0] - p00[0], p10[1] - p00[1], p10[2] - p00[2]]\n const dSv: number[] = [p01[0] - p00[0], p01[1] - p00[1], p01[2] - p00[2]]\n const crossVec: number[] = [\n dSu[1] * dSv[2] - dSu[2] * dSv[1],\n dSu[2] * dSv[0] - dSu[0] * dSv[2],\n dSu[0] * dSv[1] - dSu[1] * dSv[0],\n ]\n return normalize(crossVec)\n}\n\n// ── Surface params (matches Python _surface_params exactly) ──\nfunction getSurfaceParams(kernel: BrepEngineApi, face: BrepHandle): Record<string, unknown> | null {\n const surfaceType = kernel.surfaceType(face)\n const params: Record<string, unknown> = {}\n const uv = kernel.uvBounds(face)\n const uMin = uv.uMin, vMin = uv.vMin\n\n if (surfaceType === 'plane') {\n // Python: plane.Location() = origin, plane.Axis().Direction() = axis\n // S(u,v) = O + u*XDir + v*YDir, so S(0,0) = O = origin\n params.origin = roundPoint(vec3ToArray(kernel.pointOnSurface(face, 0, 0)))\n const axis = geometricNormal(kernel, face, uMin, vMin)\n if (axis) params.axis = roundPoint(axis)\n } else if (surfaceType === 'cylinder') {\n // Python: cylinder.Location() = point on axis, cylinder.Axis().Direction() = axis direction\n // Key order: origin, axis, radius (matches Python output)\n const cyl = kernel.getFaceCylinderData(face)\n\n // Compute axis direction from V-direction: S(u,v+1) - S(u,v) = Axis direction\n const p0 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin))\n const p1 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin + 1))\n const axisDir = normalize([p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]])\n if (axisDir && cyl) {\n // Compute axis origin using surfaceNormal API (exact, no finite-difference error).\n // surfaceNormal includes face orientation, so correct for reversed faces.\n let sn = kernel.surfaceNormal(face, uMin, vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n // P - R * outward_geometric_normal = point on cylinder axis\n const origin: number[] = [\n p0[0] - cyl.radius * sn.x,\n p0[1] - cyl.radius * sn.y,\n p0[2] - cyl.radius * sn.z,\n ]\n params.origin = roundPoint(origin)\n params.axis = roundPoint(axisDir)\n params.radius = roundVal(cyl.radius)\n }\n } else if (surfaceType === 'cone') {\n const p0 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin))\n const p1 = vec3ToArray(kernel.pointOnSurface(face, uMin, vMin + 1))\n const axisDir = normalize([p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]])\n if (axisDir) {\n params.origin = roundPoint(p0)\n params.axis = roundPoint(axisDir)\n }\n } else if (surfaceType === 'sphere') {\n // Python: sphere.Location() = center\n const center = kernel.surfaceCenterOfMass(face)\n params.center = roundPoint(vec3ToArray(center))\n } else if (surfaceType === 'torus') {\n // Python: torus.Location() = center on axis\n const center = kernel.surfaceCenterOfMass(face)\n params.center = roundPoint(vec3ToArray(center))\n const gn = geometricNormal(kernel, face, uMin, vMin)\n if (gn) params.axis = roundPoint(gn)\n }\n\n return Object.keys(params).length > 0 ? params : null\n}\n\n// ── Curve params (matches Python _curve_params) ──\nfunction getCurveParams(kernel: BrepEngineApi, edge: BrepHandle): Record<string, unknown> | null {\n const curveType = kernel.curveType(edge)\n const params: Record<string, unknown> = {}\n\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n params.origin = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, first)))\n params.direction = roundPoint(vec3ToArray(kernel.curveTangent(edge, first)))\n } else if (curveType === 'circle') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n const p0 = kernel.curvePointAtParam(edge, first)\n const pm = kernel.curvePointAtParam(edge, mid)\n params.center = roundPoint([(p0.x + pm.x) / 2, (p0.y + pm.y) / 2, (p0.z + pm.z) / 2])\n const quarter = (first * 3 + last) / 4\n const tA = kernel.curveTangent(edge, first)\n const tQ = kernel.curveTangent(edge, quarter)\n const crossVec: number[] = [\n tA.y * tQ.z - tA.z * tQ.y,\n tA.z * tQ.x - tA.x * tQ.z,\n tA.x * tQ.y - tA.y * tQ.x,\n ]\n const norm = normalize(crossVec)\n if (norm) params.axis = roundPoint(norm)\n const c = params.center as number[]\n const dx = p0.x - c[0], dy = p0.y - c[1], dz = p0.z - c[2]\n params.radius = roundVal(Math.sqrt(dx * dx + dy * dy + dz * dz))\n } else if (curveType === 'ellipse') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'hyperbola') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'parabola') {\n const { first, last } = kernel.curveParameters(edge)\n const mid = (first + last) / 2\n params.center = roundPoint(vec3ToArray(kernel.curvePointAtParam(edge, mid)))\n } else if (curveType === 'bezier' || curveType === 'bspline') {\n try {\n const nc = kernel.getNurbsCurveData(edge)\n if (nc) {\n params.degree = nc.degree\n params.periodic = nc.periodic\n params.rational = nc.rational\n }\n } catch {\n // getNurbsCurveData may fail for non-NURBS edges\n }\n }\n\n return Object.keys(params).length > 0 ? params : null\n}\n\n// ── Face flags (matches Python _face_flags) ──\nfunction faceFlags(referenceable: boolean): number {\n return referenceable ? 0 : 1\n}\n\n// ── Edge flags (matches Python _edge_flags) ──\nfunction edgeFlags(closed: boolean, degenerated: boolean, seam: boolean, referenceable: boolean): number {\n let flags = 0\n if (closed) flags |= 1\n if (degenerated) flags |= 2\n if (seam) flags |= 4\n if (!referenceable) flags |= 8\n return flags\n}\n\n// ── Extract face geometry from mesh data (matches Python _extract_face_geometry) ──\ninterface FaceGeometry {\n area: number\n center: number[]\n normal: number[] | null\n bbox: BBox\n triangleCount: number\n}\n\nfunction extractFaceGeometry(\n positions: Float32Array,\n indices: Uint32Array,\n triStart: number,\n triCount: number,\n): FaceGeometry {\n if (triCount === 0) {\n return { area: 0, center: [0, 0, 0], normal: null, bbox: { min: [0, 0, 0], max: [0, 0, 0] }, triangleCount: 0 }\n }\n\n let areaSum = 0\n const centroidSum = [0, 0, 0]\n const normalSum = [0, 0, 0]\n const allNodes: number[][] = []\n const nodeSet = new Set<number>()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices[(triStart + t) * 3]\n const i1 = indices[(triStart + t) * 3 + 1]\n const i2 = indices[(triStart + t) * 3 + 2]\n nodeSet.add(i0)\n nodeSet.add(i1)\n nodeSet.add(i2)\n\n const p0: number[] = [positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2]]\n const p1: number[] = [positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]]\n const p2: number[] = [positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]]\n\n const [nx, ny, nz] = cross(p0, p1, p2)\n const twiceArea = Math.sqrt(nx * nx + ny * ny + nz * nz)\n // Python uses twiceArea <= 1e-9 to skip degenerate triangles\n if (twiceArea <= 1e-9) continue\n\n const area = twiceArea * 0.5\n centroidSum[0] += (p0[0] + p1[0] + p2[0]) * area / 3\n centroidSum[1] += (p0[1] + p1[1] + p2[1]) * area / 3\n centroidSum[2] += (p0[2] + p1[2] + p2[2]) * area / 3\n areaSum += area\n\n // Area-weighted normal sum (matches Python: raw cross products, not unit vectors).\n // Python sums the raw cross products (proportional to triangle area) and\n // normalizes at the end. This gives the area-weighted face normal.\n normalSum[0] += nx\n normalSum[1] += ny\n normalSum[2] += nz\n }\n\n for (const ni of nodeSet) {\n allNodes.push([positions[ni * 3], positions[ni * 3 + 1], positions[ni * 3 + 2]])\n }\n\n let center: number[]\n if (allNodes.length === 0) {\n center = [0, 0, 0]\n } else if (areaSum > 1e-12) {\n center = [centroidSum[0] / areaSum, centroidSum[1] / areaSum, centroidSum[2] / areaSum]\n } else {\n center = fullBBoxFromPoints(allNodes).center\n }\n\n const normal = normalize([normalSum[0], normalSum[1], normalSum[2]])\n const b = fullBBoxFromPoints(allNodes)\n const bbox: BBox = { min: b.min, max: b.max }\n\n return { area: areaSum, center, normal, bbox, triangleCount: areaSum > 0 ? 1 : 0 }\n}\n\n// ── Build a hash→ordinal lookup for fast edge matching ──\n// Uses the same TopTools_ShapeMapHasher as the C++ facade, so hashes\n// are consistent across getSubShapes, wireframe, meshShape, and hashCode.\n// Collisions (extremely rare with HASH_BOUND=INT32_MAX) are resolved by\n// isSame() — the OCCT identity check.\nfunction buildEdgeOrdLookup(\n kernel: BrepEngineApi,\n edgeHandles: BrepHandle[],\n): Map<number, number[]> {\n const lookup = new Map<number, number[]>()\n for (let ei = 0; ei < edgeHandles.length; ei++) {\n const h = kernel.hashCode(edgeHandles[ei], HASH_BOUND)\n const list = lookup.get(h)\n if (list) list.push(ei + 1)\n else lookup.set(h, [ei + 1])\n }\n return lookup\n}\n\nfunction buildFaceOrdLookup(\n kernel: BrepEngineApi,\n faceHandles: BrepHandle[],\n): Map<number, number[]> {\n const lookup = new Map<number, number[]>()\n for (let fi = 0; fi < faceHandles.length; fi++) {\n const h = kernel.hashCode(faceHandles[fi], HASH_BOUND)\n const list = lookup.get(h)\n if (list) list.push(fi + 1)\n else lookup.set(h, [fi + 1])\n }\n return lookup\n}\n\n// Find the global ordinal of a sub-shape by hash lookup + isSame collision resolution\nfunction findOrdinal(\n kernel: BrepEngineApi,\n subShape: BrepHandle,\n globalHandles: BrepHandle[],\n lookup: Map<number, number[]>,\n): number | undefined {\n const h = kernel.hashCode(subShape, HASH_BOUND)\n const candidates = lookup.get(h)\n if (!candidates) return undefined\n for (const ord of candidates) {\n if (kernel.isSame(subShape, globalHandles[ord - 1])) return ord\n }\n return undefined\n}\n\n/**\n * Build a selector manifest for a single part's topology.\n *\n * Enumerates the shape's faces and edges and their relations, extracts edge\n * polylines from the kernel wireframe and face geometry from the mesh, computes\n * relevance scores, and assembles everything into a columnar selector manifest\n * plus its binary attribute buffers.\n *\n * @param kernel - the OCCT kernel\n * @param input - the shape handle and mesh-with-groups input\n * @param options - optional metadata (step hash and CAD path)\n * @param occurrenceId - the occurrence ID to prefix this part's ids (default 'o1')\n * @returns the assembled manifest and its binary buffers\n */\nexport function buildSelectorManifest(\n kernel: BrepEngineApi,\n input: SelectorManifestInput,\n options: SelectorManifestOptions,\n occurrenceId: string = 'o1',\n): { manifest: Record<string, unknown>; buffers: Record<string, Float32Array | Uint32Array> } {\n // getSubShapes 返回的每个子形都是独立 arena 句柄,manifest 构建只用它们做\n // 查询(输出是纯数据),全部登记到 transient 并在 finally 批量释放——否则\n // 每次构建泄漏 O(faces + edges) 个存活句柄(compat e2e ⑦ 实测 +63/次)。\n const transient: BrepHandle[] = []\n try {\n return buildSelectorManifestCore(kernel, input, options, occurrenceId, transient)\n } finally {\n for (const h of transient) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\nfunction buildSelectorManifestCore(\n kernel: BrepEngineApi,\n input: SelectorManifestInput,\n options: SelectorManifestOptions,\n occurrenceId: string,\n transient: BrepHandle[],\n): { manifest: Record<string, unknown>; buffers: Record<string, Float32Array | Uint32Array> } {\n const { stepHash, cadPath } = options\n const shape = input.shapeHandle\n const mesh = input.meshWithGroups\n const posArr = mesh.positions\n const normArr = mesh.normals\n const idxArr = mesh.indices\n const faceGroups = mesh.faceGroups ?? new Int32Array(0)\n\n // ── 1. Enumerate faces and edges ──\n // getSubShapes uses TopExp::MapShapes + NCollection_IndexedMap — the same\n // enumeration method as wireframe() and meshShape(), so ordinals are\n // consistent with kernel-generated faceGroups/edgeGroups.\n const faceHandles = kernel.getSubShapes(shape, 'face')\n const edgeHandles = kernel.getSubShapes(shape, 'edge')\n transient.push(...faceHandles, ...edgeHandles)\n const faceCount = faceHandles.length\n const edgeCount = edgeHandles.length\n\n // ── 2. Build hash→data maps from kernel-generated buffers ──\n\n // Face hash → {triStart, triCount} from mesh.faceGroups.\n // faceGroups format: [triStart_idx, triCount_idx, faceHash] — values are in\n // index units (3 per triangle). Faces without triangulation are skipped by\n // the C++ side, so faceGroups may have fewer entries than faceCount.\n const faceGroupByHash = new Map<number, { triStart: number; triCount: number }>()\n for (let gi = 0; gi * 3 + 2 < faceGroups.length; gi++) {\n const triStartIdx = faceGroups[gi * 3] // index offset\n const triCountIdx = faceGroups[gi * 3 + 1] // index count\n const faceHash = faceGroups[gi * 3 + 2]\n // Convert from index units to triangle units\n faceGroupByHash.set(faceHash, { triStart: triStartIdx / 3, triCount: triCountIdx / 3 })\n }\n\n // Edge hash → {pointStart, pointCount} from wireframe().edgeGroups.\n // wireframe() uses TopExp::MapShapes + IndexedMap (same as getSubShapes),\n // so edge ordinals match. edgeGroups format: [pointStart_float,\n // pointCount_float, edgeHash] — values are in float units (3 per point).\n // Each edge gets its own independent polyline (NOT connected chains).\n const shapeBbox = tryGetBoundingBox(kernel, shape, posArr)\n const shapeDiag = Math.sqrt(\n (shapeBbox.xmax - shapeBbox.xmin) ** 2 +\n (shapeBbox.ymax - shapeBbox.ymin) ** 2 +\n (shapeBbox.zmax - shapeBbox.zmin) ** 2,\n )\n // Deflection proportional to shape size: 0.1% of diagonal, min 0.01mm.\n // GCPnts_TangentialDeflection adapts to curvature automatically.\n const wireframeDeflection = Math.max(shapeDiag * 0.001, 0.01)\n const wfData = kernel.wireframe(shape, wireframeDeflection)\n const edgeGroupByHash = new Map<number, { pointStart: number; pointCount: number }>()\n for (let ei = 0; ei * 3 + 2 < wfData.edgeGroups.length; ei++) {\n const pointStart = wfData.edgeGroups[ei * 3] // float offset\n const pointCount = wfData.edgeGroups[ei * 3 + 1] // float count\n const edgeHash = wfData.edgeGroups[ei * 3 + 2]\n edgeGroupByHash.set(edgeHash, { pointStart, pointCount })\n }\n\n // ── 3. Build face→edge and edge→face ordinals via isSame() ──\n // For each face, enumerate its edges (getSubShapes deduplicates via\n // IndexedMap, so seam edges appear once). Match each face edge to its\n // global ordinal by hash lookup + isSame() collision resolution.\n const edgeOrdLookup = buildEdgeOrdLookup(kernel, edgeHandles)\n const faceEdgeOrdinals: number[][] = []\n const edgeFaceOrdinals: number[][] = []\n for (let ei = 0; ei < edgeCount; ei++) edgeFaceOrdinals.push([])\n\n for (let fi = 0; fi < faceCount; fi++) {\n const faceEdges = kernel.getSubShapes(faceHandles[fi], 'edge')\n transient.push(...faceEdges)\n const ords: number[] = []\n const seen = new Set<number>()\n for (const fe of faceEdges) {\n const ord = findOrdinal(kernel, fe, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !seen.has(ord)) {\n seen.add(ord)\n ords.push(ord)\n edgeFaceOrdinals[ord - 1].push(fi + 1)\n }\n }\n faceEdgeOrdinals.push(ords)\n }\n\n // ── 4. Detect seam edges ──\n // Real gap: no BRep_Tool.IsClosed(edge, face) API. Heuristic: in a closed\n // solid, every edge should be shared by exactly 2 faces. An edge with only 1\n // adjacent face means it appears twice in that face's wire (once for each\n // parametric direction) — IndexedMap deduplicates, so faceCount=1.\n // This applies to ALL edge types (line, circle, etc.), not just closed curves.\n // In an open shell, boundary edges also have faceCount=1, so we check isSolid.\n const topSolids = kernel.getSubShapes(shape, 'solid')\n transient.push(...topSolids)\n const isSolid = topSolids.length > 0\n const seamEdgeSet = new Set<number>()\n for (let ei = 0; ei < edgeCount; ei++) {\n if (isSolid && edgeFaceOrdinals[ei].length === 1) {\n seamEdgeSet.add(ei + 1)\n }\n }\n\n // ── 5. Build shape entries (SOLID/SHELL/compound) ──\n const solidHandles = kernel.getSubShapes(shape, 'solid')\n const shellHandles = kernel.getSubShapes(shape, 'shell')\n transient.push(...solidHandles, ...shellHandles)\n type ShapeEntry = { ordinal: number; shape: BrepHandle; kind: string }\n let shapeEntries: ShapeEntry[]\n if (solidHandles.length > 0) {\n shapeEntries = solidHandles.map((s, i) => ({ ordinal: i + 1, shape: s, kind: 'solid' }))\n } else if (shellHandles.length > 0) {\n shapeEntries = shellHandles.map((s, i) => ({ ordinal: i + 1, shape: s, kind: 'shell' }))\n } else {\n shapeEntries = [{ ordinal: 1, shape, kind: 'compound' }]\n }\n if (shapeEntries.length === 0 && (faceCount > 0 || edgeCount > 0)) {\n shapeEntries = [{ ordinal: 1, shape, kind: 'compound' }]\n }\n\n // Build shape→face and shape→edge ordinals via isSame()\n const faceOrdLookup = buildFaceOrdLookup(kernel, faceHandles)\n const shapeEntriesWithOrdinals = shapeEntries.map(entry => {\n const faceOrds: number[] = []\n const edgeOrds: number[] = []\n const faceSeen = new Set<number>()\n const edgeSeen = new Set<number>()\n const entryFaces = kernel.getSubShapes(entry.shape, 'face')\n transient.push(...entryFaces)\n for (const f of entryFaces) {\n const ord = findOrdinal(kernel, f, faceHandles, faceOrdLookup)\n if (ord !== undefined && !faceSeen.has(ord)) { faceOrds.push(ord); faceSeen.add(ord) }\n }\n const entryEdges = kernel.getSubShapes(entry.shape, 'edge')\n transient.push(...entryEdges)\n for (const e of entryEdges) {\n const ord = findOrdinal(kernel, e, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !edgeSeen.has(ord)) { edgeOrds.push(ord); edgeSeen.add(ord) }\n }\n return { ...entry, faceOrdinals: faceOrds, edgeOrdinals: edgeOrds }\n })\n\n const occId = asOccurrenceId(occurrenceId)\n const shapeId = asShapeId(`${occId}.s1`)\n\n // ── 6. Build edge rows — wireframe polyline per edge ──\n // Each edge's polyline comes from kernel.wireframe() (GCPnts_TangentialDeflection),\n // looked up by edge hash. Line edges use exactly 2 endpoints for 1 segment.\n const edgeRows: unknown[][] = []\n const edgePositionsData: number[] = []\n const edgeIndicesData: number[] = []\n const edgeIdsData: number[] = []\n let totalEdgeLength = 0\n const edgeBboxes: BBox[] = []\n const maxEdgePoints = 30\n\n for (let ei = 0; ei < edgeCount; ei++) {\n const edge = edgeHandles[ei]\n const ordinal = ei + 1\n const curveType = kernel.curveType(edge)\n const curveLen = kernel.curveLength(edge)\n\n // Look up edge polyline from wireframe data by hash\n const edgeHash = kernel.hashCode(edge, HASH_BOUND)\n const egEntry = edgeGroupByHash.get(edgeHash)\n\n let polyline: number[][]\n if (curveType === 'line') {\n // Line edges: exactly 2 endpoints → 1 segment (wireframe also produces\n // 2 points for lines, but this guarantees it)\n const { first, last } = kernel.curveParameters(edge)\n const pt0 = kernel.curvePointAtParam(edge, first)\n const pt1 = kernel.curvePointAtParam(edge, last)\n polyline = [[pt0.x, pt0.y, pt0.z], [pt1.x, pt1.y, pt1.z]]\n } else if (egEntry) {\n // Curved edges: extract polyline from wireframe data\n polyline = extractEdgePolylineFromWireframe(\n wfData.points, egEntry.pointStart, egEntry.pointCount, maxEdgePoints,\n )\n // Fallback to curve sampling if wireframe gave too few points\n if (polyline.length < 2) {\n const { first, last } = kernel.curveParameters(edge)\n const numPts = Math.min(maxEdgePoints, Math.max(2, Math.ceil(curveLen / 7.5) + 1))\n polyline = []\n for (let p = 0; p < numPts; p++) {\n const t = numPts > 1 ? first + (last - first) * p / (numPts - 1) : first\n const pt = kernel.curvePointAtParam(edge, t)\n polyline.push([pt.x, pt.y, pt.z])\n }\n }\n } else {\n // No wireframe match — fall back to curve sampling\n const { first, last } = kernel.curveParameters(edge)\n const numPts = Math.min(maxEdgePoints, Math.max(2, Math.ceil(curveLen / 7.5) + 1))\n polyline = []\n for (let p = 0; p < numPts; p++) {\n const t = numPts > 1 ? first + (last - first) * p / (numPts - 1) : first\n const pt = kernel.curvePointAtParam(edge, t)\n polyline.push([pt.x, pt.y, pt.z])\n }\n }\n\n // Edge bbox from polyline points (matches Python _bbox_from_points).\n const edgeBBoxPts = polyline.length >= 2 ? polyline : []\n const efbb = fullBBoxFromPoints(edgeBBoxPts)\n const bb: BBox = { min: efbb.min, max: efbb.max }\n edgeBboxes.push(bb)\n\n // Edge properties\n const closed = kernel.curveIsClosed(edge)\n\n // Edge length: polyline chord length (matches Python _polyline_length)\n const edgeLen = polyline.length >= 2 ? polylineLength(polyline, closed) : curveLen\n totalEdgeLength += edgeLen\n\n // Edge center: arithmetic mean of polyline points (matches Python _polyline_center)\n const center = polyline.length >= 2 ? polylineCenter(polyline) : [0, 0, 0]\n\n const segmentStart = edgeIdsData.length\n\n // Build edge proxy data from polyline\n if (polyline.length >= 2) {\n const vertexOffset = edgePositionsData.length / 3\n for (const pt of polyline) {\n edgePositionsData.push(pt[0], pt[1], pt[2])\n }\n for (let s = 0; s < polyline.length - 1; s++) {\n edgeIndicesData.push(vertexOffset + s, vertexOffset + s + 1)\n edgeIdsData.push(ei)\n }\n // Closed edge closing segment (matches Python)\n if (closed && distance(polyline[0], polyline[polyline.length - 1]) > 1e-9) {\n edgeIndicesData.push(vertexOffset + polyline.length - 1, vertexOffset)\n edgeIdsData.push(ei)\n }\n }\n\n const params = getCurveParams(kernel, edge)\n const segmentCountFinal = edgeIdsData.length - segmentStart\n\n edgeRows.push([\n asEdgeId(`${occId}.e${ordinal}`), occId, shapeId, ordinal, curveType, roundVal(edgeLen),\n roundPoint(center), bboxArray(bb),\n 0, 0, // faceStart, faceCount — filled later\n 0, 0, // relevance, flags\n params, segmentStart, segmentCountFinal,\n ])\n }\n\n // ── 7. Build face rows — hash-based triangle lookup ──\n const faceRows: unknown[][] = []\n const faceRunData: number[] = []\n let totalFaceArea = 0\n const faceBboxes: BBox[] = []\n\n for (let fi = 0; fi < faceCount; fi++) {\n const face = faceHandles[fi]\n const ordinal = fi + 1\n\n // Look up triangle data by face hash (pure hash Map, no index fallback).\n // No match (face without triangulation) → triStart/triCount = 0.\n const fh = kernel.hashCode(face, HASH_BOUND)\n const fgEntry = faceGroupByHash.get(fh)\n const triStart = fgEntry ? fgEntry.triStart : 0\n const triCount = fgEntry ? fgEntry.triCount : 0\n\n // Extract face geometry with degenerate triangle filtering\n const geom = extractFaceGeometry(posArr, idxArr, triStart, triCount)\n\n const surfaceType = kernel.surfaceType(face)\n const area = geom.area\n totalFaceArea += area\n const center = geom.center\n const bb = geom.bbox\n faceBboxes.push(bb)\n\n // Face normal: for planar faces, use mesh-based area-weighted cross products.\n // For non-planar faces, use per-vertex normals from mesh.normals (computed\n // by OCCT's own normal estimator) averaged over the face's triangles.\n let normal = geom.normal\n if (surfaceType !== 'plane' && triCount > 0) {\n const ns = [0, 0, 0]\n for (let t = 0; t < triCount; t++) {\n for (let vi = 0; vi < 3; vi++) {\n const idx = idxArr[(triStart + t) * 3 + vi]\n ns[0] += normArr[idx * 3]\n ns[1] += normArr[idx * 3 + 1]\n ns[2] += normArr[idx * 3 + 2]\n }\n }\n const meshNormal = normalize(ns)\n if (meshNormal) normal = meshNormal\n }\n if (!normal) normal = [0, 0, 1]\n\n const params = getSurfaceParams(kernel, face)\n\n faceRows.push([\n asFaceId(`${occId}.f${ordinal}`), occId, shapeId, ordinal, surfaceType, roundVal(area),\n roundPoint(center), normal ? roundPoint(normal) : null, bboxArray(bb),\n 0, 0, // edgeStart, edgeCount — filled later\n 0, 0, // relevance, flags\n params, triStart, triCount,\n ])\n\n if (triCount > 0) {\n faceRunData.push(0, 0, triStart, triCount, fi)\n }\n }\n\n // ── 8. Build face→edge and edge→face relation tables ──\n const faceEdgeRowsData: number[] = []\n const edgeFaceRowsData: number[] = []\n\n for (let fi = 0; fi < faceCount; fi++) {\n const edgeOrds = faceEdgeOrdinals[fi]\n const edgeStart = faceEdgeRowsData.length\n ;(faceRows[fi] as unknown[])[9] = edgeStart\n ;(faceRows[fi] as unknown[])[10] = edgeOrds.length\n for (const eo of edgeOrds) {\n faceEdgeRowsData.push(eo - 1)\n }\n }\n\n for (let ei = 0; ei < edgeCount; ei++) {\n const faceOrds = edgeFaceOrdinals[ei]\n const faceStart = edgeFaceRowsData.length\n ;(edgeRows[ei] as unknown[])[8] = faceStart\n ;(edgeRows[ei] as unknown[])[9] = faceOrds.length\n for (const fo of faceOrds) {\n edgeFaceRowsData.push(fo - 1)\n }\n }\n\n // ── 9. Compute relevance scores (matches Python) ──\n const mergedBbox = faceBboxes.length > 0 ? mergeBboxes(faceBboxes) : { min: [0, 0, 0], max: [0, 0, 0] }\n const mergedDiag = Math.sqrt(\n (mergedBbox.max[0] - mergedBbox.min[0]) ** 2 +\n (mergedBbox.max[1] - mergedBbox.min[1]) ** 2 +\n (mergedBbox.max[2] - mergedBbox.min[2]) ** 2,\n )\n const totalArea = Math.max(totalFaceArea, 1e-12)\n const totalLength = Math.max(totalEdgeLength, 1e-12)\n const sizeFloor = Math.max(mergedDiag * mergedDiag * 1e-6, 1e-12)\n const lengthFloor = Math.max(mergedDiag * 1e-5, 1e-12)\n\n for (let fi = 0; fi < faceRows.length; fi++) {\n const area = faceRows[fi][5] as number\n const surfaceType = faceRows[fi][4] as string\n let score = 100 * Math.sqrt(Math.max(area, 0) / totalArea)\n if (['plane', 'cylinder', 'cone', 'sphere', 'torus'].includes(surfaceType)) score += 8\n if (area < sizeFloor) score -= 45\n const triCount = faceRows[fi][15] as number\n const ref = triCount > 0 && area > 1e-12\n if (!ref) score = 0\n ;(faceRows[fi] as unknown[])[11] = Math.max(0, Math.min(100, Math.round(score)))\n ;(faceRows[fi] as unknown[])[12] = faceFlags(ref)\n }\n\n for (let ei = 0; ei < edgeRows.length; ei++) {\n const length = edgeRows[ei][5] as number\n const curveType = edgeRows[ei][4] as string\n const edge = edgeHandles[ei]\n const closed = kernel.curveIsClosed(edge)\n const degenerated = kernel.curveLength(edge) < 1e-12\n const seam = seamEdgeSet.has(ei + 1)\n const segmentCount = edgeRows[ei][14] as number\n const ref = !degenerated && segmentCount > 0\n\n let score = 100 * Math.sqrt(Math.max(length, 0) / totalLength)\n if (['line', 'circle', 'ellipse'].includes(curveType)) score += 10\n if (seam) score -= 30\n if (degenerated) score -= 80\n if (length < lengthFloor) score -= 35\n if (!ref) score = 0\n ;(edgeRows[ei] as unknown[])[10] = Math.max(0, Math.min(100, Math.round(score)))\n ;(edgeRows[ei] as unknown[])[11] = edgeFlags(closed, degenerated, seam, ref)\n }\n\n // ── 11. Build shape rows (matches Python emit_leaf) ──\n const shapeRows: unknown[][] = []\n for (const entry of shapeEntriesWithOrdinals) {\n const bboxes: BBox[] = entry.faceOrdinals\n .map(fo => faceBboxes[fo - 1])\n .filter((b): b is BBox => !!b)\n const entryBbox = bboxes.length > 0 ? mergeBboxes(bboxes) : bboxFromOcc(tryGetBoundingBox(kernel, entry.shape, posArr))\n const entryArea = entry.faceOrdinals.reduce((sum, fo) => sum + (faceRows[fo - 1][5] as number), 0)\n let entryVolume: number | null = null\n let entryCenter: number[]\n if (entry.kind === 'solid') {\n entryVolume = kernel.getVolume(entry.shape)\n const cm = kernel.getCenterOfMass(entry.shape)\n entryCenter = [cm.x, cm.y, cm.z]\n } else {\n entryCenter = bboxCenter(entryBbox)\n }\n\n const firstFaceGlobal = entry.faceOrdinals.length > 0 ? entry.faceOrdinals[0] - 1 : faceRows.length\n const firstEdgeGlobal = entry.edgeOrdinals.length > 0 ? entry.edgeOrdinals[0] - 1 : edgeRows.length\n\n shapeRows.push([\n asShapeId(`${occId}.s${entry.ordinal}`), occId, entry.ordinal, entry.kind,\n bboxArray(entryBbox), roundPoint(entryCenter), roundVal(entryArea), entryVolume !== null ? roundVal(entryVolume) : null,\n firstFaceGlobal, entry.faceOrdinals.length,\n firstEdgeGlobal, entry.edgeOrdinals.length,\n ])\n }\n\n // ── 12. Build occurrence rows ──\n const meshBbox = faceBboxes.length > 0 ? mergedBbox : { min: [0, 0, 0], max: [0, 0, 0] }\n const occurrenceRows: unknown[][] = [[\n occId, '1', null, null, null, IDENTITY_16, bboxArray(meshBbox),\n 0, shapeRows.length, 0, faceRows.length, 0, edgeRows.length,\n ]]\n\n // ── 13. Build manifest ──\n const manifest: Record<string, unknown> = {\n schemaVersion: 2,\n profile: 'selector',\n cadRef: cadPath,\n stepPath: cadPath ? `${cadPath}.step` : undefined,\n stepHash,\n bbox: bboxArray(meshBbox),\n stats: {\n occurrenceCount: occurrenceRows.length,\n leafOccurrenceCount: occurrenceRows.length,\n shapeCount: shapeRows.length,\n faceCount: faceRows.length,\n edgeCount: edgeRows.length,\n faceProxyRunCount: faceRunData.length / 5,\n edgeProxyPointCount: edgePositionsData.length / 3,\n edgeProxySegmentCount: edgeIdsData.length,\n },\n tables: {\n occurrenceColumns: OCCURRENCE_COLUMNS,\n shapeColumns: SHAPE_COLUMNS,\n faceColumns: FACE_COLUMNS,\n edgeColumns: EDGE_COLUMNS,\n },\n occurrences: occurrenceRows,\n shapes: shapeRows,\n faces: faceRows,\n edges: edgeRows,\n faceProxy: {\n source: cadPath ? `.${cadPath.split(/[/\\\\]/).pop()!}.step.3mf` : undefined,\n runsView: 'faceRuns',\n runColumns: ['occurrenceRow', 'primitiveIndex', 'triangleStart', 'triangleCount', 'faceRow'],\n },\n edgeProxy: {\n positionsView: 'edgePositions',\n indicesView: 'edgeIndices',\n edgeIdsView: 'edgeIds',\n },\n relations: {\n faceEdgeRowsView: 'faceEdgeRows',\n edgeFaceRowsView: 'edgeFaceRows',\n },\n }\n\n const buffers: Record<string, Float32Array | Uint32Array> = {\n faceRuns: new Uint32Array(faceRunData),\n edgePositions: new Float32Array(edgePositionsData),\n edgeIndices: new Uint32Array(edgeIndicesData),\n edgeIds: new Uint32Array(edgeIdsData),\n faceEdgeRows: new Uint32Array(faceEdgeRowsData),\n edgeFaceRows: new Uint32Array(edgeFaceRowsData),\n }\n\n return { manifest, buffers }\n}\n\n// ── Assembly-level topology ──\n\n/** Input for per-part topology identification in an assembly. */\nexport interface PartTopologyInput {\n labelPath: string\n shapeHandle: BrepHandle\n meshWithGroups: BrepMeshResult\n}\n\n/** Result of assembly-level topology identification. */\nexport interface AssemblyTopologyResult {\n manifest: Record<string, unknown>\n buffers: Record<string, Float32Array | Uint32Array>\n}\n\n/**\n * Build a selector manifest for an assembly (multi-part) topology.\n *\n * For each part, runs the per-part topology identification (face/edge enumeration,\n * wireframe, relations) and merges into a single assembly manifest.\n *\n * Occurrence IDs use the part's labelPath (e.g., \"o0\", \"o0.o1\").\n *\n * Face/edge triangle ranges are per-mesh (each part has its own mesh),\n * identified by the occurrenceRow index in faceRuns.\n *\n * @param kernel - the OCCT kernel\n * @param parts - per-part topology inputs for the assembly\n * @param opts - optional step hash and CAD path metadata\n * @returns the merged assembly manifest and its binary buffers\n */\nexport function buildAssemblySelectorManifest(\n kernel: BrepEngineApi,\n parts: PartTopologyInput[],\n opts: SelectorManifestOptions = {},\n): AssemblyTopologyResult {\n const { stepHash, cadPath } = opts\n\n // Accumulated data\n const allOccurrences: unknown[][] = []\n const allShapes: unknown[][] = []\n const allFaces: unknown[][] = []\n const allEdges: unknown[][] = []\n\n // Buffer accumulators\n const faceRunData: number[] = []\n const edgePositionsData: number[] = []\n const edgeIndicesData: number[] = []\n const edgeIdsData: number[] = []\n const faceEdgeRowsData: number[] = []\n const edgeFaceRowsData: number[] = []\n\n let totalFaceArea = 0\n let totalEdgeLength = 0\n const allFaceBboxes: BBox[] = []\n const allEdgeBboxes: BBox[] = []\n\n // Process each part\n for (let partIdx = 0; partIdx < parts.length; partIdx++) {\n const part = parts[partIdx]\n const occId = asOccurrenceId(part.labelPath)\n\n // Run per-part manifest (uses the existing buildSelectorManifest logic)\n const partResult = buildSelectorManifest(\n kernel,\n { shapeHandle: part.shapeHandle, meshWithGroups: part.meshWithGroups },\n { stepHash, cadPath },\n occId,\n )\n const partManifest = partResult.manifest\n const partBuffers = partResult.buffers\n\n // Extract per-part data\n const partOcc = (partManifest.occurrences as unknown[][]) ?? []\n const partShapes = (partManifest.shapes as unknown[][]) ?? []\n const partFaces = (partManifest.faces as unknown[][]) ?? []\n const partEdges = (partManifest.edges as unknown[][]) ?? []\n\n const occRowIdx = allOccurrences.length // 0-based occurrence index for this part\n\n // Occurrence row: use labelPath as id, parentId null (flat for now)\n // CRITICAL: update shapeStart/faceStart/edgeStart to GLOBAL indices.\n // buildSelectorManifest sets them to 0 (local), so without this fix\n // every part's occurrence points to part 0's shapes/faces/edges.\n const globalShapeStart = allShapes.length\n const globalFaceStart = allFaces.length\n const globalEdgeStart = allEdges.length\n for (const occ of partOcc) {\n const row = [...occ] as unknown[]\n row[0] = occId // id\n row[1] = occId // path\n row[2] = '' // name (from XCAF, not available here)\n row[3] = '' // sourceName\n row[4] = null // parentId (flat for now)\n row[7] = globalShapeStart // shapeStart (global)\n // row[8] shapeCount — already correct (local count = global count for this part)\n row[9] = globalFaceStart // faceStart (global)\n // row[10] faceCount — already correct\n row[11] = globalEdgeStart // edgeStart (global)\n // row[12] edgeCount — already correct\n allOccurrences.push(row)\n }\n\n // Shape rows: replace occurrenceId\n for (const shape of partShapes) {\n const row = [...shape] as unknown[]\n row[1] = occId // occurrenceId\n // Update faceStart/faceCount/edgeStart/edgeCount to global indices\n const faceCount = row[9] as number\n const edgeCount = row[11] as number\n row[8] = allFaces.length // global faceStart\n row[9] = faceCount\n row[10] = allEdges.length // global edgeStart\n row[11] = edgeCount\n allShapes.push(row)\n }\n\n // Face rows: replace occurrenceId/shapeId, update triangleStart (per-mesh,\n // keep local), update edgeStart/edgeCount to global indices\n const partFaceEdgeStart = faceEdgeRowsData.length\n for (let fi = 0; fi < partFaces.length; fi++) {\n const face = [...partFaces[fi]] as unknown[]\n face[1] = occId // occurrenceId\n face[2] = asShapeId(`${occId}.s1`) // shapeId\n // Update edgeStart/edgeCount to global indices\n const edgeStart = face[9] as number\n const edgeCount = face[10] as number\n face[9] = partFaceEdgeStart + edgeStart // global faceEdgeRows offset\n face[10] = edgeCount\n // triangleStart/triangleCount stay local (per-mesh)\n allFaces.push(face)\n totalFaceArea += (face[5] as number)\n // Collect bbox for global merge\n const fb = face[8] as Record<string, number[]>\n if (fb?.min && fb?.max) {\n allFaceBboxes.push({ min: fb.min, max: fb.max })\n }\n }\n\n // Edge rows: replace occurrenceId/shapeId, update faceStart/faceCount\n const partEdgeFaceStart = edgeFaceRowsData.length\n for (let ei = 0; ei < partEdges.length; ei++) {\n const edge = [...partEdges[ei]] as unknown[]\n edge[1] = occId // occurrenceId\n edge[2] = asShapeId(`${occId}.s1`) // shapeId\n // Update faceStart/faceCount to global indices\n const faceStart = edge[8] as number\n const edgeCount = edge[9] as number\n edge[8] = partEdgeFaceStart + faceStart // global edgeFaceRows offset\n edge[9] = edgeCount\n // Update segmentStart to global offset\n const segCount = edge[14] as number\n edge[13] = edgeIdsData.length // global segmentStart (will be set below)\n edge[14] = segCount\n allEdges.push(edge)\n totalEdgeLength += (edge[5] as number)\n // Collect bbox\n const eb = edge[7] as Record<string, number[]>\n if (eb?.min && eb?.max) {\n allEdgeBboxes.push({ min: eb.min, max: eb.max })\n }\n }\n\n // Merge faceRuns: update occurrenceRow to global index\n const partFaceRuns = (partBuffers.faceRuns as Uint32Array) ?? new Uint32Array(0)\n for (let ri = 0; ri < partFaceRuns.length; ri += 5) {\n faceRunData.push(\n occRowIdx, // occurrenceRow (global)\n partFaceRuns[ri + 1], // primitiveIndex\n partFaceRuns[ri + 2], // triangleStart (local to mesh)\n partFaceRuns[ri + 3], // triangleCount\n allFaces.length - partFaces.length + partFaceRuns[ri + 4], // faceRow (global)\n )\n }\n\n // Merge edge proxy buffers\n const partEdgePos = (partBuffers.edgePositions as Float32Array) ?? new Float32Array(0)\n const partEdgeIdx = (partBuffers.edgeIndices as Uint32Array) ?? new Uint32Array(0)\n const partEdgeIds = (partBuffers.edgeIds as Uint32Array) ?? new Uint32Array(0)\n\n // Edge positions: concatenate (vertex offset = current length / 3)\n const vertexOffset = edgePositionsData.length / 3\n for (let p = 0; p < partEdgePos.length; p++) {\n edgePositionsData.push(partEdgePos[p])\n }\n // Edge indices: add vertex offset to each index (indices reference edgePositions)\n for (let p = 0; p < partEdgeIdx.length; p++) {\n edgeIndicesData.push(partEdgeIdx[p] + vertexOffset)\n }\n // Edge IDs: offset by global edge index base\n const edgeIdBase = allEdges.length - partEdges.length\n for (let p = 0; p < partEdgeIds.length; p++) {\n edgeIdsData.push(partEdgeIds[p] + edgeIdBase)\n }\n\n // Merge relation buffers\n const partFaceEdgeRows = (partBuffers.faceEdgeRows as Uint32Array) ?? new Uint32Array(0)\n for (let p = 0; p < partFaceEdgeRows.length; p++) {\n faceEdgeRowsData.push(partFaceEdgeRows[p])\n }\n\n const partEdgeFaceRows = (partBuffers.edgeFaceRows as Uint32Array) ?? new Uint32Array(0)\n for (let p = 0; p < partEdgeFaceRows.length; p++) {\n edgeFaceRowsData.push(partEdgeFaceRows[p])\n }\n\n // Fix edge segmentStart (now that we know the global offset)\n const segBase = edgeIdsData.length - partEdgeIds.length\n for (let ei = 0; ei < partEdges.length; ei++) {\n const globalEdgeIdx = allEdges.length - partEdges.length + ei\n const origSegStart = partEdges[ei][13] as number\n ;(allEdges[globalEdgeIdx] as unknown[])[13] = segBase + origSegStart\n }\n }\n\n // Compute merged bbox\n const mergedBbox = allFaceBboxes.length > 0\n ? mergeBboxes(allFaceBboxes)\n : { min: [0, 0, 0], max: [0, 0, 0] }\n\n // Recompute relevance scores for assembly (global scale)\n const mergedDiag = Math.sqrt(\n (mergedBbox.max[0] - mergedBbox.min[0]) ** 2 +\n (mergedBbox.max[1] - mergedBbox.min[1]) ** 2 +\n (mergedBbox.max[2] - mergedBbox.min[2]) ** 2,\n )\n const totalArea = Math.max(totalFaceArea, 1e-12)\n const totalLength = Math.max(totalEdgeLength, 1e-12)\n const sizeFloor = Math.max(mergedDiag * mergedDiag * 1e-6, 1e-12)\n const lengthFloor = Math.max(mergedDiag * 1e-5, 1e-12)\n\n for (let fi = 0; fi < allFaces.length; fi++) {\n const area = allFaces[fi][5] as number\n const surfaceType = allFaces[fi][4] as string\n let score = 100 * Math.sqrt(Math.max(area, 0) / totalArea)\n if (['plane', 'cylinder', 'cone', 'sphere', 'torus'].includes(surfaceType)) score += 8\n if (area < sizeFloor) score -= 45\n const triCount = allFaces[fi][15] as number\n const ref = triCount > 0 && area > 1e-12\n if (!ref) score = 0\n ;(allFaces[fi] as unknown[])[11] = Math.max(0, Math.min(100, Math.round(score)))\n ;(allFaces[fi] as unknown[])[12] = faceFlags(ref)\n }\n\n for (let ei = 0; ei < allEdges.length; ei++) {\n const length = allEdges[ei][5] as number\n const curveType = allEdges[ei][4] as string\n const segCount = allEdges[ei][14] as number\n const ref = segCount > 0 && length > 1e-12\n let score = 100 * Math.sqrt(Math.max(length, 0) / totalLength)\n if (['line', 'circle', 'ellipse'].includes(curveType)) score += 10\n if (length < lengthFloor) score -= 35\n if (!ref) score = 0\n ;(allEdges[ei] as unknown[])[10] = Math.max(0, Math.min(100, Math.round(score)))\n // flags already set per-part\n }\n\n // Build assembly manifest\n const manifest: Record<string, unknown> = {\n schemaVersion: 2,\n profile: 'selector',\n cadRef: cadPath,\n stepPath: cadPath ? `${cadPath}.step` : undefined,\n stepHash,\n bbox: bboxArray(mergedBbox),\n stats: {\n occurrenceCount: allOccurrences.length,\n leafOccurrenceCount: allOccurrences.length,\n shapeCount: allShapes.length,\n faceCount: allFaces.length,\n edgeCount: allEdges.length,\n faceProxyRunCount: faceRunData.length / 5,\n edgeProxyPointCount: edgePositionsData.length / 3,\n edgeProxySegmentCount: edgeIdsData.length,\n },\n tables: {\n occurrenceColumns: OCCURRENCE_COLUMNS,\n shapeColumns: SHAPE_COLUMNS,\n faceColumns: FACE_COLUMNS,\n edgeColumns: EDGE_COLUMNS,\n },\n occurrences: allOccurrences,\n shapes: allShapes,\n faces: allFaces,\n edges: allEdges,\n faceProxy: {\n source: cadPath ? `.${cadPath.split(/[/\\\\]/).pop()!}.step.3mf` : undefined,\n runsView: 'faceRuns',\n runColumns: ['occurrenceRow', 'primitiveIndex', 'triangleStart', 'triangleCount', 'faceRow'],\n },\n edgeProxy: {\n positionsView: 'edgePositions',\n indicesView: 'edgeIndices',\n edgeIdsView: 'edgeIds',\n },\n relations: {\n faceEdgeRowsView: 'faceEdgeRows',\n edgeFaceRowsView: 'edgeFaceRows',\n },\n }\n\n const buffers: Record<string, Float32Array | Uint32Array> = {\n faceRuns: new Uint32Array(faceRunData),\n edgePositions: new Float32Array(edgePositionsData),\n edgeIndices: new Uint32Array(edgeIndicesData),\n edgeIds: new Uint32Array(edgeIdsData),\n faceEdgeRows: new Uint32Array(faceEdgeRowsData),\n edgeFaceRows: new Uint32Array(edgeFaceRowsData),\n }\n\n return { manifest, buffers }\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n//\n// 供 TopoRef 命名层做 edge/vertex lineage 解析。与 buildSelectorManifest\n// 内部的 face→edge 邻接同源(同一次 TopExp::MapShapes 枚举),选择器\n// manifest 输出保持不变——这是命名层的独立查询出口。\n// ═══════════════════════════════════════════════════════════════════════\n\n/** 拓扑邻接表:ordinal(1 起) ↔ 邻接 ordinal 列表。 */\nexport interface TopologyAdjacency {\n /** face ordinal(1 起) → 邻接 edge ordinal 列表。 */\n readonly faceEdgeOrdinals: ReadonlyArray<readonly number[]>\n /** edge ordinal(1 起) → 邻接 face ordinal 列表。 */\n readonly edgeFaceOrdinals: ReadonlyArray<readonly number[]>\n /** face ordinal(1 起) → 邻接 vertex ordinal 列表。 */\n readonly faceVertexOrdinals: ReadonlyArray<readonly number[]>\n}\n\n/**\n * 构建一个 solid 的拓扑邻接表(edge/vertex lineage 解析用,§4.2/§4.4)。\n *\n * 与 buildSelectorManifest 同一枚举序(getSubShapes ↔ subShapeHashes ↔\n * manifest 行序),hash 碰撞按既有办法用 isSame 消解(findOrdinal)。\n * 每次调用重新枚举(解析是低频路径,不建缓存)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the solid to query.\n * @returns the adjacency tables (face→edge, edge→face, face→vertex).\n */\nexport function buildTopologyAdjacency(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): TopologyAdjacency {\n const faceHandles = kernel.getSubShapes(shape, 'face')\n const edgeHandles = kernel.getSubShapes(shape, 'edge')\n const vertexHandles = kernel.getSubShapes(shape, 'vertex')\n const faceCount = faceHandles.length\n const edgeCount = edgeHandles.length\n\n const edgeOrdLookup = buildEdgeOrdLookup(kernel, edgeHandles)\n const vertexOrdLookup = buildFaceOrdLookup(kernel, vertexHandles)\n\n const faceEdgeOrdinals: number[][] = []\n const edgeFaceOrdinals: number[][] = []\n const faceVertexOrdinals: number[][] = []\n for (let ei = 0; ei < edgeCount; ei++) edgeFaceOrdinals.push([])\n\n for (let fi = 0; fi < faceCount; fi++) {\n // face → edge(与 manifest 的 faceEdgeRows 同源)\n const faceEdges = kernel.getSubShapes(faceHandles[fi], 'edge')\n const edgeOrds: number[] = []\n const seen = new Set<number>()\n for (const fe of faceEdges) {\n const ord = findOrdinal(kernel, fe, edgeHandles, edgeOrdLookup)\n if (ord !== undefined && !seen.has(ord)) {\n seen.add(ord)\n edgeOrds.push(ord)\n edgeFaceOrdinals[ord - 1].push(fi + 1)\n }\n }\n faceEdgeOrdinals.push(edgeOrds)\n\n // face → vertex(§4.4:内核 getSubShapes(face,'vertex') 可用)\n const faceVertices = kernel.getSubShapes(faceHandles[fi], 'vertex')\n const vertexOrds: number[] = []\n const seenV = new Set<number>()\n for (const fv of faceVertices) {\n const ord = findOrdinal(kernel, fv, vertexHandles, vertexOrdLookup)\n if (ord !== undefined && !seenV.has(ord)) {\n seenV.add(ord)\n vertexOrds.push(ord)\n }\n }\n faceVertexOrdinals.push(vertexOrds)\n }\n\n return { faceEdgeOrdinals, edgeFaceOrdinals, faceVertexOrdinals }\n}\n"]}
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * Primitive → CAD 实体转换。
3
3
  *
4
+ * @platform occt — 本文件 import occt-kernel(meshReconstruct):primitive 直接
5
+ * 构造路径绑定 occt 构造函数(makeBox/makeSphere/...),平台原生面调用;
6
+ * 守卫 R1 豁免、R2 无 defineOp 不适用。
7
+ *
4
8
  * 将本项目的各种 primitive(cube, sphere, cylinder, cone, wedge, screw)
5
9
  * 转换为 OCCT CAD 实体(Solid),并支持导出为 BREP 格式的 STEP 文件。
6
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"brep-primitives.d.ts","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACZ,MAAM,eAAe,CAAA;AAItB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,GAAG;IAC1D,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;CACrB,CAiBA;AA6JD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,KAAK,EAAE,UAAU,CAAA;IACjB,kCAAkC;IAClC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAA;CACvC;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAA;AA6BlG;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,EACtC,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC,qBAAqB,CAkCvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,KAAK,CAAC,cAAc,GACxB,qBAAqB,CAIvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;CAAE,CAQ9C"}
1
+ {"version":3,"file":"brep-primitives.d.ts","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACZ,MAAM,eAAe,CAAA;AAItB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,GAAG;IAC1D,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;CACrB,CAiBA;AA6JD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,KAAK,EAAE,UAAU,CAAA;IACjB,kCAAkC;IAClC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAA;CACvC;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAA;AA6BlG;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,EACtC,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC,qBAAqB,CAkCvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,KAAK,CAAC,cAAc,GACxB,qBAAqB,CAIvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;CAAE,CAQ9C"}
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * Primitive → CAD 实体转换。
3
3
  *
4
+ * @platform occt — 本文件 import occt-kernel(meshReconstruct):primitive 直接
5
+ * 构造路径绑定 occt 构造函数(makeBox/makeSphere/...),平台原生面调用;
6
+ * 守卫 R1 豁免、R2 无 defineOp 不适用。
7
+ *
4
8
  * 将本项目的各种 primitive(cube, sphere, cylinder, cone, wedge, screw)
5
9
  * 转换为 OCCT CAD 实体(Solid),并支持导出为 BREP 格式的 STEP 文件。
6
10
  *