yi-map-web 1.0.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 (464) hide show
  1. package/README.md +184 -0
  2. package/dist/App.vue.d.ts +2 -0
  3. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  4. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  5. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  6. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  7. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  8. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  9. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  10. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  11. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  12. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  13. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  14. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  15. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  16. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  17. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  18. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  19. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  20. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  21. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  22. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  23. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  24. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  25. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  26. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  27. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  28. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  29. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  30. package/dist/assets/mars3d-cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  31. package/dist/assets/mars3d-cesium/Assets/Images/bing_maps_credit.png +0 -0
  32. package/dist/assets/mars3d-cesium/Assets/Images/cesium_credit.png +0 -0
  33. package/dist/assets/mars3d-cesium/Assets/Images/google_earth_credit.png +0 -0
  34. package/dist/assets/mars3d-cesium/Assets/Images/ion-credit.png +0 -0
  35. package/dist/assets/mars3d-cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  36. package/dist/assets/mars3d-cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  37. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  38. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  39. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  40. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  41. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  42. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  43. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  44. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  45. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  46. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  47. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  48. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  49. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  50. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  51. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  52. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  53. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  54. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  55. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  56. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  57. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  58. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  59. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  60. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  61. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  62. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  63. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  64. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  65. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  66. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  67. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  68. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  69. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  70. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  71. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  72. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  73. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  74. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  75. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  76. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  77. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  78. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  79. package/dist/assets/mars3d-cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  80. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  81. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  82. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  83. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  84. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  85. package/dist/assets/mars3d-cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  86. package/dist/assets/mars3d-cesium/Assets/Textures/maki/airfield.png +0 -0
  87. package/dist/assets/mars3d-cesium/Assets/Textures/maki/airport.png +0 -0
  88. package/dist/assets/mars3d-cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  89. package/dist/assets/mars3d-cesium/Assets/Textures/maki/america-football.png +0 -0
  90. package/dist/assets/mars3d-cesium/Assets/Textures/maki/art-gallery.png +0 -0
  91. package/dist/assets/mars3d-cesium/Assets/Textures/maki/bakery.png +0 -0
  92. package/dist/assets/mars3d-cesium/Assets/Textures/maki/bank.png +0 -0
  93. package/dist/assets/mars3d-cesium/Assets/Textures/maki/bar.png +0 -0
  94. package/dist/assets/mars3d-cesium/Assets/Textures/maki/baseball.png +0 -0
  95. package/dist/assets/mars3d-cesium/Assets/Textures/maki/basketball.png +0 -0
  96. package/dist/assets/mars3d-cesium/Assets/Textures/maki/beer.png +0 -0
  97. package/dist/assets/mars3d-cesium/Assets/Textures/maki/bicycle.png +0 -0
  98. package/dist/assets/mars3d-cesium/Assets/Textures/maki/building.png +0 -0
  99. package/dist/assets/mars3d-cesium/Assets/Textures/maki/bus.png +0 -0
  100. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cafe.png +0 -0
  101. package/dist/assets/mars3d-cesium/Assets/Textures/maki/camera.png +0 -0
  102. package/dist/assets/mars3d-cesium/Assets/Textures/maki/campsite.png +0 -0
  103. package/dist/assets/mars3d-cesium/Assets/Textures/maki/car.png +0 -0
  104. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cemetery.png +0 -0
  105. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cesium.png +0 -0
  106. package/dist/assets/mars3d-cesium/Assets/Textures/maki/chemist.png +0 -0
  107. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cinema.png +0 -0
  108. package/dist/assets/mars3d-cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  109. package/dist/assets/mars3d-cesium/Assets/Textures/maki/circle.png +0 -0
  110. package/dist/assets/mars3d-cesium/Assets/Textures/maki/city.png +0 -0
  111. package/dist/assets/mars3d-cesium/Assets/Textures/maki/clothing-store.png +0 -0
  112. package/dist/assets/mars3d-cesium/Assets/Textures/maki/college.png +0 -0
  113. package/dist/assets/mars3d-cesium/Assets/Textures/maki/commercial.png +0 -0
  114. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cricket.png +0 -0
  115. package/dist/assets/mars3d-cesium/Assets/Textures/maki/cross.png +0 -0
  116. package/dist/assets/mars3d-cesium/Assets/Textures/maki/dam.png +0 -0
  117. package/dist/assets/mars3d-cesium/Assets/Textures/maki/danger.png +0 -0
  118. package/dist/assets/mars3d-cesium/Assets/Textures/maki/disability.png +0 -0
  119. package/dist/assets/mars3d-cesium/Assets/Textures/maki/dog-park.png +0 -0
  120. package/dist/assets/mars3d-cesium/Assets/Textures/maki/embassy.png +0 -0
  121. package/dist/assets/mars3d-cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  122. package/dist/assets/mars3d-cesium/Assets/Textures/maki/entrance.png +0 -0
  123. package/dist/assets/mars3d-cesium/Assets/Textures/maki/farm.png +0 -0
  124. package/dist/assets/mars3d-cesium/Assets/Textures/maki/fast-food.png +0 -0
  125. package/dist/assets/mars3d-cesium/Assets/Textures/maki/ferry.png +0 -0
  126. package/dist/assets/mars3d-cesium/Assets/Textures/maki/fire-station.png +0 -0
  127. package/dist/assets/mars3d-cesium/Assets/Textures/maki/fuel.png +0 -0
  128. package/dist/assets/mars3d-cesium/Assets/Textures/maki/garden.png +0 -0
  129. package/dist/assets/mars3d-cesium/Assets/Textures/maki/gift.png +0 -0
  130. package/dist/assets/mars3d-cesium/Assets/Textures/maki/golf.png +0 -0
  131. package/dist/assets/mars3d-cesium/Assets/Textures/maki/grocery.png +0 -0
  132. package/dist/assets/mars3d-cesium/Assets/Textures/maki/hairdresser.png +0 -0
  133. package/dist/assets/mars3d-cesium/Assets/Textures/maki/harbor.png +0 -0
  134. package/dist/assets/mars3d-cesium/Assets/Textures/maki/heart.png +0 -0
  135. package/dist/assets/mars3d-cesium/Assets/Textures/maki/heliport.png +0 -0
  136. package/dist/assets/mars3d-cesium/Assets/Textures/maki/hospital.png +0 -0
  137. package/dist/assets/mars3d-cesium/Assets/Textures/maki/ice-cream.png +0 -0
  138. package/dist/assets/mars3d-cesium/Assets/Textures/maki/industrial.png +0 -0
  139. package/dist/assets/mars3d-cesium/Assets/Textures/maki/land-use.png +0 -0
  140. package/dist/assets/mars3d-cesium/Assets/Textures/maki/laundry.png +0 -0
  141. package/dist/assets/mars3d-cesium/Assets/Textures/maki/library.png +0 -0
  142. package/dist/assets/mars3d-cesium/Assets/Textures/maki/lighthouse.png +0 -0
  143. package/dist/assets/mars3d-cesium/Assets/Textures/maki/lodging.png +0 -0
  144. package/dist/assets/mars3d-cesium/Assets/Textures/maki/logging.png +0 -0
  145. package/dist/assets/mars3d-cesium/Assets/Textures/maki/london-underground.png +0 -0
  146. package/dist/assets/mars3d-cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  147. package/dist/assets/mars3d-cesium/Assets/Textures/maki/marker.png +0 -0
  148. package/dist/assets/mars3d-cesium/Assets/Textures/maki/minefield.png +0 -0
  149. package/dist/assets/mars3d-cesium/Assets/Textures/maki/mobilephone.png +0 -0
  150. package/dist/assets/mars3d-cesium/Assets/Textures/maki/monument.png +0 -0
  151. package/dist/assets/mars3d-cesium/Assets/Textures/maki/museum.png +0 -0
  152. package/dist/assets/mars3d-cesium/Assets/Textures/maki/music.png +0 -0
  153. package/dist/assets/mars3d-cesium/Assets/Textures/maki/oil-well.png +0 -0
  154. package/dist/assets/mars3d-cesium/Assets/Textures/maki/park.png +0 -0
  155. package/dist/assets/mars3d-cesium/Assets/Textures/maki/park2.png +0 -0
  156. package/dist/assets/mars3d-cesium/Assets/Textures/maki/parking-garage.png +0 -0
  157. package/dist/assets/mars3d-cesium/Assets/Textures/maki/parking.png +0 -0
  158. package/dist/assets/mars3d-cesium/Assets/Textures/maki/pharmacy.png +0 -0
  159. package/dist/assets/mars3d-cesium/Assets/Textures/maki/pitch.png +0 -0
  160. package/dist/assets/mars3d-cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  161. package/dist/assets/mars3d-cesium/Assets/Textures/maki/playground.png +0 -0
  162. package/dist/assets/mars3d-cesium/Assets/Textures/maki/police.png +0 -0
  163. package/dist/assets/mars3d-cesium/Assets/Textures/maki/polling-place.png +0 -0
  164. package/dist/assets/mars3d-cesium/Assets/Textures/maki/post.png +0 -0
  165. package/dist/assets/mars3d-cesium/Assets/Textures/maki/prison.png +0 -0
  166. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rail-above.png +0 -0
  167. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rail-light.png +0 -0
  168. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rail-metro.png +0 -0
  169. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rail-underground.png +0 -0
  170. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rail.png +0 -0
  171. package/dist/assets/mars3d-cesium/Assets/Textures/maki/religious-christian.png +0 -0
  172. package/dist/assets/mars3d-cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  173. package/dist/assets/mars3d-cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  174. package/dist/assets/mars3d-cesium/Assets/Textures/maki/restaurant.png +0 -0
  175. package/dist/assets/mars3d-cesium/Assets/Textures/maki/roadblock.png +0 -0
  176. package/dist/assets/mars3d-cesium/Assets/Textures/maki/rocket.png +0 -0
  177. package/dist/assets/mars3d-cesium/Assets/Textures/maki/school.png +0 -0
  178. package/dist/assets/mars3d-cesium/Assets/Textures/maki/scooter.png +0 -0
  179. package/dist/assets/mars3d-cesium/Assets/Textures/maki/shop.png +0 -0
  180. package/dist/assets/mars3d-cesium/Assets/Textures/maki/skiing.png +0 -0
  181. package/dist/assets/mars3d-cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  182. package/dist/assets/mars3d-cesium/Assets/Textures/maki/soccer.png +0 -0
  183. package/dist/assets/mars3d-cesium/Assets/Textures/maki/square-stroked.png +0 -0
  184. package/dist/assets/mars3d-cesium/Assets/Textures/maki/square.png +0 -0
  185. package/dist/assets/mars3d-cesium/Assets/Textures/maki/star-stroked.png +0 -0
  186. package/dist/assets/mars3d-cesium/Assets/Textures/maki/star.png +0 -0
  187. package/dist/assets/mars3d-cesium/Assets/Textures/maki/suitcase.png +0 -0
  188. package/dist/assets/mars3d-cesium/Assets/Textures/maki/swimming.png +0 -0
  189. package/dist/assets/mars3d-cesium/Assets/Textures/maki/telephone.png +0 -0
  190. package/dist/assets/mars3d-cesium/Assets/Textures/maki/tennis.png +0 -0
  191. package/dist/assets/mars3d-cesium/Assets/Textures/maki/theatre.png +0 -0
  192. package/dist/assets/mars3d-cesium/Assets/Textures/maki/toilets.png +0 -0
  193. package/dist/assets/mars3d-cesium/Assets/Textures/maki/town-hall.png +0 -0
  194. package/dist/assets/mars3d-cesium/Assets/Textures/maki/town.png +0 -0
  195. package/dist/assets/mars3d-cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  196. package/dist/assets/mars3d-cesium/Assets/Textures/maki/triangle.png +0 -0
  197. package/dist/assets/mars3d-cesium/Assets/Textures/maki/village.png +0 -0
  198. package/dist/assets/mars3d-cesium/Assets/Textures/maki/warehouse.png +0 -0
  199. package/dist/assets/mars3d-cesium/Assets/Textures/maki/waste-basket.png +0 -0
  200. package/dist/assets/mars3d-cesium/Assets/Textures/maki/water.png +0 -0
  201. package/dist/assets/mars3d-cesium/Assets/Textures/maki/wetland.png +0 -0
  202. package/dist/assets/mars3d-cesium/Assets/Textures/maki/zoo.png +0 -0
  203. package/dist/assets/mars3d-cesium/Assets/Textures/moonSmall.jpg +0 -0
  204. package/dist/assets/mars3d-cesium/Assets/Textures/pin.svg +1 -0
  205. package/dist/assets/mars3d-cesium/Assets/Textures/waterNormals.jpg +0 -0
  206. package/dist/assets/mars3d-cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  207. package/dist/assets/mars3d-cesium/Assets/approximateTerrainHeights.json +1 -0
  208. package/dist/assets/mars3d-cesium/Cesium.js +17126 -0
  209. package/dist/assets/mars3d-cesium/ThirdParty/Workers/package.json +1 -0
  210. package/dist/assets/mars3d-cesium/ThirdParty/Workers/z-worker-pako.js +1 -0
  211. package/dist/assets/mars3d-cesium/ThirdParty/basis_transcoder.wasm +0 -0
  212. package/dist/assets/mars3d-cesium/ThirdParty/draco_decoder.wasm +0 -0
  213. package/dist/assets/mars3d-cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  214. package/dist/assets/mars3d-cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  215. package/dist/assets/mars3d-cesium/Widgets/Animation/Animation.css +127 -0
  216. package/dist/assets/mars3d-cesium/Widgets/Animation/lighter.css +70 -0
  217. package/dist/assets/mars3d-cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  218. package/dist/assets/mars3d-cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  219. package/dist/assets/mars3d-cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  220. package/dist/assets/mars3d-cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  221. package/dist/assets/mars3d-cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  222. package/dist/assets/mars3d-cesium/Widgets/CesiumWidget/lighter.css +14 -0
  223. package/dist/assets/mars3d-cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  224. package/dist/assets/mars3d-cesium/Widgets/Geocoder/Geocoder.css +70 -0
  225. package/dist/assets/mars3d-cesium/Widgets/Geocoder/lighter.css +17 -0
  226. package/dist/assets/mars3d-cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  227. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  228. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  229. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  230. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  231. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  232. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  233. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  234. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  235. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  236. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  237. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  238. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  239. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  240. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  241. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  242. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  243. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  244. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  245. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  246. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  247. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  248. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  249. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  250. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  251. package/dist/assets/mars3d-cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  252. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  253. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  254. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  255. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  256. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  257. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  258. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  259. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  260. package/dist/assets/mars3d-cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  261. package/dist/assets/mars3d-cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  262. package/dist/assets/mars3d-cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  263. package/dist/assets/mars3d-cesium/Widgets/Images/TimelineIcons.png +0 -0
  264. package/dist/assets/mars3d-cesium/Widgets/Images/info-loading.gif +0 -0
  265. package/dist/assets/mars3d-cesium/Widgets/InfoBox/InfoBox.css +92 -0
  266. package/dist/assets/mars3d-cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  267. package/dist/assets/mars3d-cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  268. package/dist/assets/mars3d-cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  269. package/dist/assets/mars3d-cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  270. package/dist/assets/mars3d-cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  271. package/dist/assets/mars3d-cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  272. package/dist/assets/mars3d-cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  273. package/dist/assets/mars3d-cesium/Widgets/Timeline/Timeline.css +103 -0
  274. package/dist/assets/mars3d-cesium/Widgets/Timeline/lighter.css +23 -0
  275. package/dist/assets/mars3d-cesium/Widgets/VRButton/VRButton.css +8 -0
  276. package/dist/assets/mars3d-cesium/Widgets/Viewer/Viewer.css +107 -0
  277. package/dist/assets/mars3d-cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  278. package/dist/assets/mars3d-cesium/Widgets/lighter.css +237 -0
  279. package/dist/assets/mars3d-cesium/Widgets/lighterShared.css +46 -0
  280. package/dist/assets/mars3d-cesium/Widgets/shared.css +103 -0
  281. package/dist/assets/mars3d-cesium/Widgets/widgets.css +1342 -0
  282. package/dist/assets/mars3d-cesium/Workers/chunk-336QMGTQ.js +26 -0
  283. package/dist/assets/mars3d-cesium/Workers/chunk-3BFV72N7.js +26 -0
  284. package/dist/assets/mars3d-cesium/Workers/chunk-422SYBQS.js +27 -0
  285. package/dist/assets/mars3d-cesium/Workers/chunk-4FULWVRZ.js +26 -0
  286. package/dist/assets/mars3d-cesium/Workers/chunk-5IQULCCZ.js +26 -0
  287. package/dist/assets/mars3d-cesium/Workers/chunk-5JMVLL6X.js +26 -0
  288. package/dist/assets/mars3d-cesium/Workers/chunk-65MI2E3A.js +26 -0
  289. package/dist/assets/mars3d-cesium/Workers/chunk-7SZRKGJD.js +26 -0
  290. package/dist/assets/mars3d-cesium/Workers/chunk-7U5EVTKW.js +26 -0
  291. package/dist/assets/mars3d-cesium/Workers/chunk-AXIQD4JA.js +26 -0
  292. package/dist/assets/mars3d-cesium/Workers/chunk-AZSS2BNB.js +26 -0
  293. package/dist/assets/mars3d-cesium/Workers/chunk-BYYYB2C7.js +26 -0
  294. package/dist/assets/mars3d-cesium/Workers/chunk-C6HKNYGW.js +26 -0
  295. package/dist/assets/mars3d-cesium/Workers/chunk-DMJB4DHC.js +29 -0
  296. package/dist/assets/mars3d-cesium/Workers/chunk-ECLCX5XZ.js +26 -0
  297. package/dist/assets/mars3d-cesium/Workers/chunk-FHECC5EZ.js +26 -0
  298. package/dist/assets/mars3d-cesium/Workers/chunk-GDJPERBD.js +26 -0
  299. package/dist/assets/mars3d-cesium/Workers/chunk-GLZ7AVHY.js +26 -0
  300. package/dist/assets/mars3d-cesium/Workers/chunk-GVEYCBKG.js +26 -0
  301. package/dist/assets/mars3d-cesium/Workers/chunk-HNKLZQOV.js +26 -0
  302. package/dist/assets/mars3d-cesium/Workers/chunk-II4OPXPA.js +26 -0
  303. package/dist/assets/mars3d-cesium/Workers/chunk-ILTEXGHO.js +26 -0
  304. package/dist/assets/mars3d-cesium/Workers/chunk-JD76ATDQ.js +26 -0
  305. package/dist/assets/mars3d-cesium/Workers/chunk-JQWGTP3K.js +26 -0
  306. package/dist/assets/mars3d-cesium/Workers/chunk-K35RPNUR.js +27 -0
  307. package/dist/assets/mars3d-cesium/Workers/chunk-KIXGV6RH.js +26 -0
  308. package/dist/assets/mars3d-cesium/Workers/chunk-LT7NKOZD.js +26 -0
  309. package/dist/assets/mars3d-cesium/Workers/chunk-LUCUOT65.js +26 -0
  310. package/dist/assets/mars3d-cesium/Workers/chunk-MWY74K7V.js +63 -0
  311. package/dist/assets/mars3d-cesium/Workers/chunk-N6SIW7ZL.js +26 -0
  312. package/dist/assets/mars3d-cesium/Workers/chunk-NL753UYH.js +26 -0
  313. package/dist/assets/mars3d-cesium/Workers/chunk-OVOY7YA7.js +26 -0
  314. package/dist/assets/mars3d-cesium/Workers/chunk-PQWMNK6M.js +26 -0
  315. package/dist/assets/mars3d-cesium/Workers/chunk-PUOAX5MA.js +26 -0
  316. package/dist/assets/mars3d-cesium/Workers/chunk-PUPGLHXG.js +26 -0
  317. package/dist/assets/mars3d-cesium/Workers/chunk-PXZYU6PD.js +26 -0
  318. package/dist/assets/mars3d-cesium/Workers/chunk-Q6MK2R6B.js +26 -0
  319. package/dist/assets/mars3d-cesium/Workers/chunk-Q6YG52WP.js +26 -0
  320. package/dist/assets/mars3d-cesium/Workers/chunk-QQJ4EFK2.js +26 -0
  321. package/dist/assets/mars3d-cesium/Workers/chunk-RPFEAA52.js +26 -0
  322. package/dist/assets/mars3d-cesium/Workers/chunk-RTRJ3LVQ.js +26 -0
  323. package/dist/assets/mars3d-cesium/Workers/chunk-SDQXNLTQ.js +26 -0
  324. package/dist/assets/mars3d-cesium/Workers/chunk-TJ6QLJOT.js +26 -0
  325. package/dist/assets/mars3d-cesium/Workers/chunk-TJUBNZ45.js +26 -0
  326. package/dist/assets/mars3d-cesium/Workers/chunk-TOK3PZ73.js +26 -0
  327. package/dist/assets/mars3d-cesium/Workers/chunk-UKJ254OV.js +26 -0
  328. package/dist/assets/mars3d-cesium/Workers/chunk-VC43NA4S.js +26 -0
  329. package/dist/assets/mars3d-cesium/Workers/chunk-WPXTUJZY.js +26 -0
  330. package/dist/assets/mars3d-cesium/Workers/chunk-WRLXLKCG.js +26 -0
  331. package/dist/assets/mars3d-cesium/Workers/chunk-WYMSHGR6.js +28 -0
  332. package/dist/assets/mars3d-cesium/Workers/chunk-X56SSSS5.js +26 -0
  333. package/dist/assets/mars3d-cesium/Workers/chunk-XXWWJ3QU.js +28 -0
  334. package/dist/assets/mars3d-cesium/Workers/chunk-YBIGLQJN.js +26 -0
  335. package/dist/assets/mars3d-cesium/Workers/chunk-YDQLCOZM.js +26 -0
  336. package/dist/assets/mars3d-cesium/Workers/chunk-YECQFZBX.js +29 -0
  337. package/dist/assets/mars3d-cesium/Workers/chunk-YWNU5ZQD.js +26 -0
  338. package/dist/assets/mars3d-cesium/Workers/chunk-Z4E6T4NK.js +26 -0
  339. package/dist/assets/mars3d-cesium/Workers/combineGeometry.js +26 -0
  340. package/dist/assets/mars3d-cesium/Workers/createBoxGeometry.js +26 -0
  341. package/dist/assets/mars3d-cesium/Workers/createBoxOutlineGeometry.js +26 -0
  342. package/dist/assets/mars3d-cesium/Workers/createCircleGeometry.js +26 -0
  343. package/dist/assets/mars3d-cesium/Workers/createCircleOutlineGeometry.js +26 -0
  344. package/dist/assets/mars3d-cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  345. package/dist/assets/mars3d-cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  346. package/dist/assets/mars3d-cesium/Workers/createCorridorGeometry.js +26 -0
  347. package/dist/assets/mars3d-cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  348. package/dist/assets/mars3d-cesium/Workers/createCylinderGeometry.js +26 -0
  349. package/dist/assets/mars3d-cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  350. package/dist/assets/mars3d-cesium/Workers/createEllipseGeometry.js +26 -0
  351. package/dist/assets/mars3d-cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  352. package/dist/assets/mars3d-cesium/Workers/createEllipsoidGeometry.js +26 -0
  353. package/dist/assets/mars3d-cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  354. package/dist/assets/mars3d-cesium/Workers/createFrustumGeometry.js +26 -0
  355. package/dist/assets/mars3d-cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  356. package/dist/assets/mars3d-cesium/Workers/createGeometry.js +26 -0
  357. package/dist/assets/mars3d-cesium/Workers/createGroundPolylineGeometry.js +26 -0
  358. package/dist/assets/mars3d-cesium/Workers/createPlaneGeometry.js +26 -0
  359. package/dist/assets/mars3d-cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  360. package/dist/assets/mars3d-cesium/Workers/createPolygonGeometry.js +26 -0
  361. package/dist/assets/mars3d-cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  362. package/dist/assets/mars3d-cesium/Workers/createPolylineGeometry.js +26 -0
  363. package/dist/assets/mars3d-cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  364. package/dist/assets/mars3d-cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  365. package/dist/assets/mars3d-cesium/Workers/createRectangleGeometry.js +26 -0
  366. package/dist/assets/mars3d-cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  367. package/dist/assets/mars3d-cesium/Workers/createSimplePolylineGeometry.js +26 -0
  368. package/dist/assets/mars3d-cesium/Workers/createSphereGeometry.js +26 -0
  369. package/dist/assets/mars3d-cesium/Workers/createSphereOutlineGeometry.js +26 -0
  370. package/dist/assets/mars3d-cesium/Workers/createTaskProcessorWorker.js +26 -0
  371. package/dist/assets/mars3d-cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  372. package/dist/assets/mars3d-cesium/Workers/createVectorTileGeometries.js +26 -0
  373. package/dist/assets/mars3d-cesium/Workers/createVectorTilePoints.js +26 -0
  374. package/dist/assets/mars3d-cesium/Workers/createVectorTilePolygons.js +26 -0
  375. package/dist/assets/mars3d-cesium/Workers/createVectorTilePolylines.js +26 -0
  376. package/dist/assets/mars3d-cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  377. package/dist/assets/mars3d-cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  378. package/dist/assets/mars3d-cesium/Workers/createVerticesFromHeightmap.js +26 -0
  379. package/dist/assets/mars3d-cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  380. package/dist/assets/mars3d-cesium/Workers/createWallGeometry.js +26 -0
  381. package/dist/assets/mars3d-cesium/Workers/createWallOutlineGeometry.js +26 -0
  382. package/dist/assets/mars3d-cesium/Workers/decodeDraco.js +26 -0
  383. package/dist/assets/mars3d-cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  384. package/dist/assets/mars3d-cesium/Workers/decodeI3S.js +26 -0
  385. package/dist/assets/mars3d-cesium/Workers/gaussianSplatSorter.js +26 -0
  386. package/dist/assets/mars3d-cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  387. package/dist/assets/mars3d-cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  388. package/dist/assets/mars3d-cesium/Workers/transcodeKTX2.js +56 -0
  389. package/dist/assets/mars3d-cesium/Workers/transferTypedArrayTest.js +26 -0
  390. package/dist/assets/mars3d-cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  391. package/dist/assets/mars3d-cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  392. package/dist/components/business/index.d.ts +13 -0
  393. package/dist/components/business/poi-marker/PoiMarkerPanel.vue.d.ts +2 -0
  394. package/dist/components/business/poi-marker/usePoiMarker.d.ts +46 -0
  395. package/dist/components/business/track/TrackPanel.vue.d.ts +2 -0
  396. package/dist/components/business/track/useTrack.d.ts +84 -0
  397. package/dist/components/mars-map/composables/useDraw.d.ts +15 -0
  398. package/dist/components/mars-map/composables/useMap.d.ts +29 -0
  399. package/dist/components/mars-map/composables/useMeasure.d.ts +11 -0
  400. package/dist/components/mars-map/composables/useVision.d.ts +11 -0
  401. package/dist/components/mars-map/index.d.ts +15 -0
  402. package/dist/components/mars-map/panels/ToolbarPanel.vue.d.ts +21 -0
  403. package/dist/components/mars-map/panels/VisionPanel.vue.d.ts +25 -0
  404. package/dist/components/mars-work/mars-map.vue.d.ts +44 -0
  405. package/dist/config/config copy.json +1488 -0
  406. package/dist/config/config.json +1298 -0
  407. package/dist/favicon.ico +0 -0
  408. package/dist/img/basemaps/TerrainEllipsoid.png +0 -0
  409. package/dist/img/basemaps/TerrainSTK.png +0 -0
  410. package/dist/img/basemaps/arcgis.png +0 -0
  411. package/dist/img/basemaps/bd-c-bluish.png +0 -0
  412. package/dist/img/basemaps/bd-c-dark.png +0 -0
  413. package/dist/img/basemaps/bd-c-darkgreen.png +0 -0
  414. package/dist/img/basemaps/bd-c-googlelite.png +0 -0
  415. package/dist/img/basemaps/bd-c-grassgreen.png +0 -0
  416. package/dist/img/basemaps/bd-c-grayscale.png +0 -0
  417. package/dist/img/basemaps/bd-c-hardedge.png +0 -0
  418. package/dist/img/basemaps/bd-c-light.png +0 -0
  419. package/dist/img/basemaps/bd-c-midnight.png +0 -0
  420. package/dist/img/basemaps/bd-c-pink.png +0 -0
  421. package/dist/img/basemaps/bd-c-redalert.png +0 -0
  422. package/dist/img/basemaps/bd-img.png +0 -0
  423. package/dist/img/basemaps/bd-vec.png +0 -0
  424. package/dist/img/basemaps/bingAerial.png +0 -0
  425. package/dist/img/basemaps/bingAerialLabels.png +0 -0
  426. package/dist/img/basemaps/bingRoads.png +0 -0
  427. package/dist/img/basemaps/bingimage.png +0 -0
  428. package/dist/img/basemaps/bingmap.png +0 -0
  429. package/dist/img/basemaps/blackMarble.png +0 -0
  430. package/dist/img/basemaps/esriNationalGeographic.png +0 -0
  431. package/dist/img/basemaps/esriWorldImagery.png +0 -0
  432. package/dist/img/basemaps/esriWorldStreetMap.png +0 -0
  433. package/dist/img/basemaps/gaode_img.png +0 -0
  434. package/dist/img/basemaps/gaode_vec.png +0 -0
  435. package/dist/img/basemaps/google_img.png +0 -0
  436. package/dist/img/basemaps/google_ter.png +0 -0
  437. package/dist/img/basemaps/google_vec.png +0 -0
  438. package/dist/img/basemaps/mapQuestOpenStreetMap.png +0 -0
  439. package/dist/img/basemaps/mapboxSatellite.png +0 -0
  440. package/dist/img/basemaps/mapboxStreets.png +0 -0
  441. package/dist/img/basemaps/mapboxTerrain.png +0 -0
  442. package/dist/img/basemaps/naturalEarthII.png +0 -0
  443. package/dist/img/basemaps/offline.png +0 -0
  444. package/dist/img/basemaps/osm.png +0 -0
  445. package/dist/img/basemaps/sea.png +0 -0
  446. package/dist/img/basemaps/stamenToner.png +0 -0
  447. package/dist/img/basemaps/stamenWatercolor.png +0 -0
  448. package/dist/img/basemaps/tdt_img.png +0 -0
  449. package/dist/img/basemaps/tdt_ter.png +0 -0
  450. package/dist/img/basemaps/tdt_vec.png +0 -0
  451. package/dist/img/basemaps/tencent_img.png +0 -0
  452. package/dist/img/basemaps/tencent_vec.png +0 -0
  453. package/dist/img/marker/mark-blue.png +0 -0
  454. package/dist/img/textures/fence.png +0 -0
  455. package/dist/img/textures/poly-rivers.png +0 -0
  456. package/dist/img/textures/waterNormals.jpg +0 -0
  457. package/dist/index.d.ts +41 -0
  458. package/dist/main.d.ts +4 -0
  459. package/dist/style.css +4295 -0
  460. package/dist/yi-map-web.mjs +2107 -0
  461. package/dist/yi-map-web.mjs.map +1 -0
  462. package/dist/yi-map-web.umd.cjs +2128 -0
  463. package/dist/yi-map-web.umd.cjs.map +1 -0
  464. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yi-map-web.mjs","sources":["../src/components/mars-work/expand/task/CameraList.js","../src/components/mars-work/expand/task/CameraView.js","../src/components/mars-work/expand/task/MapRotate.js","../src/components/mars-work/expand/task/PointRotate.js","../src/components/mars-work/expand/task/RouteLine.js","../src/components/mars-work/expand/task/ZoomIn.js","../src/components/mars-work/expand/task/ZoomOut.js","../src/components/mars-work/expand/task/FlickerEntity.js","../src/components/mars-work/expand/graphic/CanvasBillboard.js","../src/components/mars-work/mars-map.vue","../src/components/mars-map/panels/ToolbarPanel.vue","../src/components/mars-map/panels/VisionPanel.vue","../src/components/mars-map/composables/useMap.ts","../src/components/mars-map/composables/useMeasure.ts","../src/components/mars-map/composables/useDraw.ts","../src/components/mars-map/composables/useVision.ts","../src/components/mars-map/MarsMapContainer.vue","../src/components/business/poi-marker/usePoiMarker.ts","../src/components/business/poi-marker/PoiMarkerLayer.vue","../src/components/business/poi-marker/PoiMarkerPanel.vue","../src/components/business/track/useTrack.ts","../src/components/business/track/TrackLayer.vue","../src/components/business/track/TrackPanel.vue","../src/index.ts"],"sourcesContent":["import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ่ง†่ง’ๅˆ—่กจๆ’ญๆ”พ๏ผˆๅˆ†ๆญฅๆ‰ง่กŒ๏ผ‰\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n * @param {object[]} [options.list] ่ง†่ง’ๆ•ฐ็ป„\r\n */\r\nexport class CameraList extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._map.setCameraViewList(this.options.list)\r\n }\r\n\r\n // ๆš‚ๅœ(้žๅฟ…้กป)\r\n _pauseWork() {\r\n this._disableWork()\r\n }\r\n}\r\nmars3d.thing.Task.register(\"cameraList\", CameraList)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ๅ•ไธช่ง†่ง’ๅฎšไฝ\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {object} [options.center] ่ง†่ง’ๅ‚ๆ•ฐ\r\n */\r\nexport class CameraView extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._map.setCameraView(this.options.center, { duration: this._duration })\r\n }\r\n\r\n // ็ฆปๅผ€๏ผŒ้‡Šๆ”พ็›ธๅ…ณๅฏน่ฑก\r\n _disableWork() {\r\n this._map.cancelFlyTo()\r\n }\r\n}\r\nmars3d.thing.Task.register(\"camera\", CameraView)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ๅœฐ็ƒ่‡ชๆ—‹่ฝฌ\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {object} [options.center] ๅˆๅง‹่ง†่ง’\r\n * @param {number} [options.speed] ๆ—‹่ฝฌ้€Ÿๅบฆ\r\n */\r\nexport class MapRotate extends mars3d.TaskItem {\r\n constructor(options = {}) {\r\n super(options)\r\n\r\n this._speed = this.options.speed || 0.01\r\n this._center = this.options.center || { lat: 29.093038, lng: 108.804459, alt: 23321232.7, heading: 0, pitch: -90 }\r\n }\r\n\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._map.setCameraView(this._center, {\r\n duration: 1,\r\n complete: () => {\r\n this._map.on(mars3d.EventType.clockTick, this._map_onClockTick, this)\r\n }\r\n })\r\n }\r\n\r\n // ็ฆปๅผ€๏ผŒ้‡Šๆ”พ็›ธๅ…ณๅฏน่ฑก\r\n _disableWork() {\r\n this._map.off(mars3d.EventType.clockTick, this._map_onClockTick, this)\r\n }\r\n\r\n _map_onClockTick() {\r\n if (this.isPause) {\r\n return // ๆš‚ๅœๆ—ถไธๆ‰ง่กŒ\r\n }\r\n\r\n this._map.scene.camera.rotate(mars3d.Cesium.Cartesian3.UNIT_Z, this._speed)\r\n }\r\n}\r\nmars3d.thing.Task.register(\"mapRotate\", MapRotate)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ๅ†…ๆˆ–ๅค–ๆ—‹่ฝฌ\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {boolean} [options.isRotateOut] true:็ป•ๅค–ๆ—‹่ฝฌ ,false:็ป•ๅ†…ๆ—‹่ฝฌ\r\n * @param {boolean} [options.direction=false] ๆ—‹่ฝฌๆ–นๅ‘, true้€†ๆ—ถ้’ˆ๏ผŒfalse้กบๆ—ถ้’ˆ\r\n * @param {number} [options.time=60] ้ฃž่กŒไธ€ๅ‘จๆ‰€้œ€ๆ—ถ้—ด(ๅ•ไฝ ็ง’)๏ผŒๆŽงๅˆถ้€Ÿๅบฆ\r\n * @param {boolean} [options.autoStop] ๆ˜ฏๅฆ่‡ชๅŠจๅœๆญข\r\n * @param {number} [options.autoStopAngle] ่‡ชๅŠจๅœๆญข็š„่ง’ๅบฆๅ€ผ๏ผˆ0-360ๅบฆ๏ผ‰๏ผŒๆœช่ฎพ็ฝฎๆ—ถไธ่‡ชๅŠจๅœๆญข\r\n * @param {object} [options.point] ็ป•็‚นๆ—‹่ฝฌๅฏนๅบ”็š„ไธญๅฟƒ็‚นไฝ็ฝฎ\r\n */\r\nexport class PointRotate extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n if (this.options.center) {\r\n this._map.setCameraView(this.options.center, { duration: 0 })\r\n }\r\n\r\n if (this.options.autoStop) {\r\n delete this.options.autoStopAngle // ๆ˜ฏๅฆ่‡ชๅŠจๅœๆญข\r\n }\r\n\r\n if (this.options.isRotateOut) {\r\n this._rotateOut = new mars3d.thing.RotateOut(this.options)\r\n this._map.addThing(this._rotateOut)\r\n } else {\r\n this._rotatePoint = new mars3d.thing.RotatePoint(this.options)\r\n this._map.addThing(this._rotatePoint)\r\n }\r\n\r\n if (this.options.isRotateOut) {\r\n this._rotateOut.start()\r\n } else {\r\n this._rotatePoint.start(this.options.point)\r\n }\r\n }\r\n\r\n // ็ฆปๅผ€๏ผŒ้‡Šๆ”พ็›ธๅ…ณๅฏน่ฑก\r\n _disableWork() {\r\n if (this._rotatePoint) {\r\n this._rotatePoint.stop()\r\n this._rotatePoint.destroy()\r\n delete this._rotatePoint\r\n }\r\n if (this._rotateOut) {\r\n this._rotateOut.stop()\r\n this._rotateOut.destroy()\r\n delete this._rotateOut\r\n }\r\n }\r\n}\r\nmars3d.thing.Task.register(\"pointRotate\", PointRotate)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ๆŒ‰่ทฏ็บฟๆผซๆธธ\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {object} [options.route] FixedRouteๅฏนๅบ”็š„ๆž„้€ ๅ‚ๆ•ฐ\r\n */\r\nexport class RouteLine extends mars3d.TaskItem {\r\n // constructor(options) {\r\n // super(options)\r\n // }\r\n\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._graphicLayer = new mars3d.layer.GraphicLayer()\r\n this._map.addLayer(this._graphicLayer)\r\n\r\n const fixedRoute = new mars3d.graphic.FixedRoute(this.options.route)\r\n this._graphicLayer.addGraphic(fixedRoute)\r\n this._fixedRoute = fixedRoute\r\n\r\n fixedRoute.start()\r\n }\r\n\r\n // ๆš‚ๅœ(้žๅฟ…้กป)\r\n _pauseWork(options) {\r\n if (this._fixedRoute) {\r\n this._fixedRoute.pause()\r\n }\r\n }\r\n\r\n // ็ปง็ปญ(้žๅฟ…้กป)\r\n _proceedWork() {\r\n if (this._fixedRoute) {\r\n this._fixedRoute.proceed()\r\n }\r\n }\r\n\r\n // ็ฆปๅผ€๏ผŒ้‡Šๆ”พ็›ธๅ…ณๅฏน่ฑก\r\n _disableWork() {\r\n if (this._fixedRoute) {\r\n this._fixedRoute.stop()\r\n delete this._fixedRoute\r\n }\r\n\r\n if (this._graphicLayer) {\r\n this._graphicLayer.destroy()\r\n delete this._graphicLayer\r\n }\r\n }\r\n}\r\nmars3d.thing.Task.register(\"routeLine\", RouteLine)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ๆ”พๅคงๅœฐๅ›พ\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {number} [options.relativeAmount=2] ็›ธๅฏน้‡\r\n */\r\nexport class ZoomIn extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._map.zoomIn(this.options.relativeAmount)\r\n }\r\n}\r\nmars3d.thing.Task.register(\"zoomIn\", ZoomIn)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ็ผฉๅฐๅœฐๅ›พ\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {number} [options.relativeAmount=2] ็›ธๅฏน้‡\r\n */\r\nexport class ZoomOut extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n this._map.zoomOut(this.options.relativeAmount)\r\n }\r\n}\r\nmars3d.thing.Task.register(\"zoomOut\", ZoomOut)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n/**\r\n * ็Ÿข้‡ๅฏน่ฑก้ซ˜ไบฎ้—ช็ƒ(ไป…Entity)\r\n *\r\n * @param {object} [options] ๅ‚ๆ•ฐๅฏน่ฑก๏ผŒๅŒ…ๆ‹ฌไปฅไธ‹๏ผš\r\n * @param {string} [options.name] ๆ ‡้ข˜ๅ็งฐ\r\n * @param {string} [options.type] ็ฑปๅž‹ๆ ‡่ฏ†๏ผŒ่‡ชๅŠจ่ต‹ๅ€ผ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจไผ ๅ…ฅ\r\n * @param {number} [options.start] ๅผ€ๅง‹ๆ—ถ้—ด๏ผŒ็›ธๅฝ“ไบŽmap.clock.startTime็š„็ง’ๆ•ฐ\r\n * @param {number} [options.duration] ๆ—ถ้•ฟ\r\n *\r\n * @param {string|number} [options.layerId] ๅ›พๅฑ‚ID\r\n * @param {string|number} [options.graphicId] ็Ÿข้‡ๅฏน่ฑกID\r\n *\r\n * @param {number} [options.step=10] ้—ช็ƒๅขž้‡, ๆŽงๅˆถ้€Ÿๅบฆ\r\n * @param {string} [options.color] ้ซ˜ไบฎ็š„้ขœ่‰ฒ\r\n * @param {number} [options.maxAlpha=0.3] ้—ช็ƒ็š„ๆœ€ๅคง้€ๆ˜Žๅบฆ๏ผŒไปŽ 0 ๅˆฐ maxAlpha ๆธๅ˜\r\n */\r\nexport class FlickerEntity extends mars3d.TaskItem {\r\n // ่ฟ›ๅ…ฅ๏ผŒๆฟ€ๆดปๅผ€ๅง‹ๅค„็†ไบ‹ๅŠก\r\n _activateWork() {\r\n const layer = this._map.getLayerById(this.options.layerId)\r\n if (layer) {\r\n layer.show = true\r\n layer.readyPromise.then(() => {\r\n this._graphic = layer.getGraphicById(this.options.graphicId)\r\n if (this._graphic) {\r\n this._graphic.show = true\r\n this._graphic.startFlicker({\r\n time: this._duration,\r\n step: this.options.step,\r\n maxAlpha: this.options.maxAlpha,\r\n color: this.options.color\r\n })\r\n }\r\n })\r\n }\r\n }\r\n\r\n // ็ฆปๅผ€๏ผŒ้‡Šๆ”พ็›ธๅ…ณๅฏน่ฑก\r\n _disableWork() {\r\n if (this._graphic) {\r\n this._graphic.stopFlicker()\r\n }\r\n }\r\n}\r\nmars3d.thing.Task.register(\"flickerEntity\", FlickerEntity)\r\n","import * as mars3d from \"mars3d\"\r\n\r\n// ้€š่ฟ‡Canvas็ป˜ๅˆถๅคๆ‚ๆˆ–ๅŠจๆ€ๅฏน่ฑก็š„ๅ›พๆ ‡็‚นGraphic\r\nexport class CanvasBillboard extends mars3d.graphic.BillboardPrimitive {\r\n /**\r\n * ๆ–‡ๅญ—\r\n * @type {string}\r\n */\r\n get text() {\r\n return this.style.text\r\n }\r\n\r\n set text(val) {\r\n this.style.text = val\r\n\r\n this.label.text = val\r\n }\r\n\r\n /**\r\n * ๅฏน่ฑกๆทปๅŠ ๅˆฐๅ›พๅฑ‚ๅ‰ๅˆ›ๅปบไธ€ไบ›ๅฏน่ฑก็š„้’ฉๅญๆ–นๆณ•๏ผŒ\r\n * ๅชไผš่ฐƒ็”จไธ€ๆฌก\r\n * @return {Promise<object>} ๆ— \r\n * @private\r\n */\r\n _addedHook(style) {\r\n style.image = \"//data.mars3d.cn/img/marker/bg/textPnl.png\"\r\n style.label = {\r\n ...style,\r\n text: this.style.text,\r\n font_size: 55,\r\n color: style.textColor ?? \"#ffffff\",\r\n hasPixelOffset: true,\r\n pixelOffsetX: 0,\r\n pixelOffsetY: -36 * (style.scale ?? 1)\r\n }\r\n if (style.scaleByDistance) {\r\n style.label.pixelOffsetScaleByDistance = style.scaleByDistance\r\n }\r\n\r\n super._addedHook(style)\r\n }\r\n}\r\n\r\n// ๆณจๅ†Œไธ‹\r\nmars3d.GraphicUtil.register(\"canvasBillboard\", CanvasBillboard)\r\n","<!--\r\n ๅœฐๅ›พๆธฒๆŸ“็ป„ไปถ\r\n-->\r\n\r\n<template>\r\n <div :id=\"withKeyId\" class=\"mars3d-container\"></div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport * as mars3d from \"mars3d\";\r\nimport \"./expand/index\"; // ๅผ•ๅ…ฅๆ’ไปถๆˆ–ๆณจๅ†Œๆ‰ฉๅฑ•js\r\n\r\nimport { computed, onUnmounted, onMounted, toRaw } from \"vue\";\r\n// import { $alert, $message } from \"@mars/components/mars-ui/index\"\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n mapKey?: string; // ๅคšไธชๅœฐๅ›พๆ—ถ,ๅฏไผ ๅ…ฅkeyๅŒบๅˆ†ๅœฐๅ›พ\r\n url?: string; // ไผ ๅ…ฅ็š„ๅœฐๅ›พๆž„้€ ๅ‚ๆ•ฐurl๏ผŒๅฏไธบ็ฉบ๏ผŒๅชไผ options\r\n options?: any; // ไผ ๅ…ฅ็š„ๅœฐๅ›พๆž„้€ ๅ‚ๆ•ฐoptions๏ผŒๅฏ่ฆ†็›–urlๅ†…็š„ๅ‚ๆ•ฐ\r\n }>(),\r\n {\r\n mapKey: \"default\",\r\n url: undefined,\r\n options: undefined,\r\n },\r\n);\r\n\r\n// ็”จไบŽๅญ˜ๆ”พๅœฐ็ƒ็ป„ไปถๅฎžไพ‹\r\nlet map: mars3d.Map; // ๅœฐๅ›พๅฏน่ฑก\r\n\r\n// ไฝฟ็”จ็”จๆˆทไผ ๅ…ฅ็š„ mapKey ๆ‹ผๆŽฅ็”Ÿๆˆ withKeyId ไฝœไธบๅฝ“ๅ‰ๆ˜พ็คบๅฎนๅ™จ็š„id\r\nconst withKeyId = computed(() => `mars3d-container-${props.mapKey}`);\r\n\r\n// onloadไบ‹ไปถๅฐ†ๅœจๅœฐๅ›พๆธฒๆŸ“ๅŽ่งฆๅ‘\r\nconst emit = defineEmits([\"onload\"]);\r\n\r\nconst initMars3d = async () => {\r\n // ่Žทๅ–้…็ฝฎ\r\n let mapOptions;\r\n if (props.url) {\r\n // ๅญ˜ๅœจurlๆ—ถๆ‰่ฏปๅ–\r\n mapOptions = await mars3d.Util.fetchJson({ url: props.url });\r\n if (props.options) {\r\n mapOptions = mars3d.Util.merge(mapOptions, toRaw(props.options)); // ๅˆๅนถ้…็ฝฎ\r\n }\r\n } else if (props.options) {\r\n mapOptions = toRaw(props.options);\r\n }\r\n // console.log(\"Mapๅœฐๅ›พๆž„้€ ๅ‚ๆ•ฐ\", mapOptions);\r\n\r\n // ็ฆ็”จๆŽงๅˆถๅฐ็‰ˆๆƒไฟกๆฏ่พ“ๅ‡บ\r\n (mars3d as any).Util.showCopyright = false;\r\n\r\n map = new mars3d.Map(withKeyId.value, mapOptions);\r\n\r\n // ้’ˆๅฏนไธๅŒ็ปˆ็ซฏ็š„ไผ˜ๅŒ–้…็ฝฎ\r\n if (mars3d.Util.isPCBroswer()) {\r\n map.zoomFactor = 2.0; // ้ผ ๆ ‡ๆปš่ฝฎๆ”พๅคง็š„ๆญฅ้•ฟๅ‚ๆ•ฐ\r\n\r\n // IEๆต่งˆๅ™จไผ˜ๅŒ–\r\n if (window.navigator.userAgent.toLowerCase().indexOf(\"msie\") >= 0) {\r\n map.viewer.targetFrameRate = 20; // ้™ๅˆถๅธง็އ\r\n map.scene.requestRenderMode = false; // ๅ–ๆถˆๅฎžๆ—ถๆธฒๆŸ“\r\n }\r\n } else {\r\n map.zoomFactor = 5.0; // ้ผ ๆ ‡ๆปš่ฝฎๆ”พๅคง็š„ๆญฅ้•ฟๅ‚ๆ•ฐ\r\n\r\n // ็งปๅŠจ่ฎพๅค‡ไธŠ็ฆๆމไปฅไธ‹ๅ‡ ไธช้€‰้กน๏ผŒๅฏไปฅ็›ธๅฏนๆ›ดๅŠ ๆต็•…\r\n map.scene.requestRenderMode = false; // ๅ–ๆถˆๅฎžๆ—ถๆธฒๆŸ“\r\n map.scene.fog.enabled = false;\r\n map.scene.skyAtmosphere.show = false;\r\n map.scene.globe.showGroundAtmosphere = false;\r\n }\r\n\r\n // ไบŒไธ‰็ปดๅˆ‡ๆขไธ็”จๅŠจ็”ป\r\n if (map.viewer.sceneModePicker) {\r\n map.viewer.sceneModePicker.viewModel.duration = 0.0;\r\n }\r\n\r\n // ็ป‘ๅฎšๅฝ“ๅ‰้กน็›ฎ็š„้ป˜่ฎคๅณ้”ฎ่œๅ•\r\n // map.bindContextMenu(getContextMenu())\r\n\r\n // ้š่—ๅณไธ‹่ง’็š„Mars3D logo\r\n if ((map as any).mars3dLogo) {\r\n (map as any).mars3dLogo.show = false;\r\n }\r\n // ๅผบๅˆถไปŽDOMไธญ็งป้™คlogoๅ…ƒ็ด \r\n setTimeout(() => {\r\n const logoElements = document.getElementsByClassName(\"mars3d-logo\");\r\n for (let i = 0; i < logoElements.length; i++) {\r\n logoElements[i].remove();\r\n }\r\n }, 100);\r\n\r\n // webglๆธฒๆŸ“ๅคฑ่ดฅๅŽ๏ผŒๅˆทๆ–ฐ้กต้ข\r\n // map.on(mars3d.EventType.renderError, async () => {\r\n // await $alert(\"็จ‹ๅบๅ†…ๅญ˜ๆถˆ่€—่ฟ‡ๅคง๏ผŒ่ฏท้‡ๅฏๆต่งˆๅ™จ\")\r\n // window.location.reload()\r\n // })\r\n\r\n onMapLoad(); // mapๆž„้€ ๅฎŒๆˆๅŽ็š„ไธ€ไบ›ๅค„็†\r\n emit(\"onload\", map);\r\n};\r\n\r\n// mapๆž„้€ ๅฎŒๆˆๅŽ็š„ไธ€ไบ›ๅค„็†๏ผŒๅฏไปฅๆŒ‰้œ€ๆณจ้‡Šๅ’Œ้€‰็”จ\r\nfunction onMapLoad() {\r\n // Mars3Dๅœฐๅ›พๅ†…้ƒจไฝฟ็”จ๏ผŒๅฆ‚ๅณ้”ฎ่œๅ•ๅผน็ช—\r\n // @ts-ignore\r\n // window.globalAlert = $alert;\r\n // // @ts-ignore\r\n // window.globalMsg = $message;\r\n}\r\n\r\nonMounted(() => {\r\n initMars3d();\r\n});\r\n// ็ป„ไปถๅธ่ฝฝไน‹ๅ‰้”€ๆฏmars3dๅฎžไพ‹\r\nonUnmounted(() => {\r\n if (map) {\r\n map.destroy();\r\n map = null;\r\n }\r\n // console.log(\"map้”€ๆฏๅฎŒๆˆ\", map);\r\n});\r\n</script>\r\n\r\n<style lang=\"less\">\r\n/**cesium ๅทฅๅ…ทๆŒ‰้’ฎๆ */\r\n.cesium-viewer-toolbar {\r\n top: auto !important;\r\n bottom: 35px !important;\r\n left: 12px !important;\r\n right: auto !important;\r\n}\r\n\r\n.cesium-toolbar-button img {\r\n width: 22px;\r\n height: 100%;\r\n}\r\n.cesium-toolbar-button:hover img {\r\n width: 28px;\r\n}\r\n.cesium-svgPath-svg {\r\n scale: 0.8;\r\n}\r\n.cesium-svgPath-svg:hover {\r\n scale: 1;\r\n}\r\n.cesium-button .cesium-baseLayerPicker-selected {\r\n width: 100%;\r\n}\r\n\r\n.cesium-button:hover .cesium-baseLayerPicker-selected {\r\n width: 100%;\r\n}\r\n\r\n.cesium-viewer-toolbar > .cesium-toolbar-button,\r\n.cesium-navigationHelpButton-wrapper,\r\n.cesium-viewer-geocoderContainer {\r\n margin-bottom: 5px;\r\n float: left;\r\n clear: both;\r\n text-align: center;\r\n}\r\n\r\n.cesium-viewer-geocoderContainer form .cesium-geocoder-input {\r\n border-width: 1px;\r\n border-image: url(\"//data.mars3d.cn/img/control/border.svg\") 1 round stretch;\r\n}\r\n\r\n.cesium-button {\r\n background-color: rgba(39, 44, 54, 0.8);\r\n\r\n border-radius: 2px;\r\n border-width: 1px;\r\n border-image: url(\"//data.mars3d.cn/img/control/border.svg\") 1 round stretch;\r\n\r\n color: #ffffff;\r\n fill: #e6e6e6;\r\n line-height: 38px;\r\n}\r\n\r\n.cesium-button:hover {\r\n background-color: rgba(51, 133, 255, 1);\r\n box-shadow: none;\r\n border: none;\r\n}\r\n\r\n/**cesium ๅบ•ๅ›พๅˆ‡ๆข้ขๆฟ*/\r\n.cesium-baseLayerPicker-dropDown {\r\n bottom: 0;\r\n left: 40px;\r\n max-height: 700px;\r\n margin-bottom: 5px;\r\n background-color: rgba(23, 49, 71, 0.7);\r\n}\r\n\r\n/**cesium ๅธฎๅŠฉ้ขๆฟ*/\r\n.cesium-navigation-help {\r\n top: auto;\r\n bottom: 0;\r\n left: 40px;\r\n transform-origin: left bottom;\r\n background: none;\r\n background-color: rgba(23, 49, 71, 0.8);\r\n\r\n .cesium-navigation-help-instructions,\r\n .cesium-navigation-button {\r\n background: none;\r\n }\r\n\r\n .cesium-navigation-button-selected,\r\n .cesium-navigation-button-unselected:hover {\r\n background-color: rgba(1, 35, 22, 1);\r\n }\r\n}\r\n\r\n/**cesium ไบŒ็ปดไธ‰็ปดๅˆ‡ๆข*/\r\n.cesium-sceneModePicker-wrapper {\r\n width: auto;\r\n}\r\n\r\n.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon {\r\n float: right;\r\n margin: 0 3px;\r\n}\r\n\r\n/**cesium POIๆŸฅ่ฏข่พ“ๅ…ฅๆก†*/\r\n.cesium-viewer-geocoderContainer .search-results {\r\n left: 0;\r\n right: 40px;\r\n width: auto;\r\n z-index: 9999;\r\n}\r\n\r\n.cesium-geocoder-searchButton {\r\n width: 38px;\r\n height: 38px;\r\n background-color: rgba(39, 44, 54, 0.8);\r\n border-radius: 2px;\r\n border-width: 1px;\r\n border-image: url(\"//data.mars3d.cn/img/control/border.svg\") 1 round stretch;\r\n fill: #e6e6e6;\r\n}\r\n\r\n.cesium-viewer-geocoderContainer .cesium-geocoder-input {\r\n height: 40px;\r\n width: 40px;\r\n background-color: rgba(63, 72, 84, 0.7);\r\n}\r\n\r\n.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus {\r\n background-color: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n\r\n.cesium-viewer-geocoderContainer .search-results {\r\n background-color: rgba(23, 49, 71, 0.8);\r\n}\r\n\r\n/**cesium infoไฟกๆฏๆก†*/\r\n.cesium-infoBox {\r\n top: 50px;\r\n background: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n\r\n.cesium-infoBox-title {\r\n background-color: rgba(23, 49, 71, 0.8);\r\n}\r\n\r\n/**cesium ไปปๅŠกๆ ็š„FPSไฟกๆฏ*/\r\n.cesium-performanceDisplay-defaultContainer {\r\n top: auto;\r\n bottom: 35px;\r\n right: 50px;\r\n}\r\n\r\n.cesium-performanceDisplay-ms,\r\n.cesium-performanceDisplay-fps {\r\n color: #fff;\r\n}\r\n\r\n/**cesium tileset่ฐƒ่ฏ•ไฟกๆฏ้ขๆฟ*/\r\n.cesium-viewer-cesiumInspectorContainer {\r\n top: 10px;\r\n left: 10px;\r\n right: auto;\r\n}\r\n\r\n.cesium-cesiumInspector {\r\n background-color: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n\r\n/**่ฆ†็›–mars3dๅ†…้ƒจๆŽงไปถ็š„้ขœ่‰ฒ็ญ‰ๆ ทๅผ*/\r\n.mars3d-compass .mars3d-compass-outer {\r\n fill: rgba(39, 44, 54, 0.8);\r\n}\r\n.mars3d-compass .mars3d-compass-inner {\r\n background: rgba(39, 44, 54, 0.8);\r\n fill: #fff;\r\n}\r\n\r\n.mars3d-contextmenu-ul,\r\n.mars3d-sub-menu {\r\n background-color: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n.mars3d-contextmenu-ul {\r\n border-radius: 2px;\r\n border-width: 1px;\r\n border-image: url(\"//data.mars3d.cn/img/control/border.svg\") 1 round stretch;\r\n}\r\n\r\n.mars3d-contextmenu-ul > li > a:hover,\r\n.mars3d-sub-menu > li > a:hover,\r\n.mars3d-contextmenu-ul > li > a:focus,\r\n.mars3d-sub-menu > li > a:focus,\r\n.mars3d-contextmenu-ul > li > .active,\r\n.mars3d-sub-menu > li > .active {\r\n background-color: var(--mars-hover-color, #3ea6ff);\r\n}\r\n\r\n.mars3d-contextmenu-ul > .active > a,\r\n.mars3d-sub-menu > .active > a,\r\n.mars3d-contextmenu-ul > .active > a:hover,\r\n.mars3d-sub-menu > .active > a:hover,\r\n.mars3d-contextmenu-ul > .active > a:focus,\r\n.mars3d-sub-menu > .active > a:focus {\r\n background-color: var(--mars-hover-color, #3ea6ff);\r\n}\r\n\r\n/* Popupๆ ทๅผ*/\r\n.mars3d-popup-color {\r\n color: var(--mars-text-color, #ffffff);\r\n}\r\n\r\n.mars3d-popup-background {\r\n // background: noneไผšๅฏผ่‡ดๅ‰–้ข็š„popupๆฒกๆœ‰้ขœ่‰ฒ\r\n background: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n\r\n// .mars3d-popup-content-wrapper {\r\n// box-shadow: none !important;\r\n// padding: 0 !important;\r\n// background: var(--mars-base-border) !important;\r\n// border-radius: 4px;\r\n// }\r\n\r\n.mars3d-popup-content {\r\n margin: 15px;\r\n}\r\n.mars3d-popup-btn-custom {\r\n padding: 3px 10px;\r\n border: 1px solid #209ffd;\r\n background: #209ffd1c;\r\n color: var(--mars-text-color);\r\n}\r\n\r\n.mars3d-tooltip {\r\n color: var(--mars-text-color, #ffffff);\r\n background: var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n border: 1px solid var(--mars-base-bg, rgba(63, 72, 84, 0.9));\r\n}\r\n\r\n.mars3d-tooltip-top:before {\r\n border-top-color: var(--mars-bg-base, rgba(23, 49, 71, 0.8));\r\n}\r\n\r\n.mars3d-tooltip-bottom:before {\r\n border-bottom-color: var(--mars-bg-base, rgba(23, 49, 71, 0.8));\r\n}\r\n\r\n.mars3d-tooltip-left:before {\r\n border-left-color: var(--mars-bg-base, rgba(23, 49, 71, 0.8));\r\n}\r\n\r\n.mars3d-tooltip-right:before {\r\n border-right-color: var(--mars-bg-base, rgba(23, 49, 71, 0.8));\r\n}\r\n.mars3d-template-content label {\r\n padding-right: 6px;\r\n}\r\n\r\n/* all ไธญ็š„htmlๆ ทๅผ */\r\n.mars3d-template-titile {\r\n height: 33px;\r\n line-height: 33px;\r\n padding-left: 10px;\r\n border-radius: 4px 4px 0px 0px;\r\n box-shadow:\r\n 0px 6px 12px -2px rgba(50, 50, 93, 0.15),\r\n 0px 3px 7px -3px rgba(0, 0, 0, 0.2);\r\n color: var(--mars-control-text) !important;\r\n background: var(--mars-msg-title-bg);\r\n font-family: var(--mars-font-family);\r\n\r\n a {\r\n font-size: 16px;\r\n color: var(--mars-msg-title-color, #479be0);\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.mars3d-template-content {\r\n margin-top: 0 !important;\r\n background-color: var(--mars-dropdown-bg);\r\n padding: 10px;\r\n color: #eaf2ff;\r\n\r\n label {\r\n padding-right: 6px;\r\n }\r\n\r\n input {\r\n color: var(--mars-text-color);\r\n background-color: transparent !important;\r\n padding: 4px 5px;\r\n }\r\n\r\n input::placeholder {\r\n color: #cdcdcd !important;\r\n }\r\n\r\n textarea {\r\n color: var(--mars-base-color);\r\n background-color: transparent !important;\r\n padding: 4px 5px;\r\n }\r\n\r\n textarea::placeholder {\r\n color: #cdcdcd !important;\r\n }\r\n}\r\n\r\n.mars3d-popup-btn-custom {\r\n padding: 3px 10px;\r\n border: 1px solid #209ffd;\r\n background: #209ffd1c;\r\n color: var(--mars-text-color, #ffffff);\r\n}\r\n\r\n.mars3d-popup-content {\r\n margin: 15px;\r\n}\r\n\r\n.mars3d-divGraphic:hover {\r\n z-index: 999 !important;\r\n}\r\n\r\n/* ้š่—Mars3D logo */\r\n.mars3d-logo {\r\n display: none !important;\r\n visibility: hidden !important;\r\n opacity: 0 !important;\r\n pointer-events: none;\r\n}\r\n</style>\r\n","<!--\r\n ToolbarPanel โ€” ๆต‹้‡ & ็ป˜ๅˆถๅทฅๅ…ทๆ \r\n\r\n ๆ”น่ฟ›็‚น๏ผˆ็›ธๅฏนๅŽŸ RightPanel๏ผ‰๏ผš\r\n - ๆต‹้‡ไธŽ็ป˜ๅˆถๅˆๅนถไธบ็ปŸไธ€ๅทฅๅ…ทๆ ๏ผŒๅŽปๆމๅ†—ไฝ™็š„ selectedGraphic ็ญ‰ๆœชไฝฟ็”จ prop\r\n - ๆ–ฐๅขžๆฟ€ๆดปๆ€้ซ˜ไบฎ๏ผˆactiveDrawType prop๏ผ‰\r\n - ๅ›พๆ ‡่ฏญไน‰ๆ›ดๅ‡†็กฎ๏ผˆไฝฟ็”จ title ๆ็คบ็”จๆˆทๅŠŸ่ƒฝ๏ผ‰\r\n-->\r\n<template>\r\n <div class=\"toolbar-panel\" :class=\"{ collapsed: isCollapsed }\">\r\n <!-- ๆ”ถ่ตท/ๅฑ•ๅผ€ header -->\r\n <div class=\"panel-header\" @click=\"toggleCollapse\">\r\n <i\r\n :class=\"[\r\n 'toggle-icon',\r\n 'fa',\r\n isCollapsed ? 'fa-chevron-down' : 'fa-chevron-up',\r\n ]\"\r\n />\r\n </div>\r\n\r\n <div class=\"panel-content\" v-show=\"!isCollapsed\">\r\n <!-- ๆต‹้‡ๅทฅๅ…ท็ป„ -->\r\n <div class=\"menu-group\">\r\n <div\r\n v-for=\"item in measureTools\"\r\n :key=\"item.tool\"\r\n class=\"menu-item\"\r\n :title=\"item.title\"\r\n @click=\"activateTool(item.tool)\"\r\n >\r\n <i :class=\"item.iconClasses\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"divider\" />\r\n\r\n <!-- ็ป˜ๅˆถๅทฅๅ…ท็ป„ -->\r\n <div class=\"menu-group\">\r\n <div\r\n v-for=\"item in drawTools\"\r\n :key=\"item.tool\"\r\n class=\"menu-item\"\r\n :class=\"{ active: activeDrawType === item.drawType }\"\r\n :title=\"item.title\"\r\n @click=\"activateTool(item.tool)\"\r\n >\r\n <i :class=\"item.iconClasses\" />\r\n </div>\r\n <div class=\"divider\" />\r\n <!-- ๆธ…้™คๆŒ‰้’ฎ -->\r\n <div class=\"menu-item\" title=\"ๆธ…้™คๅ…จ้ƒจ\" @click=\"emitClear\">\r\n <i class=\"fa-solid fa-trash-can\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from \"vue\";\r\n\r\n// โ”€โ”€โ”€ Props โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ndefineProps<{\r\n activeDrawType?: string | null;\r\n}>();\r\n\r\n// โ”€โ”€โ”€ Emits โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst emit = defineEmits<{\r\n toolActivate: [tool: string];\r\n clear: [];\r\n}>();\r\n\r\n// โ”€โ”€โ”€ State โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst isCollapsed = ref(false);\r\n\r\nconst toggleCollapse = () => {\r\n isCollapsed.value = !isCollapsed.value;\r\n};\r\nconst activateTool = (tool: string) => {\r\n emit(\"toolActivate\", tool);\r\n};\r\nconst emitClear = () => {\r\n emit(\"clear\");\r\n};\r\n\r\n// โ”€โ”€โ”€ ๅทฅๅ…ท้…็ฝฎ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ninterface ToolItem {\r\n tool: string;\r\n title: string;\r\n iconClasses: string[];\r\n drawType?: string;\r\n}\r\n\r\nconst measureTools: ToolItem[] = [\r\n {\r\n tool: \"measureDistance\",\r\n title: \"ๆต‹้‡่ท็ฆป\",\r\n iconClasses: [\"fa\", \"fa-arrows-alt-h\"], // ๆฐดๅนณๅŒๅ‘็ฎญๅคด๏ผŒๆ›ดๅ‡†็กฎ่กจ่พพ่ท็ฆป\r\n },\r\n {\r\n tool: \"measureArea\",\r\n title: \"ๆต‹้‡้ข็งฏ\",\r\n iconClasses: [\"fa\", \"fa-vector-square\"], // ็Ÿข้‡ๆ–นๅ—๏ผŒๆ›ดๅ‡ ไฝ•ๆ„Ÿใ€ไธ“ไธšๆ„Ÿ\r\n },\r\n {\r\n tool: \"measureHeight\",\r\n title: \"ๆต‹้‡้ซ˜ๅบฆๅทฎ\",\r\n iconClasses: [\"fa\", \"fa-arrows-alt-v\"], // ๅž‚็›ดๅŒๅ‘็ฎญๅคด๏ผŒๆธ…ๆ™ฐ่กจ่พพ้ซ˜ๅบฆ\r\n },\r\n {\r\n tool: \"measureAngle\",\r\n title: \"ๆต‹้‡่ง’ๅบฆ\",\r\n iconClasses: [\"fa-solid\", \"fa-compass-drafting\"], // ็ป˜ๅ›พๅœ†่ง„ๅ›พๆ ‡๏ผŒไธ“ไธš่กจ่พพ่ง’ๅบฆๆต‹้‡\r\n },\r\n];\r\n\r\nconst drawTools: ToolItem[] = [\r\n {\r\n tool: \"drawPoint\",\r\n title: \"็‚นๆ ‡่ฎฐ\",\r\n iconClasses: [\"fa\", \"fa-map-marker\"], // ๅœฐๅ›พๆ ‡่ฎฐ็‚น๏ผŒๆฏ”็ฉบๅฟƒๅœ†ๆ›ด็›ด่ง‚\r\n drawType: \"point\",\r\n },\r\n {\r\n tool: \"drawLine\",\r\n title: \"็บฟๆ ‡่ฎฐ\",\r\n iconClasses: [\"fa\", \"fa-slash\"], // ๆ–œ็บฟๆฏ”็Ÿญๆจช็บฟๆ›ดๅƒ\"็บฟ\"็š„ๆฆ‚ๅฟต\r\n drawType: \"polyline\",\r\n },\r\n {\r\n tool: \"drawPolygon\",\r\n title: \"้ขๆ ‡่ฎฐ\",\r\n iconClasses: [\"fa-solid\", \"fa-draw-polygon\"], // ๅคš่พนๅฝข็ป˜ๅˆถๅ›พๆ ‡๏ผŒ่ฏญไน‰ๆ˜Ž็กฎ\r\n drawType: \"polygon\",\r\n },\r\n {\r\n tool: \"drawCircle\",\r\n title: \"ๅœ†ๆ ‡่ฎฐ\",\r\n iconClasses: [\"fa\", \"fa-circle\"], // ๅฎžๅฟƒๅœ†่กจ็คบๅœ†\r\n drawType: \"circle\",\r\n },\r\n {\r\n tool: \"drawRectangle\",\r\n title: \"็Ÿฉๅฝขๆ ‡่ฎฐ\",\r\n iconClasses: [\"fa-regular\", \"fa-square\"], // ็ฉบๅฟƒๆ–นๅ—๏ผŒไธŽๅœ†ๆ ‡่ฎฐ้ฃŽๆ ผ็ปŸไธ€\r\n drawType: \"rectangle\",\r\n },\r\n {\r\n tool: \"drawFreePolygon\",\r\n title: \"่‡ช็”ฑๅคš่พนๅฝข\",\r\n iconClasses: [\"fa\", \"fa-pencil\"], // ้“…็ฌ”่กจ็คบ่‡ช็”ฑ็ป˜ๅˆถ\r\n drawType: \"freePolygon\",\r\n },\r\n];\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n.toolbar-panel {\r\n position: absolute;\r\n top: 10px;\r\n right: 0;\r\n width: 42px;\r\n background: rgba(23, 35, 50, 0.92);\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n border-radius: 6px 0 0 6px;\r\n border-right: none;\r\n z-index: 999;\r\n transition: max-height 0.3s ease;\r\n max-height: calc(100vh - 120px);\r\n overflow-y: auto;\r\n backdrop-filter: blur(4px);\r\n\r\n &.collapsed {\r\n max-height: 38px;\r\n .panel-content {\r\n display: none;\r\n }\r\n .panel-header {\r\n padding: 8px;\r\n justify-content: center;\r\n border-radius: 6px 0 0 6px;\r\n }\r\n }\r\n\r\n .panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 8px;\r\n background: rgba(15, 25, 40, 0.9);\r\n border-radius: 6px 0 0 0;\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n .toggle-icon {\r\n color: #7a9ec0;\r\n font-size: 12px;\r\n transition: all 0.3s ease;\r\n }\r\n\r\n &:hover .toggle-icon {\r\n color: #3ea6ff;\r\n }\r\n }\r\n\r\n .panel-content {\r\n padding: 6px 0;\r\n }\r\n\r\n .menu-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n }\r\n\r\n .menu-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 8px;\r\n color: #e8f4ff;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n transition: all 0.2s ease;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.25);\r\n color: #fff;\r\n }\r\n\r\n &.active {\r\n background: rgba(62, 166, 255, 0.4);\r\n color: #fff;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n i {\r\n font-size: 14px;\r\n line-height: 1;\r\n }\r\n }\r\n\r\n .divider {\r\n height: 1px;\r\n background: rgba(255, 255, 255, 0.08);\r\n margin: 6px 8px;\r\n }\r\n\r\n &::-webkit-scrollbar {\r\n width: 3px;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background: rgba(62, 166, 255, 0.3);\r\n border-radius: 2px;\r\n }\r\n}\r\n</style>\r\n","<!--\r\n VisionPanel โ€” ่ง†่ง’ๆŽงๅˆถ้ขๆฟ\r\n\r\n ่Œ่ดฃ๏ผš\r\n - ๅณไธ‹่ง’ๆ‚ฌๆตฎๆŒ‰้’ฎ + ๅผนๅ‡บๆตฎๅฑ‚\r\n - ๅ››ไธชๅŠŸ่ƒฝ๏ผš็Žฏ็ป•้ฃž่กŒ / ็งปๅŠจๅˆฐๆญคๅค„ / ็ฌฌไธ€่ง†่ง’ / ้”ฎ็›˜ๆผซๆธธ\r\n - ๆฟ€ๆดปๆ€้€š่ฟ‡ prop ไผ ๅ…ฅ๏ผŒไธๅœจๆญคๅค„็ปดๆŠค้€ป่พ‘\r\n-->\r\n<template>\r\n <!-- ่งฆๅ‘ๆŒ‰้’ฎ -->\r\n <div class=\"vision-button\" title=\"่ง†่ง‰ๅŠŸ่ƒฝ\" @click=\"togglePopup\">\r\n <i class=\"fa fa-eye\" />\r\n </div>\r\n\r\n <!-- ๅผนๅ‡บ้ขๆฟ -->\r\n <Transition name=\"vision-fade\">\r\n <div v-if=\"popupVisible\" class=\"vision-popup\">\r\n <div class=\"popup-header\">\r\n <span>่ง†่ง‰ๅŠŸ่ƒฝ</span>\r\n <i class=\"fa fa-times close-icon\" @click=\"popupVisible = false\" />\r\n </div>\r\n <div class=\"popup-content\">\r\n <div\r\n v-for=\"item in visionItems\"\r\n :key=\"item.action\"\r\n class=\"popup-item\"\r\n :class=\"{ active: isActive(item) }\"\r\n @click=\"execute(item.action)\"\r\n >\r\n <i :class=\"['fa', item.icon]\" />\r\n <span>{{ getLabel(item) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from \"vue\";\r\n\r\n// โ”€โ”€โ”€ Props โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst props = defineProps<{\r\n circleFlyActive?: boolean;\r\n flyToActive?: boolean;\r\n firstPersonActive?: boolean;\r\n keyboardNavigateActive?: boolean;\r\n}>();\r\n\r\n// โ”€โ”€โ”€ Emits โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst emit = defineEmits<{\r\n visionExecute: [action: string];\r\n}>();\r\n\r\n// โ”€โ”€โ”€ State โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst popupVisible = ref(false);\r\nconst togglePopup = () => { popupVisible.value = !popupVisible.value; };\r\nconst execute = (action: string) => { emit(\"visionExecute\", action); };\r\n\r\n// โ”€โ”€โ”€ ๅŠŸ่ƒฝ้…็ฝฎ่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ninterface VisionItem {\r\n action: string;\r\n icon: string;\r\n label: string;\r\n activeLabel?: string;\r\n activeProp?: keyof typeof props;\r\n}\r\n\r\nconst visionItems: VisionItem[] = [\r\n {\r\n action: \"circleFly\",\r\n icon: \"fa-refresh\",\r\n label: \"็Žฏ็ป•้ฃž่กŒ\",\r\n activeLabel: \"ๅ…ณ้—ญ็Žฏ็ป•้ฃž่กŒ\",\r\n activeProp: \"circleFlyActive\",\r\n },\r\n {\r\n action: \"flyTo\",\r\n icon: \"fa-location-arrow\",\r\n label: \"็งปๅŠจๅˆฐๆญคๅค„\",\r\n activeProp: \"flyToActive\",\r\n },\r\n {\r\n action: \"firstPerson\",\r\n icon: \"fa-user\",\r\n label: \"ๅผ€ๅฏ็ฌฌไธ€่ง†่ง’\",\r\n activeLabel: \"ๅ…ณ้—ญ็ฌฌไธ€่ง†่ง’\",\r\n activeProp: \"firstPersonActive\",\r\n },\r\n {\r\n action: \"keyboardNavigate\",\r\n icon: \"fa-keyboard-o\",\r\n label: \"ๅผ€ๅฏ้”ฎ็›˜ๆผซๆธธ\",\r\n activeLabel: \"ๅ…ณ้—ญ้”ฎ็›˜ๆผซๆธธ\",\r\n activeProp: \"keyboardNavigateActive\",\r\n },\r\n];\r\n\r\nconst isActive = (item: VisionItem) =>\r\n item.activeProp ? !!props[item.activeProp] : false;\r\n\r\nconst getLabel = (item: VisionItem) =>\r\n isActive(item) && item.activeLabel ? item.activeLabel : item.label;\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n.vision-button {\r\n position: absolute;\r\n bottom: 80px;\r\n right: 0;\r\n width: 42px;\r\n height: 42px;\r\n background: rgba(23, 35, 50, 0.92);\r\n border-radius: 6px 0 0 6px;\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n border-right: none;\r\n z-index: 999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #e8f4ff;\r\n cursor: pointer;\r\n backdrop-filter: blur(4px);\r\n transition: all 0.2s ease;\r\n\r\n &:hover { \r\n background: rgba(62, 166, 255, 0.25);\r\n color: #fff;\r\n }\r\n i { font-size: 14px; }\r\n}\r\n\r\n.vision-popup {\r\n position: absolute;\r\n bottom: 80px;\r\n right: 48px;\r\n width: 170px;\r\n background: rgba(23, 35, 50, 0.92);\r\n border-radius: 6px;\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n backdrop-filter: blur(4px);\r\n z-index: 998;\r\n\r\n .popup-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 12px;\r\n background: rgba(15, 25, 40, 0.9);\r\n border-radius: 5px 5px 0 0;\r\n\r\n span { color: #e8f4ff; font-size: 13px; font-weight: 600; }\r\n\r\n .close-icon {\r\n color: #7a9ec0;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: color 0.2s ease;\r\n &:hover { color: #3ea6ff; }\r\n }\r\n }\r\n\r\n .popup-content { padding: 6px 0; }\r\n\r\n .popup-item {\r\n display: flex;\r\n align-items: center;\r\n padding: 8px 12px;\r\n color: #e8f4ff;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border-radius: 3px;\r\n margin: 0 4px;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.25);\r\n color: #fff;\r\n }\r\n &.active { \r\n background: rgba(62, 166, 255, 0.4);\r\n color: #fff;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n i { margin-right: 10px; width: 16px; text-align: center; font-size: 14px; }\r\n span { font-size: 12px; }\r\n }\r\n}\r\n\r\n// ่ฟ‡ๆธกๅŠจ็”ป\r\n.vision-fade-enter-active,\r\n.vision-fade-leave-active {\r\n transition: opacity 0.25s ease, transform 0.25s ease;\r\n}\r\n.vision-fade-enter-from,\r\n.vision-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(15px);\r\n}\r\n</style>\r\n","/**\r\n * useMap โ€” ๅœฐๅ›พๆ ธๅฟƒ composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ๆŒๆœ‰ mars3d.Map ๅฎžไพ‹\r\n * - ็ฎก็†ไธšๅŠก GraphicLayer๏ผˆ็ป˜ๅ›พๅฑ‚๏ผ‰ๅ’Œ measureLayer๏ผˆๆต‹้‡ๅฑ‚๏ผ‰\r\n * - ๆšด้œฒๅœฐๅ›พไบ‹ไปถๅ›ž่ฐƒ๏ผˆ็‚นๅ‡ปๅๆ ‡่ฎฐๅฝ•๏ผ‰\r\n * - ๆไพ›็ปŸไธ€็š„ๅ›พๅฑ‚/thing ๆณจๅ†ŒๆŽฅๅฃ๏ผŒๆ–นไพฟๅŽ็ปญไธšๅŠกๆ‰ฉๅฑ•\r\n */\r\nimport { ref, shallowRef } from \"vue\";\r\nimport * as mars3d from \"mars3d\";\r\n\r\n// ไฝฟ็”จ any ้ฟๅ… Mars3D ็ฑปๅž‹ๅฎšไน‰่ฟ‡ๆทฑๅฏผ่‡ด็š„ TS ๆŽจๆ–ญๆบขๅ‡บ\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype AnyShallowRef<T> = { readonly value: T | null };\r\n\r\nexport function useMap() {\r\n const Cesium = mars3d.Cesium;\r\n\r\n // โ”€โ”€โ”€ ๅœฐๅ›พๅฎžไพ‹๏ผˆshallowRef ้ฟๅ…ๆทฑๅ“ๅบ”ไปฃ็† Cesium ๅฏน่ฑก๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const mapRef = shallowRef<mars3d.Map | null>(null);\r\n\r\n // โ”€โ”€โ”€ ๆ ธๅฟƒๅ›พๅฑ‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const graphicLayer = shallowRef<mars3d.layer.GraphicLayer | null>(null);\r\n const measureLayer = shallowRef<mars3d.layer.GraphicLayer | null>(null);\r\n\r\n // โ”€โ”€โ”€ ้€‰ไธญๅ›พๅฝข โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const selectedGraphic = ref<any>(null);\r\n\r\n // โ”€โ”€โ”€ ๆœ€ๅŽ็‚นๅ‡ปไฝ็ฝฎ๏ผˆ่ง†่ง’่ทณ่ฝฌ็ญ‰ๅŠŸ่ƒฝๅ…ฑไบซ๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const lastClickPosition = ref<{ lng: number; lat: number; alt: number } | null>(null);\r\n\r\n /**\r\n * ๅœจๅœฐๅ›พๅŠ ่ฝฝๅฎŒๆฏ•ๅŽ่ฐƒ็”จ๏ผŒๅฎŒๆˆๅ›พๅฑ‚ใ€ไบ‹ไปถ็š„ๅˆๅง‹ๅŒ–\r\n */\r\n function initMap(map: mars3d.Map) {\r\n mapRef.value = map;\r\n\r\n // ไธšๅŠก็ป˜ๅ›พๅฑ‚\r\n const gLayer = new mars3d.layer.GraphicLayer();\r\n map.addLayer(gLayer);\r\n graphicLayer.value = gLayer;\r\n\r\n // ๆต‹้‡ไธ“็”จๅ›พๅฑ‚\r\n const mLayer = new mars3d.layer.GraphicLayer();\r\n map.addLayer(mLayer);\r\n measureLayer.value = mLayer;\r\n\r\n // โ”€โ”€ ๅœฐๅ›พ็‚นๅ‡ป๏ผš่ฎฐๅฝ•ๅๆ ‡ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n map.on(mars3d.EventType.click, (event: any) => {\r\n if (event.lnglat) {\r\n lastClickPosition.value = event.lnglat;\r\n } else if (event.cartesian) {\r\n const carto = Cesium.Ellipsoid.WGS84.cartesianToCartographic(event.cartesian);\r\n lastClickPosition.value = {\r\n lng: Cesium.Math.toDegrees(carto.longitude),\r\n lat: Cesium.Math.toDegrees(carto.latitude),\r\n alt: carto.height > 0 ? carto.height : 5000,\r\n };\r\n }\r\n });\r\n\r\n // โ”€โ”€ ๅ›พๅฝขๅฑ‚ไบคไบ’ไบ‹ไปถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n gLayer.on(mars3d.EventType.click, (event: any) => {\r\n selectedGraphic.value = event.graphic;\r\n });\r\n gLayer.on(mars3d.EventType.mouseOver, (event: any) => {\r\n if (!selectedGraphic.value) {\r\n selectedGraphic.value = event.graphic;\r\n }\r\n });\r\n gLayer.on(mars3d.EventType.mouseOut, (event: any) => {\r\n if (selectedGraphic.value === event.graphic) {\r\n selectedGraphic.value = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ้”€ๆฏๅœฐๅ›พ๏ผˆ็ป„ไปถๅธ่ฝฝๆ—ถ่ฐƒ็”จ๏ผ‰\r\n */\r\n function destroyMap() {\r\n if (mapRef.value) {\r\n mapRef.value.destroy();\r\n mapRef.value = null;\r\n }\r\n }\r\n\r\n /**\r\n * ไพฟๆทๆ–นๆณ•๏ผšๅ‘ไธšๅŠกๅ›พๅฑ‚ๆทปๅŠ  Graphic\r\n */\r\n function addGraphic(graphic: any) {\r\n graphicLayer.value?.addGraphic(graphic);\r\n }\r\n\r\n /**\r\n * ๅ‘ๅœฐๅ›พๆทปๅŠ ่‡ชๅฎšไน‰ Thing๏ผˆไพ›ไธšๅŠกๆ‰ฉๅฑ•๏ผ‰\r\n */\r\n function addThing(thing: any) {\r\n mapRef.value?.addThing(thing);\r\n }\r\n\r\n return {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map: mapRef as AnyShallowRef<any>,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n graphicLayer: graphicLayer as AnyShallowRef<any>,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n measureLayer: measureLayer as AnyShallowRef<any>,\r\n selectedGraphic,\r\n lastClickPosition,\r\n initMap,\r\n destroyMap,\r\n addGraphic,\r\n addThing,\r\n };\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type UseMapReturn = ReturnType<typeof useMap>;\r\n","/**\r\n * useMeasure โ€” ๆต‹้‡ๅทฅๅ…ท composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ๅฐ่ฃ… mars3d.thing.Measure ็š„็”Ÿๅ‘ฝๅ‘จๆœŸ\r\n * - ๆไพ› ่ท็ฆป / ้ข็งฏ / ้ซ˜ๅบฆๅทฎ / ่ง’ๅบฆ ๅ››็งๆต‹้‡ๆ–นๆณ•\r\n * - ๆไพ› clear ๆธ…้™คๆ–นๆณ•\r\n *\r\n * ไพ่ต–๏ผšuseMap ่ฟ”ๅ›ž็š„ map ไธŽ measureLayer\r\n */\r\nimport { shallowRef } from \"vue\";\r\nimport * as mars3d from \"mars3d\";\r\nimport type { UseMapReturn } from \"./useMap\";\r\n\r\nexport function useMeasure(mapContext: UseMapReturn) {\r\n const measureThing = shallowRef<mars3d.thing.Measure | null>(null);\r\n\r\n /** ๅœจๅœฐๅ›พๅˆๅง‹ๅŒ–ๅŽ่ฐƒ็”จ๏ผŒๆณจๅ†Œ Measure thing */\r\n function initMeasure() {\r\n const map = mapContext.map.value;\r\n const layer = mapContext.measureLayer.value;\r\n if (!map || !layer) return;\r\n\r\n const m = new mars3d.thing.Measure({ graphicLayer: layer } as any);\r\n map.addThing(m);\r\n measureThing.value = m;\r\n }\r\n\r\n /** ๆต‹้‡่ท็ฆป */\r\n function measureDistance(style?: Record<string, any>) {\r\n measureThing.value?.distance({\r\n style: { color: \"#3388ff\", width: 3, ...style },\r\n });\r\n }\r\n\r\n /** ๆต‹้‡้ข็งฏ */\r\n function measureArea(style?: Record<string, any>) {\r\n measureThing.value?.area({\r\n style: { color: \"#3388ff\", opacity: 0.5, ...style },\r\n });\r\n }\r\n\r\n /** ๆต‹้‡้ซ˜ๅบฆๅทฎ */\r\n function measureHeight(style?: Record<string, any>) {\r\n measureThing.value?.height({\r\n style: { color: \"#3388ff\", width: 3, ...style },\r\n });\r\n }\r\n\r\n /** ๆต‹้‡่ง’ๅบฆ */\r\n function measureAngle(style?: Record<string, any>) {\r\n measureThing.value?.angle({\r\n style: { color: \"#3388ff\", width: 3, ...style },\r\n });\r\n }\r\n\r\n /** ๆธ…้™คๆ‰€ๆœ‰ๆต‹้‡็ป“ๆžœ */\r\n function clearMeasure() {\r\n measureThing.value?.clear();\r\n mapContext.measureLayer.value?.clear();\r\n }\r\n\r\n return {\r\n measureThing,\r\n initMeasure,\r\n measureDistance,\r\n measureArea,\r\n measureHeight,\r\n measureAngle,\r\n clearMeasure,\r\n };\r\n}\r\n","/**\r\n * useDraw โ€” ็ป˜ๅˆถๅทฅๅ…ท composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ๅฐ่ฃ…ๅ…ญ็งๅ›พๅฝข็ป˜ๅˆถ๏ผˆ็‚น/็บฟ/้ข/ๅœ†/็Ÿฉๅฝข/่‡ช็”ฑๅคš่พนๅฝข๏ผ‰\r\n * - ็ปŸไธ€็ฎก็† currentDraw ๅผ•็”จ๏ผŒไฟ่ฏ็ป˜ๅˆถไบ’ๆ–ฅ\r\n * - ๆไพ› stopDraw / clearDraw ๆ–นๆณ•\r\n *\r\n * ไพ่ต–๏ผšuseMap ่ฟ”ๅ›ž็š„ measureLayer๏ผˆ็ป˜ๅ›พ็ป“ๆžœๅค็”จๆต‹้‡ๅฑ‚๏ผŒไนŸๅฏไผ ็‹ฌ็ซ‹ๅ›พๅฑ‚๏ผ‰\r\n */\r\nimport { ref, shallowRef } from \"vue\";\r\nimport type { UseMapReturn } from \"./useMap\";\r\n\r\n/** ๆ”ฏๆŒ็š„็ป˜ๅˆถ็ฑปๅž‹ๆžšไธพ๏ผŒๆ–นไพฟๅค–้ƒจ็ฑปๅž‹ๆ็คบ */\r\nexport type DrawType = \"point\" | \"polyline\" | \"polygon\" | \"circle\" | \"rectangle\" | \"freePolygon\";\r\n\r\nexport function useDraw(mapContext: UseMapReturn) {\r\n const currentDraw = shallowRef<any>(null);\r\n /** ๅฝ“ๅ‰ๆฟ€ๆดป็š„็ป˜ๅˆถ็ฑปๅž‹๏ผŒ็”จไบŽ UI ้ซ˜ไบฎ */\r\n const activeDrawType = ref<DrawType | null>(null);\r\n\r\n /** ่Žทๅ–็ป˜ๅˆถ็›ฎๆ ‡ๅ›พๅฑ‚๏ผˆๅค็”จ measureLayer๏ผŒไนŸๅฏๆŒ‰้œ€ไผ ๅ…ถไป–ๅฑ‚๏ผ‰ */\r\n function getLayer() {\r\n return mapContext.measureLayer.value;\r\n }\r\n\r\n /** ๅ†…้ƒจๅฏๅŠจ็ป˜ๅˆถ */\r\n function startDraw(type: string, style: Record<string, any>, drawType: DrawType) {\r\n const layer = getLayer();\r\n if (!layer) return;\r\n stopDraw(); // ๅ…ˆๅœๆญขไธŠไธ€ๆฌกๆœชๅฎŒๆˆ็š„็ป˜ๅˆถ\r\n currentDraw.value = layer.startDraw({ type, style });\r\n activeDrawType.value = drawType;\r\n }\r\n\r\n /** ็ป˜ๅˆถ็‚น */\r\n function drawPoint(style?: Record<string, any>) {\r\n startDraw(\"point\", { pixelSize: 10, color: \"#ff0000\", ...style }, \"point\");\r\n }\r\n\r\n /** ็ป˜ๅˆถๆŠ˜็บฟ */\r\n function drawLine(style?: Record<string, any>) {\r\n startDraw(\"polyline\", { width: 3, color: \"#3388ff\", ...style }, \"polyline\");\r\n }\r\n\r\n /** ็ป˜ๅˆถๅคš่พนๅฝข */\r\n function drawPolygon(style?: Record<string, any>) {\r\n startDraw(\"polygon\", { color: \"#3388ff\", opacity: 0.5, ...style }, \"polygon\");\r\n }\r\n\r\n /** ็ป˜ๅˆถๅœ† */\r\n function drawCircle(style?: Record<string, any>) {\r\n startDraw(\"circle\", { radius: 1000, color: \"#00ff00\", opacity: 0.3, ...style }, \"circle\");\r\n }\r\n\r\n /** ็ป˜ๅˆถ็Ÿฉๅฝข */\r\n function drawRectangle(style?: Record<string, any>) {\r\n startDraw(\"rectangle\", { color: \"#3388ff\", opacity: 0.5, ...style }, \"rectangle\");\r\n }\r\n\r\n /** ็ป˜ๅˆถ่‡ช็”ฑๅคš่พนๅฝข๏ผˆ่ดดๅœฐ๏ผ‰ */\r\n function drawFreePolygon(style?: Record<string, any>) {\r\n startDraw(\r\n \"polygon\",\r\n { color: \"#3388ff\", opacity: 0.5, clampToGround: true, ...style },\r\n \"freePolygon\",\r\n );\r\n }\r\n\r\n /** ๅœๆญขๅฝ“ๅ‰็ป˜ๅˆถ๏ผŒไฝ†ไฟ็•™ๅทฒ็ป˜็ป“ๆžœ */\r\n function stopDraw() {\r\n if (currentDraw.value) {\r\n getLayer()?.stopDraw();\r\n currentDraw.value = null;\r\n }\r\n activeDrawType.value = null;\r\n }\r\n\r\n /** ๅœๆญขๅนถๆธ…้™คๆ‰€ๆœ‰็ป˜ๅˆถ็ป“ๆžœ */\r\n function clearDraw() {\r\n stopDraw();\r\n getLayer()?.clear();\r\n }\r\n\r\n return {\r\n currentDraw,\r\n activeDrawType,\r\n drawPoint,\r\n drawLine,\r\n drawPolygon,\r\n drawCircle,\r\n drawRectangle,\r\n drawFreePolygon,\r\n stopDraw,\r\n clearDraw,\r\n };\r\n}\r\n","/**\r\n * useVision โ€” ่ง†่ง’ๆŽงๅˆถ composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ๅฐ่ฃ…็Žฏ็ป•้ฃž่กŒ๏ผˆRotatePoint๏ผ‰\r\n * - ๅฐ่ฃ…้ฃž่กŒๅˆฐๆŒ‡ๅฎšไฝ็ฝฎ๏ผˆflyTo / flyHome๏ผ‰\r\n * - ๅฐ่ฃ…็ฌฌไธ€่ง†่ง’ๆผซๆธธ๏ผˆFirstPersonRoam๏ผ‰\r\n * - ๅฐ่ฃ…้”ฎ็›˜ๆผซๆธธ๏ผˆKeyboardRoam๏ผ‰\r\n * - ๆšด้œฒๅ„ๅŠŸ่ƒฝ็š„ๆฟ€ๆดป็Šถๆ€๏ผŒไพ› UI ๆ˜พ็คบๅˆ‡ๆขๆ–‡ๆกˆ\r\n *\r\n * ไพ่ต–๏ผšuseMap ่ฟ”ๅ›ž็š„ map ไธŽ lastClickPosition\r\n */\r\nimport { ref, shallowRef } from \"vue\";\r\nimport * as mars3d from \"mars3d\";\r\nimport type { UseMapReturn } from \"./useMap\";\r\n\r\nexport function useVision(mapContext: UseMapReturn) {\r\n // โ”€โ”€โ”€ ็Šถๆ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const circleFlyActive = ref(false);\r\n const firstPersonActive = ref(false);\r\n const keyboardActive = ref(false);\r\n const flyToActive = ref(false);\r\n\r\n // โ”€โ”€โ”€ Thing ๅฎžไพ‹ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const rotatePoint = shallowRef<mars3d.thing.RotatePoint | null>(null);\r\n const firstPersonRoam = shallowRef<mars3d.thing.FirstPersonRoam | null>(null);\r\n const keyboardRoam = shallowRef<mars3d.thing.KeyboardRoam | null>(null);\r\n let initialCameraView: any = null;\r\n\r\n /** ่Žทๅ–ๅœฐๅ›พๅฎžไพ‹๏ผˆๅ†…้ƒจ็ฎ€ๅ†™๏ผ‰ */\r\n function getMap() {\r\n return mapContext.map.value;\r\n }\r\n\r\n // โ”€โ”€โ”€ ็Žฏ็ป•้ฃž่กŒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function toggleCircleFly() {\r\n const map = getMap();\r\n if (!map) return;\r\n\r\n if (rotatePoint.value) {\r\n if (rotatePoint.value.isStart) {\r\n rotatePoint.value.stop();\r\n }\r\n map.removeThing(rotatePoint.value);\r\n rotatePoint.value = null;\r\n circleFlyActive.value = false;\r\n return;\r\n }\r\n\r\n const center = map.getCenter();\r\n const rp = new mars3d.thing.RotatePoint({ distance: 5000, time: 30 });\r\n map.addThing(rp);\r\n rp.start(center);\r\n rotatePoint.value = rp;\r\n circleFlyActive.value = true;\r\n }\r\n\r\n // โ”€โ”€โ”€ ้ฃž่กŒๅˆฐ็‚นๅ‡ปไฝ็ฝฎๆˆ–ๅœฐๅ›พไธญๅฟƒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function flyTo() {\r\n const map = getMap();\r\n if (!map) return;\r\n\r\n flyToActive.value = true;\r\n const done = () => setTimeout(() => { flyToActive.value = false; }, 2000);\r\n\r\n const pos = mapContext.lastClickPosition.value;\r\n if (pos) {\r\n const target = { ...pos, alt: pos.alt > 0 ? pos.alt : 5000 };\r\n map.setCameraView(target, { duration: 2, complete: done });\r\n } else {\r\n map.flyHome({ duration: 2 });\r\n done();\r\n }\r\n }\r\n\r\n // โ”€โ”€โ”€ ็ฌฌไธ€่ง†่ง’ๆผซๆธธ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function toggleFirstPerson() {\r\n const map = getMap();\r\n if (!map) return;\r\n\r\n if (!firstPersonRoam.value) {\r\n const roam = new mars3d.thing.FirstPersonRoam({});\r\n map.addThing(roam);\r\n initialCameraView = map.getCameraView();\r\n roam.enabled = true;\r\n firstPersonRoam.value = roam;\r\n firstPersonActive.value = true;\r\n } else {\r\n const roam = firstPersonRoam.value;\r\n roam.enabled = !roam.enabled;\r\n firstPersonActive.value = roam.enabled;\r\n if (!roam.enabled && initialCameraView) {\r\n map.setCameraView(initialCameraView, { duration: 1 });\r\n } else if (roam.enabled) {\r\n initialCameraView = map.getCameraView();\r\n }\r\n }\r\n }\r\n\r\n // โ”€โ”€โ”€ ้”ฎ็›˜ๆผซๆธธ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function toggleKeyboardNavigate() {\r\n const map = getMap();\r\n if (!map) return;\r\n\r\n if (!keyboardRoam.value) {\r\n const roam = new mars3d.thing.KeyboardRoam({});\r\n map.addThing(roam);\r\n roam.enabled = true;\r\n keyboardRoam.value = roam;\r\n keyboardActive.value = true;\r\n } else {\r\n const roam = keyboardRoam.value;\r\n roam.enabled = !roam.enabled;\r\n keyboardActive.value = roam.enabled;\r\n }\r\n }\r\n\r\n return {\r\n // ็Šถๆ€\r\n circleFlyActive,\r\n firstPersonActive,\r\n keyboardActive,\r\n flyToActive,\r\n // ๆ–นๆณ•\r\n toggleCircleFly,\r\n flyTo,\r\n toggleFirstPerson,\r\n toggleKeyboardNavigate,\r\n };\r\n}\r\n","<!--\r\n MarsMapContainer โ€” ๅœฐๅ›พๆ ธๅฟƒๅฎนๅ™จ็ป„ไปถ\r\n\r\n ๅŠŸ่ƒฝ๏ผš\r\n 1. ้›†ๆˆๅบ•ๅฑ‚ MarsMap ๆธฒๆŸ“็ป„ไปถ\r\n 2. ๅ†…็ฝฎๆต‹้‡/็ป˜ๅˆถๅทฅๅ…ทๆ ๏ผˆToolbarPanel๏ผ‰ๅ’Œ่ง†่ง’ๆŽงๅˆถ้ขๆฟ๏ผˆVisionPanel๏ผ‰\r\n 3. ็ป„ๅˆๆ‰€ๆœ‰ composable๏ผŒ้€š่ฟ‡ provide ๅ‘ๅญ็ป„ไปถ/ๆ’ๆงฝ้€ไผ ๅœฐๅ›พไธŠไธ‹ๆ–‡\r\n 4. ้€š่ฟ‡ default ๆ’ๆงฝๆ”ฏๆŒไธšๅŠก็ป„ไปถๅ ๅŠ ๏ผˆpopupใ€ๅ›พ่กจใ€็ปŸ่ฎก้ขๆฟ็ญ‰๏ผ‰\r\n\r\n Props๏ผš\r\n - configUrl ๅœฐๅ›พ้…็ฝฎ JSON ่ทฏๅพ„\r\n - mapKey ๅคšๅœฐๅ›พๆ—ถๅŒบๅˆ†ๅฎžไพ‹็š„ key๏ผˆ้ป˜่ฎค \"default\"๏ผ‰\r\n - hideToolbar ๆ˜ฏๅฆ้š่—ๅทฅๅ…ทๆ ๏ผˆ้ป˜่ฎค false๏ผ‰\r\n - hideVision ๆ˜ฏๅฆ้š่—่ง†่ง‰ๆŽงๅˆถๆŒ‰้’ฎ๏ผˆ้ป˜่ฎค false๏ผ‰\r\n\r\n Expose๏ผˆไพ›็ˆถ็ป„ไปถ้€š่ฟ‡ ref ่ฎฟ้—ฎ๏ผ‰๏ผš\r\n - map\r\n - graphicLayer\r\n - measureLayer\r\n - selectedGraphic\r\n - addGraphic()\r\n - addThing()\r\n - measure๏ผˆuseMeasure ๅ…จ้‡่ฟ”ๅ›ž๏ผ‰\r\n - draw๏ผˆuseDraw ๅ…จ้‡่ฟ”ๅ›ž๏ผ‰\r\n - vision๏ผˆuseVision ๅ…จ้‡่ฟ”ๅ›ž๏ผ‰\r\n-->\r\n<template>\r\n <div class=\"mars-map-container\">\r\n <!-- ๅบ•ๅฑ‚ๅœฐๅ›พๆธฒๆŸ“ -->\r\n <MarsMap\r\n :url=\"configUrl\"\r\n :map-key=\"mapKey\"\r\n @onload=\"onMapLoad\"\r\n />\r\n\r\n <!-- ๆต‹้‡/็ป˜ๅˆถๅทฅๅ…ทๆ  -->\r\n <ToolbarPanel\r\n v-if=\"!hideToolbar\"\r\n :active-draw-type=\"draw.activeDrawType.value\"\r\n @tool-activate=\"handleToolActivate\"\r\n @clear=\"handleClear\"\r\n />\r\n\r\n <!-- ่ง†่ง’ๆŽงๅˆถ้ขๆฟ -->\r\n <VisionPanel\r\n v-if=\"!hideVision\"\r\n :circle-fly-active=\"vision.circleFlyActive.value\"\r\n :fly-to-active=\"vision.flyToActive.value\"\r\n :first-person-active=\"vision.firstPersonActive.value\"\r\n :keyboard-navigate-active=\"vision.keyboardActive.value\"\r\n @vision-execute=\"handleVisionExecute\"\r\n />\r\n\r\n <!-- ไธšๅŠกๆ’ๆงฝ๏ผš่‡ชๅฎšไน‰ UI ๅ ๅŠ ๅฑ‚ -->\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { provide } from \"vue\";\r\nimport MarsMap from \"../mars-work/mars-map.vue\";\r\nimport ToolbarPanel from \"./panels/ToolbarPanel.vue\";\r\nimport VisionPanel from \"./panels/VisionPanel.vue\";\r\n\r\nimport { useMap } from \"./composables/useMap\";\r\nimport { useMeasure } from \"./composables/useMeasure\";\r\nimport { useDraw } from \"./composables/useDraw\";\r\nimport { useVision } from \"./composables/useVision\";\r\n\r\n// โ”€โ”€โ”€ Props โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst props = withDefaults(\r\n defineProps<{\r\n configUrl?: string;\r\n mapKey?: string;\r\n hideToolbar?: boolean;\r\n hideVision?: boolean;\r\n }>(),\r\n {\r\n configUrl: \"config/config.json\",\r\n mapKey: \"default\",\r\n hideToolbar: false,\r\n hideVision: false,\r\n },\r\n);\r\n\r\n// โ”€โ”€โ”€ Emits โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst emit = defineEmits<{\r\n /** ๅœฐๅ›พๅŠ ่ฝฝๅฎŒๆˆ๏ผŒๅ›žไผ  map ๅฎžไพ‹ */\r\n onload: [map: any];\r\n}>();\r\n\r\n// โ”€โ”€โ”€ Composables โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst mapCtx = useMap();\r\nconst measure = useMeasure(mapCtx);\r\nconst draw = useDraw(mapCtx);\r\nconst vision = useVision(mapCtx);\r\n\r\n// โ”€โ”€โ”€ provide๏ผˆไพ›ๆ’ๆงฝๅ†…็š„ไธšๅŠก็ป„ไปถ็›ดๆŽฅ inject ไฝฟ็”จ๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nprovide(\"mapContext\", mapCtx);\r\nprovide(\"measureContext\", measure);\r\nprovide(\"drawContext\", draw);\r\nprovide(\"visionContext\", vision);\r\n\r\n// โ”€โ”€โ”€ ๅœฐๅ›พๅŠ ่ฝฝๅ›ž่ฐƒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction onMapLoad(map: any) {\r\n mapCtx.initMap(map);\r\n measure.initMeasure();\r\n emit(\"onload\", map);\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅทฅๅ…ทๆ ไบ‹ไปถๅค„็† โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ntype ToolAction =\r\n | \"measureDistance\" | \"measureArea\" | \"measureHeight\" | \"measureAngle\"\r\n | \"drawPoint\" | \"drawLine\" | \"drawPolygon\" | \"drawCircle\" | \"drawRectangle\" | \"drawFreePolygon\";\r\n\r\nfunction handleToolActivate(tool: string) {\r\n switch (tool as ToolAction) {\r\n case \"measureDistance\": measure.measureDistance(); break;\r\n case \"measureArea\": measure.measureArea(); break;\r\n case \"measureHeight\": measure.measureHeight(); break;\r\n case \"measureAngle\": measure.measureAngle(); break;\r\n case \"drawPoint\": draw.drawPoint(); break;\r\n case \"drawLine\": draw.drawLine(); break;\r\n case \"drawPolygon\": draw.drawPolygon(); break;\r\n case \"drawCircle\": draw.drawCircle(); break;\r\n case \"drawRectangle\": draw.drawRectangle(); break;\r\n case \"drawFreePolygon\": draw.drawFreePolygon(); break;\r\n }\r\n}\r\n\r\nfunction handleClear() {\r\n measure.clearMeasure();\r\n draw.clearDraw();\r\n}\r\n\r\n// โ”€โ”€โ”€ ่ง†่ง’ๆŽงๅˆถไบ‹ไปถๅค„็† โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ntype VisionAction = \"circleFly\" | \"flyTo\" | \"firstPerson\" | \"keyboardNavigate\";\r\n\r\nfunction handleVisionExecute(action: string) {\r\n switch (action as VisionAction) {\r\n case \"circleFly\": vision.toggleCircleFly(); break;\r\n case \"flyTo\": vision.flyTo(); break;\r\n case \"firstPerson\": vision.toggleFirstPerson(); break;\r\n case \"keyboardNavigate\": vision.toggleKeyboardNavigate(); break;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ Expose๏ผˆ็ˆถ็ป„ไปถ ref ่ฎฟ้—ฎ๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ndefineExpose({\r\n map: mapCtx.map,\r\n graphicLayer: mapCtx.graphicLayer,\r\n measureLayer: mapCtx.measureLayer,\r\n selectedGraphic: mapCtx.selectedGraphic,\r\n lastClickPosition: mapCtx.lastClickPosition,\r\n addGraphic: mapCtx.addGraphic,\r\n addThing: mapCtx.addThing,\r\n measure,\r\n draw,\r\n vision,\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.mars-map-container {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n</style>\r\n","/**\r\n * usePoiMarker โ€” POI ๆ ‡ๆณจ็ฎก็† composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ็ปดๆŠค POI ๆ•ฐๆฎๅˆ—่กจ๏ผˆ็บฏๆ•ฐๆฎๅฑ‚๏ผ‰\r\n * - ็ฎก็†ๅœฐๅ›พไธŠๅฏนๅบ”็š„ BillboardEntity ๅ›พๅฝข๏ผˆๅ›พๅฝขๅฑ‚๏ผ‰\r\n * - ๆไพ› ๆทปๅŠ  / ๅˆ ้™ค / ้€‰ไธญ / ้ฃž่กŒๅฎšไฝ ๆ“ไฝœ\r\n * - ๆ•ฐๆฎไธŽๅ›พๅฝขไฟๆŒๅŒๅ‘ๅŒๆญฅ๏ผˆ้€š่ฟ‡ graphicId ๅ…ณ่”๏ผ‰\r\n *\r\n * ไฝฟ็”จๆ–นๅผ๏ผˆๅœจไธšๅŠก็ป„ไปถๅ†…๏ผ‰๏ผš\r\n * const mapCtx = inject<UseMapReturn>('mapContext')!\r\n * const poi = usePoiMarker(mapCtx)\r\n */\r\nimport { ref, shallowRef } from \"vue\";\r\nimport * as mars3d from \"mars3d\";\r\nimport type { UseMapReturn } from \"../../mars-map/composables/useMap\";\r\n\r\n// โ”€โ”€โ”€ POI ๆ•ฐๆฎ็ฑปๅž‹ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport interface PoiItem {\r\n id: string;\r\n name: string;\r\n lng: number;\r\n lat: number;\r\n alt: number;\r\n category: \"default\" | \"warning\" | \"info\";\r\n description?: string;\r\n /** ๅฏนๅบ”ๅœฐๅ›พไธŠ็š„ Graphic ๅฎžไพ‹ๅผ•็”จ */\r\n graphic?: any;\r\n}\r\n\r\n/** ๅˆ†็ฑป้ขœ่‰ฒๆ˜ ๅฐ„ */\r\nconst CATEGORY_ICON: Record<PoiItem[\"category\"], string> = {\r\n default: \"//data.mars3d.cn/img/marker/mark-blue.png\",\r\n warning: \"//data.mars3d.cn/img/marker/mark-red.png\",\r\n info: \"//data.mars3d.cn/img/marker/mark-green.png\",\r\n};\r\n\r\nlet _idCounter = 1;\r\n\r\nexport function usePoiMarker(mapCtx: UseMapReturn) {\r\n // โ”€โ”€โ”€ ็‹ฌ็ซ‹ไธšๅŠกๅ›พๅฑ‚๏ผˆไธŽๆต‹้‡ๅฑ‚้š”็ฆป๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const poiLayer = shallowRef<mars3d.layer.GraphicLayer | null>(null);\r\n\r\n // โ”€โ”€โ”€ POI ๆ•ฐๆฎๅˆ—่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const poiList = ref<PoiItem[]>([]);\r\n\r\n // โ”€โ”€โ”€ ๅฝ“ๅ‰้€‰ไธญ็š„ POI โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const activePoiId = ref<string | null>(null);\r\n\r\n /** ๅœจๅœฐๅ›พๅŠ ่ฝฝๅŽ่ฐƒ็”จ๏ผŒๅˆๅง‹ๅŒ–ไธ“ๅฑžๅ›พๅฑ‚ */\r\n function initPoiLayer() {\r\n const map = mapCtx.map.value;\r\n if (!map) return;\r\n\r\n const layer = new mars3d.layer.GraphicLayer();\r\n map.addLayer(layer);\r\n poiLayer.value = layer;\r\n\r\n // ็‚นๅ‡ปๅ›พๅฑ‚ไธŠ็š„ๆ ‡ๆณจ โ†’ ้€‰ไธญๅฏนๅบ” POI\r\n layer.on(mars3d.EventType.click, (e: any) => {\r\n const poiId = e.graphic?.attr?.poiId;\r\n if (poiId) selectPoi(poiId);\r\n });\r\n }\r\n\r\n /** ๆทปๅŠ  POI๏ผˆๅˆ›ๅปบๆ•ฐๆฎ + ๅœจๅœฐๅ›พไธŠ็”Ÿๆˆๅ›พๅฝข๏ผ‰ */\r\n function addPoi(params: Omit<PoiItem, \"id\" | \"graphic\">) {\r\n const layer = poiLayer.value;\r\n if (!layer) return null;\r\n\r\n const id = `poi-${_idCounter++}`;\r\n\r\n // ๅˆ›ๅปบๅœฐๅ›พๅ›พๅฝข\r\n const graphic = new mars3d.graphic.BillboardEntity({\r\n position: [params.lng, params.lat, params.alt],\r\n style: {\r\n image: CATEGORY_ICON[params.category],\r\n scale: 1,\r\n horizontalOrigin: mars3d.Cesium.HorizontalOrigin.CENTER,\r\n verticalOrigin: mars3d.Cesium.VerticalOrigin.BOTTOM,\r\n clampToGround: false,\r\n // ๆ ‡ๆณจๆ–‡ๅญ—\r\n label: {\r\n text: params.name,\r\n font_size: 14,\r\n color: \"#ffffff\",\r\n outline: true,\r\n outlineColor: \"#333333\",\r\n outlineWidth: 2,\r\n pixelOffset: new mars3d.Cesium.Cartesian2(0, -40),\r\n visibleDepth: false,\r\n },\r\n },\r\n // popup ๅผน็ช—๏ผˆ็‚นๅ‡ปๆ ‡ๆณจๆ—ถ่‡ชๅŠจๅฑ•็คบ๏ผ‰\r\n popup: buildPopupHtml(params),\r\n attr: { poiId: id, name: params.name },\r\n });\r\n\r\n layer.addGraphic(graphic);\r\n\r\n const poi: PoiItem = { ...params, id, graphic };\r\n poiList.value.push(poi);\r\n return poi;\r\n }\r\n\r\n /** ๅˆ ้™ค POI */\r\n function removePoi(id: string) {\r\n const idx = poiList.value.findIndex((p) => p.id === id);\r\n if (idx === -1) return;\r\n\r\n const poi = poiList.value[idx];\r\n poi.graphic && poiLayer.value?.removeGraphic(poi.graphic);\r\n poiList.value.splice(idx, 1);\r\n\r\n if (activePoiId.value === id) activePoiId.value = null;\r\n }\r\n\r\n /** ้€‰ไธญ POI๏ผˆ้ซ˜ไบฎ + ่ง†่ง’้ฃž่กŒ๏ผ‰ */\r\n function selectPoi(id: string, flyTo = false) {\r\n activePoiId.value = id;\r\n const poi = poiList.value.find((p) => p.id === id);\r\n if (!poi) return;\r\n\r\n // ้ซ˜ไบฎ๏ผšๆ”พๅคงๅ›พๆ ‡\r\n poiList.value.forEach((p) => {\r\n if (p.graphic) {\r\n p.graphic.style.scale = p.id === id ? 1.4 : 1.0;\r\n }\r\n });\r\n\r\n if (flyTo) flyToPoi(id);\r\n }\r\n\r\n /** ๆ›ดๆ–ฐ POI ๅ็งฐ๏ผˆๅฎžๆ—ถๅŒๆญฅๅˆฐๅ›พๅฝขๅ’Œ popup๏ผ‰ */\r\n function updatePoiName(id: string, newName: string) {\r\n const poi = poiList.value.find((p) => p.id === id);\r\n if (!poi) return;\r\n\r\n poi.name = newName;\r\n\r\n // ๅŒๆญฅๆ›ดๆ–ฐๅ›พๅฝข attr\r\n if (poi.graphic) {\r\n poi.graphic.attr = { ...poi.graphic.attr, name: newName };\r\n poi.graphic.popup = buildPopupHtml(poi);\r\n // ๅŒๆญฅๆ›ดๆ–ฐ label ๆ–‡ๅญ—\r\n if (poi.graphic.style?.label) {\r\n poi.graphic.style.label.text = newName;\r\n }\r\n poi.graphic.closePopup?.();\r\n }\r\n }\r\n\r\n /** ้ฃž่กŒๅˆฐ POI ไฝ็ฝฎ */\r\n function flyToPoi(id: string) {\r\n const poi = poiList.value.find((p) => p.id === id);\r\n if (!poi || !mapCtx.map.value) return;\r\n\r\n const map = mapCtx.map.value;\r\n\r\n // ไปฅๆ ‡ๆณจ็‚น้ซ˜ๅบฆไธบๅŸบๅ‡†๏ผŒ้ฃž่กŒ้ซ˜ๅบฆ = ๆ ‡ๆณจ้ซ˜ๅบฆ + ๅˆ็†ๅ็งป\r\n const baseAlt = poi.alt > 1 ? poi.alt : 50;\r\n const flyAlt = baseAlt + 1500;\r\n\r\n // ไธๆŒ‡ๅฎš pitch๏ผŒ่ฎฉ็›ธๆœบๆญฃไธŠๆ–นไฟฏ่ง†๏ผŒๅฎšไฝๆœ€ๅ‡†็กฎ\r\n map.setCameraView({ lng: poi.lng, lat: poi.lat, alt: flyAlt }, { duration: 1.5 });\r\n }\r\n\r\n /** ๆธ…็ฉบๆ‰€ๆœ‰ POI */\r\n function clearAll() {\r\n poiLayer.value?.clear();\r\n poiList.value = [];\r\n activePoiId.value = null;\r\n }\r\n\r\n /** ๅผ€ๅฏ/ๅ…ณ้—ญใ€Œ็‚นๅ‡ปๅœฐๅ›พๆทปๅŠ ๆ ‡ๆณจใ€ๆจกๅผ */\r\n const isAddMode = ref(false);\r\n let _clickHandler: ((e: any) => void) | null = null;\r\n\r\n function toggleAddMode(\r\n onAdded?: (poi: PoiItem) => void,\r\n defaultName = \"ๆ–ฐๆ ‡ๆณจ\",\r\n category: PoiItem[\"category\"] = \"default\",\r\n ) {\r\n const map = mapCtx.map.value;\r\n if (!map) return;\r\n\r\n if (isAddMode.value) {\r\n // ้€€ๅ‡บๆทปๅŠ ๆจกๅผ\r\n if (_clickHandler) {\r\n map.off(mars3d.EventType.click, _clickHandler);\r\n _clickHandler = null;\r\n }\r\n isAddMode.value = false;\r\n } else {\r\n // ่ฟ›ๅ…ฅๆทปๅŠ ๆจกๅผ๏ผšไธ‹ไธ€ๆฌก็‚นๅ‡ปๅœฐๅ›พๅณๅˆ›ๅปบ POI\r\n isAddMode.value = true;\r\n _clickHandler = (e: any) => {\r\n // ไผ˜ๅ…ˆๅ–็ป็บฌๅบฆๅๆ ‡๏ผŒๅ…œๅบ•็”จ็ฌ›ๅกๅฐ”ๅๆ ‡่ฝฌๆข\r\n let lng: number, lat: number, alt: number;\r\n\r\n if (e.lnglat) {\r\n lng = e.lnglat.lng;\r\n lat = e.lnglat.lat;\r\n alt = e.lnglat.alt ?? 0;\r\n } else if (e.cartesian) {\r\n const carto = mars3d.Cesium.Cartographic.fromCartesian(e.cartesian);\r\n lng = mars3d.Cesium.Math.toDegrees(carto.longitude);\r\n lat = mars3d.Cesium.Math.toDegrees(carto.latitude);\r\n alt = carto.height > 0 ? carto.height : 50; // terrain height fallback\r\n } else {\r\n return;\r\n }\r\n\r\n // ๆ ‡ๆณจ้ซ˜ๅบฆ่‡ณๅฐ‘็ฆปๅœฐ้ข 50m๏ผŒ้ฟๅ…่ดดๅœฐ\r\n const finalAlt = alt > 1 ? alt : 50;\r\n\r\n const poi = addPoi({\r\n name: `${defaultName} ${_idCounter}`,\r\n lng,\r\n lat,\r\n alt: finalAlt,\r\n category,\r\n });\r\n if (poi) onAdded?.(poi);\r\n // ๅ•ๆฌกๆจกๅผ๏ผšๆทปๅŠ ๅฎŒๅณ้€€ๅ‡บ\r\n toggleAddMode();\r\n };\r\n map.on(mars3d.EventType.click, _clickHandler);\r\n }\r\n }\r\n\r\n return {\r\n poiLayer,\r\n poiList,\r\n activePoiId,\r\n isAddMode,\r\n initPoiLayer,\r\n addPoi,\r\n removePoi,\r\n selectPoi,\r\n flyToPoi,\r\n updatePoiName,\r\n clearAll,\r\n toggleAddMode,\r\n };\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅทฅๅ…ท๏ผš็”Ÿๆˆ popup HTML โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction buildPopupHtml(poi: Omit<PoiItem, \"id\" | \"graphic\">) {\r\n return `\r\n <div style=\"padding:8px 12px;min-width:160px;\">\r\n <div style=\"font-size:15px;font-weight:bold;margin-bottom:6px;color:#fff;\">${poi.name}</div>\r\n <div style=\"font-size:12px;color:#adc6e5;line-height:1.8;\">\r\n <div>็ปๅบฆ๏ผš${poi.lng.toFixed(6)}</div>\r\n <div>็บฌๅบฆ๏ผš${poi.lat.toFixed(6)}</div>\r\n <div>้ซ˜ๅบฆ๏ผš${poi.alt.toFixed(1)} m</div>\r\n ${poi.description ? `<div style=\"margin-top:4px;\">${poi.description}</div>` : \"\"}\r\n </div>\r\n </div>\r\n `;\r\n}\r\n\r\nexport type UsePoiMarkerReturn = ReturnType<typeof usePoiMarker>;\r\n","<!--\r\n PoiMarkerLayer โ€” POI ๆ ‡ๆณจๅœฐๅ›พๅฑ‚็ป„ไปถ\r\n\r\n ่Œ่ดฃ๏ผš\r\n - ๆ”พ็ฝฎๅœจ MarsMapContainer ็š„ <slot> ๅ†…\r\n - ้€š่ฟ‡ inject ่Žทๅ–ๅœฐๅ›พไธŠไธ‹ๆ–‡๏ผŒๅฎŒๆˆๅ›พๅฑ‚ๅˆๅง‹ๅŒ–\r\n - ้€š่ฟ‡ provide ๅฐ† poiCtx ๅ‘ๅญ็ป„ไปถๆšด้œฒ๏ผˆinject ๅช่ตฐ็ˆถโ†’ๅญ๏ผŒไธ่ตฐๅ…„ๅผŸ๏ผ‰\r\n - ๅ†…้ƒจ้€š่ฟ‡ <slot> ๆธฒๆŸ“ PoiMarkerPanel ็ญ‰ๅญ็ป„ไปถ๏ผŒไฟ่ฏ provide/inject ้“พ่ทฏๆญฃ็กฎ\r\n - ๅฏนๅค– expose usePoiMarker ๅ…จ้‡ๆŽฅๅฃ๏ผŒไพ›็ˆถ็ป„ไปถ ref ่ฎฟ้—ฎ\r\n\r\n ไฝฟ็”จๆ–นๅผ๏ผˆPoiMarkerPanel ๅฟ…้กปไฝœไธบๅญๅ†…ๅฎนไผ ๅ…ฅ๏ผŒ่€Œ้žๅ…„ๅผŸ่Š‚็‚น๏ผ‰๏ผš\r\n <MarsMapContainer @onload=\"...\">\r\n <PoiMarkerLayer ref=\"poiLayerRef\">\r\n <PoiMarkerPanel />\r\n </PoiMarkerLayer>\r\n </MarsMapContainer>\r\n-->\r\n<template>\r\n <!-- provide/inject ้œ€่ฆ็ˆถๅญๅ…ณ็ณป๏ผŒ็”จ slot ๆธฒๆŸ“ๅญ็ป„ไปถ -->\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject, provide, watch, onUnmounted } from \"vue\";\r\nimport type { UseMapReturn } from \"../../mars-map/composables/useMap\";\r\nimport { usePoiMarker } from \"./usePoiMarker\";\r\n\r\n// โ”€โ”€โ”€ ๆณจๅ…ฅๅœฐๅ›พไธŠไธ‹ๆ–‡ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst mapCtx = inject<UseMapReturn>(\"mapContext\");\r\nif (!mapCtx) throw new Error(\"[PoiMarkerLayer] ๅฟ…้กปๆ”พ็ฝฎๅœจ MarsMapContainer ๅ†…้ƒจ\");\r\n\r\n// โ”€โ”€โ”€ ๅˆๅง‹ๅŒ– POI ็ฎก็† composable โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst poi = usePoiMarker(mapCtx);\r\n\r\n// โ”€โ”€โ”€ ็ญ‰ๅพ…ๅœฐๅ›พๅฐฑ็ปชๅŽๅˆๅง‹ๅŒ–ๅ›พๅฑ‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n// map ๅœจ MarsMapContainer onload ๅŽๆ‰ไธไธบ null\r\nconst stopWatch = watch(\r\n () => mapCtx.map.value,\r\n (map) => {\r\n if (map) {\r\n poi.initPoiLayer();\r\n stopWatch(); // ๅช้œ€ๅˆๅง‹ๅŒ–ไธ€ๆฌก\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonUnmounted(() => {\r\n poi.clearAll();\r\n});\r\n\r\n// โ”€โ”€โ”€ provide ็ป™ๅŒ็บงไธšๅŠก็ป„ไปถ๏ผˆPoiMarkerPanel ็ญ‰๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nprovide(\"poiContext\", poi);\r\n\r\n// โ”€โ”€โ”€ expose ็ป™็ˆถ็ป„ไปถ ref โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ndefineExpose(poi);\r\n</script>\r\n","<!--\r\n PoiMarkerPanel โ€” POI ๆ ‡ๆณจ็ฎก็†้ขๆฟ๏ผˆๅทฆไพง๏ผ‰\r\n\r\n ๅŠŸ่ƒฝ๏ผš\r\n - ๆ ‡ๆณจๅˆ—่กจ๏ผˆๅ็งฐ / ๅˆ†็ฑปๆ ‡็ญพ / ๅฎšไฝ / ๅˆ ้™ค๏ผ‰\r\n - ๆทปๅŠ ๆจกๅผๅˆ‡ๆขๆŒ‰้’ฎ๏ผˆ็‚นๅ‡ปๅœฐๅ›พๆ–ฐๅขžๆ ‡ๆณจ๏ผ‰\r\n - ๅˆ†็ฑป็ญ›้€‰ๆ ‡็ญพ\r\n - ็‚นๅ‡ปๅˆ—่กจ้กน้ฃž่กŒๅˆฐๆ ‡ๆณจไฝ็ฝฎ + ๅœฐๅ›พ้ซ˜ไบฎ\r\n\r\n ๆ•ฐๆฎๆฅๆบ๏ผšinject('poiContext')๏ผŒ็”ฑๅŒ็บง PoiMarkerLayer ๆไพ›\r\n-->\r\n<template>\r\n <div\r\n ref=\"panelEl\"\r\n class=\"poi-panel\"\r\n :class=\"{ collapsed: isCollapsed }\"\r\n :style=\"\r\n !isCollapsed\r\n ? { left: pos.x + 'px', top: pos.y + 'px' }\r\n : { left: pos.x + 'px', top: pos.y + 'px' }\r\n \"\r\n >\r\n <!-- ้ขๆฟๆ ‡้ข˜ๆ ๏ผˆๅฏๆ‹–ๆ‹ฝ๏ผ‰ -->\r\n <div\r\n class=\"poi-panel__header\"\r\n :class=\"{ 'is-dragging': isDragging }\"\r\n @mousedown.prevent=\"startDrag\"\r\n @click=\"isDragging ? null : toggleCollapse()\"\r\n >\r\n <!-- ๆ”ถ็ผฉๅŽๅชๆ˜พ็คบๅ›พๆ ‡ -->\r\n <template v-if=\"isCollapsed\">\r\n <div class=\"collapsed-icon-wrap\">\r\n <i class=\"fa fa-map-marker collapsed-icon\" />\r\n <span class=\"poi-count poi-count--collapsed\">{{\r\n filteredList.length\r\n }}</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <span class=\"poi-panel__title\">\r\n <i class=\"fa fa-map-marker\" />\r\n POI ๆ ‡ๆณจ็ฎก็†\r\n <span class=\"poi-count\">{{ filteredList.length }}</span>\r\n </span>\r\n <i class=\"fa fa-chevron-left collapse-icon\" />\r\n </template>\r\n </div>\r\n\r\n <div class=\"poi-panel__body\" v-show=\"!isCollapsed\">\r\n <!-- ๆ“ไฝœๆ  -->\r\n <div class=\"poi-panel__toolbar\">\r\n <button\r\n class=\"btn\"\r\n :class=\"{ 'btn--active': poi.isAddMode.value }\"\r\n @click=\"toggleAdd\"\r\n >\r\n <i :class=\"['fa', poi.isAddMode.value ? 'fa-times' : 'fa-plus']\" />\r\n {{ poi.isAddMode.value ? \"ๅ–ๆถˆๆทปๅŠ \" : \"็‚นๅ‡ปๅœฐๅ›พๆทปๅŠ \" }}\r\n </button>\r\n <button\r\n class=\"btn btn--danger\"\r\n @click=\"confirmClear\"\r\n :disabled=\"poi.poiList.value.length === 0\"\r\n >\r\n <i class=\"fa fa-trash-o\" /> ๆธ…็ฉบ\r\n </button>\r\n </div>\r\n\r\n <!-- ๅˆ†็ฑป็ญ›้€‰ -->\r\n <div class=\"poi-panel__filter\">\r\n <span\r\n v-for=\"cat in categories\"\r\n :key=\"cat.value\"\r\n class=\"filter-tag\"\r\n :class=\"{ active: activeCategory === cat.value }\"\r\n @click=\"activeCategory = cat.value\"\r\n >\r\n <i :class=\"['fa', cat.icon]\" :style=\"{ color: cat.color }\" />\r\n {{ cat.label }}\r\n </span>\r\n </div>\r\n\r\n <!-- POI ๅˆ—่กจ -->\r\n <div class=\"poi-panel__list\">\r\n <TransitionGroup name=\"poi-list\">\r\n <div\r\n v-for=\"item in filteredList\"\r\n :key=\"item.id\"\r\n class=\"poi-item\"\r\n :class=\"{ 'poi-item--active': poi.activePoiId.value === item.id }\"\r\n @click=\"onSelect(item.id)\"\r\n >\r\n <!-- ๅˆ†็ฑป่‰ฒๅ— -->\r\n <span\r\n class=\"poi-item__dot\"\r\n :style=\"{ background: getCategoryColor(item.category) }\"\r\n />\r\n\r\n <div class=\"poi-item__info\">\r\n <!-- ็ผ–่พ‘ๆ€๏ผš่พ“ๅ…ฅๆก† -->\r\n <input\r\n v-if=\"editingId === item.id\"\r\n class=\"poi-item__name-input\"\r\n v-model=\"editName\"\r\n @keydown.enter=\"saveEdit\"\r\n @keydown.escape=\"cancelEdit\"\r\n @click.stop\r\n ref=\"editInputEl\"\r\n />\r\n <!-- ๆญฃๅธธๆ€๏ผšๅ็งฐ -->\r\n <div\r\n v-else\r\n class=\"poi-item__name\"\r\n @dblclick.stop=\"startEdit(item)\"\r\n >\r\n {{ item.name }}\r\n </div>\r\n <div class=\"poi-item__coord\">\r\n {{ item.lng.toFixed(4) }}, {{ item.lat.toFixed(4) }}\r\n </div>\r\n </div>\r\n\r\n <!-- ๆ“ไฝœๆŒ‰้’ฎ -->\r\n <div class=\"poi-item__actions\">\r\n <button\r\n class=\"icon-btn\"\r\n title=\"็ผ–่พ‘ๅ็งฐ\"\r\n @click.stop=\"startEdit(item)\"\r\n >\r\n <i class=\"fa fa-pencil\" />\r\n </button>\r\n <button\r\n class=\"icon-btn\"\r\n title=\"้ฃž่กŒๅฎšไฝ\"\r\n @click.stop=\"onFlyTo(item.id)\"\r\n >\r\n <i class=\"fa fa-crosshairs\" />\r\n </button>\r\n <button\r\n class=\"icon-btn icon-btn--danger\"\r\n title=\"ๅˆ ้™ค\"\r\n @click.stop=\"onRemove(item.id)\"\r\n >\r\n <i class=\"fa fa-times\" />\r\n </button>\r\n </div>\r\n </div>\r\n </TransitionGroup>\r\n\r\n <!-- ็ฉบ็Šถๆ€ -->\r\n <div v-if=\"filteredList.length === 0\" class=\"poi-panel__empty\">\r\n <i class=\"fa fa-map-o\" />\r\n <p>\r\n {{\r\n poi.isAddMode.value ? \"่ฏทๅœจๅœฐๅ›พไธŠ็‚นๅ‡ปๆทปๅŠ ๆ ‡ๆณจ\" : \"ๆš‚ๆ— ๆ ‡ๆณจๆ•ฐๆฎ\"\r\n }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, inject } from \"vue\";\r\nimport type { UsePoiMarkerReturn, PoiItem } from \"./usePoiMarker\";\r\n\r\n// โ”€โ”€โ”€ ๆณจๅ…ฅ POI ไธŠไธ‹ๆ–‡๏ผˆ็”ฑ PoiMarkerLayer provide๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst poi = inject<UsePoiMarkerReturn>(\"poiContext\");\r\nif (!poi) throw new Error(\"[PoiMarkerPanel] ๅฟ…้กปไธŽ PoiMarkerLayer ๅŒ็บงไฝฟ็”จ\");\r\n\r\n// โ”€โ”€โ”€ ้ขๆฟ็Šถๆ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst isCollapsed = ref(true);\r\nconst toggleCollapse = () => {\r\n isCollapsed.value = !isCollapsed.value;\r\n};\r\n\r\n// โ”€โ”€โ”€ ๆ‹–ๆ‹ฝ็งปๅŠจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst panelEl = ref<HTMLElement | null>(null);\r\nconst isDragging = ref(false);\r\n\r\n// ๅˆๅง‹ไฝ็ฝฎ๏ผˆๅฏ้š้œ€ๆฑ‚่ฐƒๆ•ด๏ผ‰\r\nconst pos = reactive({ x: 10, y: 10 });\r\n\r\nlet dragStartX = 0;\r\nlet dragStartY = 0;\r\nlet origX = 0;\r\nlet origY = 0;\r\n\r\nfunction startDrag(e: MouseEvent) {\r\n isDragging.value = true;\r\n dragStartX = e.clientX;\r\n dragStartY = e.clientY;\r\n origX = pos.x;\r\n origY = pos.y;\r\n\r\n document.addEventListener(\"mousemove\", onDrag);\r\n document.addEventListener(\"mouseup\", stopDrag);\r\n}\r\n\r\nfunction onDrag(e: MouseEvent) {\r\n if (!isDragging.value) return;\r\n pos.x = origX + (e.clientX - dragStartX);\r\n pos.y = origY + (e.clientY - dragStartY);\r\n}\r\n\r\nfunction stopDrag() {\r\n isDragging.value = false;\r\n document.removeEventListener(\"mousemove\", onDrag);\r\n document.removeEventListener(\"mouseup\", stopDrag);\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ†็ฑป็ญ›้€‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst categories = [\r\n { value: \"all\", label: \"ๅ…จ้ƒจ\", icon: \"fa-list\", color: \"#aaa\" },\r\n { value: \"default\", label: \"ๆ™ฎ้€š\", icon: \"fa-map-marker\", color: \"#3ea6ff\" },\r\n {\r\n value: \"warning\",\r\n label: \"่ญฆๅ‘Š\",\r\n icon: \"fa-exclamation-triangle\",\r\n color: \"#ff6b6b\",\r\n },\r\n { value: \"info\", label: \"ไฟกๆฏ\", icon: \"fa-info-circle\", color: \"#52c41a\" },\r\n] as const;\r\n\r\nconst activeCategory = ref<string>(\"all\");\r\n\r\nconst filteredList = computed(() => {\r\n if (activeCategory.value === \"all\") return poi.poiList.value;\r\n return poi.poiList.value.filter((p) => p.category === activeCategory.value);\r\n});\r\n\r\nconst getCategoryColor = (cat: PoiItem[\"category\"]) => {\r\n const map: Record<string, string> = {\r\n default: \"#3ea6ff\",\r\n warning: \"#ff6b6b\",\r\n info: \"#52c41a\",\r\n };\r\n return map[cat] ?? \"#aaa\";\r\n};\r\n\r\n// โ”€โ”€โ”€ ๆทปๅŠ ๆจกๅผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst addCategory = ref<PoiItem[\"category\"]>(\"default\");\r\n\r\nfunction toggleAdd() {\r\n poi.toggleAddMode(\r\n undefined, // onAdded ๅ›ž่ฐƒ๏ผˆๅฏๆŒ‰้œ€ไผ ๏ผ‰\r\n \"ๆ ‡ๆณจ็‚น\",\r\n addCategory.value,\r\n );\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ—่กจๆ“ไฝœ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction onSelect(id: string) {\r\n poi.selectPoi(id, true); // ้€‰ไธญๅนถ้ฃž่กŒ\r\n}\r\n\r\nfunction onFlyTo(id: string) {\r\n poi.flyToPoi(id);\r\n}\r\n\r\nfunction onRemove(id: string) {\r\n poi.removePoi(id);\r\n}\r\n\r\n// โ”€โ”€โ”€ ็ผ–่พ‘ๅ็งฐ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst editingId = ref<string | null>(null);\r\nconst editName = ref(\"\");\r\nconst editInputEl = ref<HTMLInputElement | null>(null);\r\n\r\nfunction startEdit(item: PoiItem) {\r\n editingId.value = item.id;\r\n editName.value = item.name;\r\n // DOM ๆ›ดๆ–ฐๅŽ่‡ชๅŠจ่š็„ฆ\r\n setTimeout(() => editInputEl.value?.select(), 30);\r\n}\r\n\r\nfunction saveEdit() {\r\n if (editingId.value && editName.value.trim()) {\r\n poi.updatePoiName(editingId.value, editName.value.trim());\r\n }\r\n cancelEdit();\r\n}\r\n\r\nfunction cancelEdit() {\r\n editingId.value = null;\r\n editName.value = \"\";\r\n}\r\n\r\nfunction confirmClear() {\r\n if (window.confirm(`็กฎ่ฎคๆธ…็ฉบๅ…จ้ƒจ ${poi.poiList.value.length} ไธชๆ ‡ๆณจ๏ผŸ`)) {\r\n poi.clearAll();\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n// โ”€โ”€โ”€ ไธป้ขๆฟ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel {\r\n position: absolute;\r\n width: 260px;\r\n height: auto;\r\n max-height: calc(100vh - 40px);\r\n background: rgba(23, 35, 50, 0.92);\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n border-radius: 6px;\r\n z-index: 999;\r\n display: flex;\r\n flex-direction: column;\r\n backdrop-filter: blur(4px);\r\n transition: width 0.25s ease;\r\n\r\n // ๆ”ถ็ผฉ็Šถๆ€๏ผšๅชไฟ็•™ๆ ‡้ข˜ๆ ๅฎฝๅบฆ๏ผŒๅ†…ๅฎน่‡ช้€‚ๅบ”้ซ˜ๅบฆ\r\n &.collapsed {\r\n width: 46px;\r\n max-height: none;\r\n overflow: hidden;\r\n\r\n .poi-panel__title {\r\n display: none;\r\n }\r\n .poi-panel__body {\r\n display: none;\r\n }\r\n .collapse-icon {\r\n display: none;\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆ ‡้ข˜ๆ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__header {\r\n position: relative; // ไธบๆ”ถ็ผฉๆ€่ง’ๆ ‡ absolute ๅฎšไฝๆไพ›ๅ‚่€ƒ\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 14px;\r\n background: rgba(15, 25, 40, 0.9);\r\n border-radius: 6px 6px 0 0;\r\n cursor: grab;\r\n user-select: none;\r\n flex-shrink: 0;\r\n\r\n &.is-dragging {\r\n cursor: grabbing;\r\n }\r\n\r\n // ๆ”ถ็ผฉๅŽ็š„ๅ›พๆ ‡ๆ€\r\n .collapsed-icon {\r\n display: none;\r\n color: #3ea6ff;\r\n font-size: 18px;\r\n }\r\n\r\n .poi-panel__title {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #e8f4ff;\r\n font-size: 14px;\r\n font-weight: 600;\r\n\r\n .fa {\r\n color: #3ea6ff;\r\n font-size: 15px;\r\n }\r\n }\r\n\r\n .poi-count {\r\n background: #e74c3c;\r\n color: #fff;\r\n font-size: 11px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n min-width: 18px;\r\n text-align: center;\r\n }\r\n\r\n .collapse-icon {\r\n color: #7a9ec0;\r\n font-size: 12px;\r\n }\r\n}\r\n\r\n// ๆ”ถ็ผฉๆ€๏ผšๅ›พๆ ‡่‡ช้€‚ๅบ”้ซ˜ๅบฆ๏ผŒ่ง’ๆ ‡ๅฎšไฝๅœจๅ›พๆ ‡ๅณไธŠ่ง’\r\n.poi-panel.collapsed .poi-panel__header {\r\n flex-direction: column;\r\n align-items: flex-start; // ๅทฆๅฏน้ฝ\r\n padding: 8px 10px 10px; // ๅบ•้ƒจ็•™ๆ›ดๅคš็ฉบ้—ด\r\n gap: 0;\r\n cursor: pointer;\r\n\r\n // ๅ›พๆ ‡ + ่ง’ๆ ‡ไธ€ไฝ“ๅŒ–ๅฎนๅ™จ๏ผŒๅ›พๆ ‡ๅœจๅทฆไธ‹\r\n .collapsed-icon-wrap {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-top: 12px; // ๅพ€ไธ‹ไธ€็‚น\r\n margin-left: 2px;\r\n }\r\n\r\n .collapsed-icon {\r\n display: block;\r\n font-size: 20px;\r\n color: #3ea6ff;\r\n }\r\n\r\n // ่ง’ๆ ‡๏ผš็›ธๅฏนไบŽๅ›พๆ ‡ๅฎนๅ™จๅฎšไฝ๏ผŒ่ฝๅœจๅ›พๆ ‡ๅณไธŠ่ง’\r\n .poi-count--collapsed {\r\n display: block;\r\n position: absolute;\r\n top: -10px;\r\n right: -12px;\r\n min-width: 16px;\r\n height: 16px;\r\n line-height: 16px;\r\n font-size: 10px;\r\n padding: 0 3px;\r\n background: #3ea6ff;\r\n color: #fff;\r\n border-radius: 8px;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ้ขๆฟไฝ“ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__body {\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆ“ไฝœๆ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__toolbar {\r\n display: flex;\r\n gap: 8px;\r\n padding: 10px 12px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\r\n\r\n .btn {\r\n flex: 1;\r\n padding: 6px 8px;\r\n border: 1px solid rgba(62, 166, 255, 0.4);\r\n background: rgba(62, 166, 255, 0.1);\r\n color: #9dc8f0;\r\n border-radius: 4px;\r\n font-size: 12px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 5px;\r\n transition: all 0.2s ease;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.25);\r\n color: #fff;\r\n }\r\n &--active {\r\n background: rgba(62, 166, 255, 0.35);\r\n color: #fff;\r\n border-color: #3ea6ff;\r\n }\r\n &--danger {\r\n flex: 0 0 auto;\r\n border-color: rgba(255, 100, 100, 0.4);\r\n background: rgba(255, 100, 100, 0.1);\r\n color: #ffaaaa;\r\n &:hover:not(:disabled) {\r\n background: rgba(255, 100, 100, 0.25);\r\n color: #fff;\r\n }\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ†็ฑป็ญ›้€‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__filter {\r\n display: flex;\r\n gap: 6px;\r\n padding: 8px 12px;\r\n flex-wrap: wrap;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\r\n\r\n .filter-tag {\r\n padding: 3px 8px;\r\n border-radius: 12px;\r\n font-size: 11px;\r\n color: #7a9ec0;\r\n background: rgba(255, 255, 255, 0.06);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n transition: all 0.2s ease;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.12);\r\n color: #c8dff0;\r\n }\r\n &.active {\r\n background: rgba(62, 166, 255, 0.2);\r\n color: #3ea6ff;\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ—่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__list {\r\n overflow-y: auto;\r\n max-height: calc(100vh - 220px);\r\n padding: 6px 0;\r\n\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background: rgba(62, 166, 255, 0.3);\r\n border-radius: 2px;\r\n }\r\n}\r\n\r\n.poi-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.1);\r\n }\r\n &--active {\r\n background: rgba(62, 166, 255, 0.18);\r\n }\r\n\r\n &__dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n }\r\n\r\n &__info {\r\n flex: 1;\r\n min-width: 0;\r\n &-name {\r\n overflow: hidden;\r\n }\r\n }\r\n\r\n &__name {\r\n font-size: 13px;\r\n color: #d8ecff;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n cursor: text;\r\n\r\n &:hover {\r\n color: #a0d4ff;\r\n }\r\n }\r\n\r\n &__name-input {\r\n width: 100%;\r\n font-size: 13px;\r\n color: #e8f4ff;\r\n background: rgba(62, 166, 255, 0.15);\r\n border: 1px solid rgba(62, 166, 255, 0.5);\r\n border-radius: 3px;\r\n padding: 1px 5px;\r\n outline: none;\r\n font-family: inherit;\r\n\r\n &:focus {\r\n border-color: #3ea6ff;\r\n background: rgba(62, 166, 255, 0.22);\r\n }\r\n }\r\n\r\n &__coord {\r\n font-size: 11px;\r\n color: #5a7a9a;\r\n margin-top: 2px;\r\n font-family: monospace;\r\n }\r\n\r\n &__actions {\r\n display: flex;\r\n gap: 4px;\r\n flex-shrink: 0;\r\n opacity: 0;\r\n transition: opacity 0.15s ease;\r\n }\r\n\r\n &:hover &__actions {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.icon-btn {\r\n width: 22px;\r\n height: 22px;\r\n border: none;\r\n background: rgba(255, 255, 255, 0.08);\r\n color: #9dc8f0;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 11px;\r\n transition: all 0.15s ease;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.3);\r\n color: #fff;\r\n }\r\n &--danger:hover {\r\n background: rgba(255, 80, 80, 0.35);\r\n color: #fff;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ็ฉบ็Šถๆ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-panel__empty {\r\n text-align: center;\r\n padding: 30px 20px;\r\n color: #4a6a8a;\r\n\r\n .fa {\r\n font-size: 32px;\r\n margin-bottom: 10px;\r\n display: block;\r\n }\r\n p {\r\n font-size: 12px;\r\n margin: 0;\r\n line-height: 1.6;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ—่กจๅŠจ็”ป โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.poi-list-enter-active,\r\n.poi-list-leave-active {\r\n transition: all 0.25s ease;\r\n}\r\n.poi-list-enter-from {\r\n opacity: 0;\r\n transform: translateX(-12px);\r\n}\r\n.poi-list-leave-to {\r\n opacity: 0;\r\n transform: translateX(12px);\r\n}\r\n</style>\r\n","/**\r\n * useTrack โ€” ่ฝจ่ฟน็ฎก็† composable\r\n *\r\n * ่Œ่ดฃ๏ผš\r\n * - ็ปดๆŠค่ฝจ่ฟนๆ•ฐๆฎๅˆ—่กจ๏ผˆๅކๅฒ่ฝจ่ฟน + ๅฎžๆ—ถ่ฝจ่ฟน๏ผ‰\r\n * - ็ฎก็†ๅœฐๅ›พไธŠ็š„ๆŠ˜็บฟๅ›พๅฝข๏ผˆPolylinePrimitive / CorridorPrimitive๏ผ‰\r\n * - ๆไพ›ๅކๅฒ่ฝจ่ฟนๅ›žๆ”พ๏ผˆๆ’ญๆ”พ / ๆš‚ๅœ / ๅ€้€Ÿ / ่ฟ›ๅบฆๆ‹–ๆ‹ฝ๏ผ‰\r\n * - ๆไพ›ๅฎžๆ—ถ่ฝจ่ฟนๆŽจ้€๏ผˆๆŒ็ปญ่ฟฝๅŠ ๅๆ ‡็‚น๏ผ‰\r\n * - ๆ•ฐๆฎไธŽๅ›พๅฝขไฟๆŒๅŒๅ‘ๅŒๆญฅ\r\n *\r\n * ไฝฟ็”จๆ–นๅผ๏ผˆๅœจ TrackLayer ๅ†…๏ผ‰๏ผš\r\n * const mapCtx = inject<UseMapReturn>('mapContext')!\r\n * const track = useTrack(mapCtx)\r\n */\r\nimport { ref, shallowRef } from \"vue\";\r\nimport * as mars3d from \"mars3d\";\r\nimport type { UseMapReturn } from \"../../mars-map/composables/useMap\";\r\n\r\n// โ”€โ”€โ”€ ๆ•ฐๆฎ็ฑปๅž‹ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n\r\n/** ่ฝจ่ฟน็‚น */\r\nexport interface TrackPoint {\r\n time: number; // Unix ๆ—ถ้—ดๆˆณ๏ผˆๆฏซ็ง’๏ผ‰\r\n lng: number;\r\n lat: number;\r\n alt: number;\r\n}\r\n\r\n/** ๅ•ๆก่ฝจ่ฟน */\r\nexport interface TrackItem {\r\n id: string;\r\n name: string;\r\n /** ่ฝจ่ฟน็‚นๅˆ—่กจ๏ผˆๆŒ‰ๆ—ถ้—ดๆŽ’ๅบ๏ผ‰ */\r\n points: TrackPoint[];\r\n /** ่ฝจ่ฟน็บฟๅ›พๅฝข */\r\n lineGraphic?: any;\r\n /** ๅฎžๆ—ถๆจกๅผไธ‹๏ผšๅฝ“ๅ‰\"ๅทฒ็ป˜ๅˆถ\"ๅˆฐ็š„็‚น็ดขๅผ• */\r\n realtimeDrawnIdx?: number;\r\n /** ๅฎžๆ—ถๆจกๅผไธ‹๏ผšๅฝ“ๅ‰ๅฎžๆ—ถ็‚นๅ›พๅฝข */\r\n realtimePoint?: any;\r\n /** ๅฎžๆ—ถๆจกๅผไธ‹๏ผšๅฝ“ๅ‰่ฝฆๅคดๅ›พๆ ‡ */\r\n realtimeHeading?: any;\r\n /** ๅฎžๆ—ถๆจกๅผไธ‹๏ผšๆ‰€ๆœ‰็บฟๆฎตๅ›พๅฝข๏ผˆ็”จไบŽๅˆ ้™คๆ—ถ็ปŸไธ€ๆธ…็†๏ผ‰ */\r\n realtimeLineSegments?: any[];\r\n /** ๅ›žๆ”พๅผ€ๅง‹ๆ—ถ้—ดๆˆณ */\r\n _playStartTime?: number;\r\n}\r\n\r\nlet _idCounter = 1;\r\n\r\nexport function useTrack(mapCtx: UseMapReturn) {\r\n // โ”€โ”€โ”€ ๅ›พๅฑ‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const trackLayer = shallowRef<mars3d.layer.GraphicLayer | null>(null);\r\n\r\n // โ”€โ”€โ”€ ่ฝจ่ฟนๅˆ—่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const trackList = ref<TrackItem[]>([]);\r\n\r\n // โ”€โ”€โ”€ ๅฝ“ๅ‰้€‰ไธญ / ๅ›žๆ”พ็š„่ฝจ่ฟน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const activeTrackId = ref<string | null>(null);\r\n\r\n // โ”€โ”€โ”€ ๅ›žๆ”พ็Šถๆ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const isPlaying = ref(false);\r\n const currentTime = ref(0); // ๅฝ“ๅ‰ๅ›žๆ”พๆ—ถ้—ดๆˆณ\r\n const playbackSpeed = ref(1); // ๅ€้€Ÿ๏ผˆ1x / 2x / 4x / 8x๏ผ‰\r\n const playbackProgress = ref(0); // 0~100 ็™พๅˆ†ๆฏ”\r\n\r\n // โ”€โ”€โ”€ ๅฎžๆ—ถๆจกๅผๆ ‡่ฎฐ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n const isRealtimeMode = ref(false);\r\n const activeRealtimeId = ref<string | null>(null);\r\n\r\n // โ”€โ”€โ”€ ๅ›žๆ”พๅฎšๆ—ถๅ™จ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n let _playInterval: ReturnType<typeof setInterval> | null = null;\r\n let _realtimeInterval: ReturnType<typeof setInterval> | null = null;\r\n\r\n // โ”€โ”€โ”€ ๅˆๅง‹ๅŒ–ๅ›พๅฑ‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function initTrackLayer() {\r\n const map = mapCtx.map.value;\r\n if (!map) return;\r\n\r\n const layer = new mars3d.layer.GraphicLayer();\r\n map.addLayer(layer);\r\n trackLayer.value = layer;\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅ†…้ƒจ๏ผš็ป˜ๅˆถๅฎŒๆ•ดๆŠ˜็บฟ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function _buildLineGraphic(track: TrackItem) {\r\n const layer = trackLayer.value;\r\n if (!layer) return null;\r\n\r\n // ๅช็”ปๅทฒๆœ‰ๅๆ ‡\r\n const positions = track.points.map((p) => [p.lng, p.lat, p.alt] as [number, number, number]);\r\n\r\n const line = new mars3d.graphic.PolylinePrimitive({\r\n positions,\r\n style: {\r\n color: mars3d.Cesium.Color.fromCssColorString(\"#3ea6ff\") as any,\r\n width: 3,\r\n opacity: 0.9,\r\n clampToGround: false,\r\n },\r\n attr: { trackId: track.id },\r\n });\r\n\r\n layer.addGraphic(line);\r\n return line;\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅ†…้ƒจ๏ผšๅฎžๆ—ถ่ฟฝๅŠ ไธ€ๆฎต็บฟ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function _appendRealtimeLine(track: TrackItem, fromIdx: number, toIdx: number) {\r\n const layer = trackLayer.value;\r\n if (!layer || toIdx <= fromIdx) return;\r\n\r\n const positions = track.points.slice(fromIdx, toIdx + 1)\r\n .map((p) => [p.lng, p.lat, p.alt] as [number, number, number]);\r\n\r\n const segment = new mars3d.graphic.PolylinePrimitive({\r\n positions,\r\n style: {\r\n color: mars3d.Cesium.Color.fromCssColorString(\"#ff6b35\") as any,\r\n width: 4,\r\n opacity: 1,\r\n clampToGround: false,\r\n },\r\n });\r\n layer.addGraphic(segment);\r\n // ่ฎฐๅฝ•็บฟๆฎตๅผ•็”จ๏ผŒ็”จไบŽๅˆ ้™คๆ—ถ็ปŸไธ€ๆธ…็†\r\n if (!track.realtimeLineSegments) {\r\n track.realtimeLineSegments = [];\r\n }\r\n track.realtimeLineSegments.push(segment);\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅ†…้ƒจ๏ผšๆ›ดๆ–ฐๅฎžๆ—ถ็‚นไฝๅ›พๆ ‡ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function _updateRealtimeMarker(track: TrackItem) {\r\n const layer = trackLayer.value;\r\n if (!layer) return;\r\n\r\n const lastPoint = track.points[track.realtimeDrawnIdx!];\r\n if (!lastPoint) return;\r\n\r\n // ๆ›ดๆ–ฐๅ›พๆ ‡ไฝ็ฝฎ\r\n if (track.realtimePoint) {\r\n track.realtimePoint.position = [lastPoint.lng, lastPoint.lat, lastPoint.alt];\r\n } else {\r\n const marker = new mars3d.graphic.BillboardEntity({\r\n position: [lastPoint.lng, lastPoint.lat, lastPoint.alt],\r\n style: {\r\n image: \"//data.mars3d.cn/img/marker/mark-blue.png\",\r\n scale: 1.2,\r\n horizontalOrigin: mars3d.Cesium.HorizontalOrigin.CENTER,\r\n verticalOrigin: mars3d.Cesium.VerticalOrigin.BOTTOM,\r\n },\r\n });\r\n layer.addGraphic(marker);\r\n track.realtimePoint = marker;\r\n }\r\n }\r\n\r\n // โ”€โ”€โ”€ ๆทปๅŠ ๅކๅฒ่ฝจ่ฟน๏ผˆไปŽ้ข„็ฝฎๆ•ฐๆฎๅ›žๆ”พ๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function addTrack(points: TrackPoint[], name = \"่ฝจ่ฟน\") {\r\n const layer = trackLayer.value;\r\n if (!layer) return null;\r\n\r\n const id = `track-${_idCounter++}`;\r\n const track: TrackItem = { id, name, points };\r\n track.lineGraphic = _buildLineGraphic(track);\r\n trackList.value.push(track);\r\n return track;\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅผ€ๅง‹ๅฎžๆ—ถ่ฝจ่ฟนๆŽจ้€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function startRealtime(name = \"ๅฎžๆ—ถ่ฝจ่ฟน\") {\r\n if (activeRealtimeId.value) stopRealtime();\r\n\r\n const layer = trackLayer.value;\r\n if (!layer) return null;\r\n\r\n const id = `realtime-${_idCounter++}`;\r\n const track: TrackItem = {\r\n id,\r\n name,\r\n points: [],\r\n realtimeDrawnIdx: -1,\r\n };\r\n trackLayer.value = layer;\r\n trackList.value.push(track);\r\n activeRealtimeId.value = id;\r\n isRealtimeMode.value = true;\r\n return track;\r\n }\r\n\r\n // โ”€โ”€โ”€ ๆŽจ้€ๅฎžๆ—ถๅๆ ‡็‚น โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function pushRealtimePoint(id: string, lng: number, lat: number, alt = 0) {\r\n const track = trackList.value.find((t) => t.id === id);\r\n if (!track) return;\r\n\r\n const point: TrackPoint = {\r\n time: Date.now(),\r\n lng,\r\n lat,\r\n alt,\r\n };\r\n track.points.push(point);\r\n track.realtimeDrawnIdx = track.points.length - 1;\r\n\r\n // ้ฆ–ๆฌก๏ผš็›ดๆŽฅๅปบ็บฟๅ’Œๅ›พๆ ‡\r\n if (track.points.length === 1) {\r\n track.lineGraphic = _buildLineGraphic(track);\r\n _updateRealtimeMarker(track);\r\n } else {\r\n // ่ฟฝๅŠ ไธ€ๆฎตๆŠ˜็บฟ\r\n _appendRealtimeLine(track, track.points.length - 2, track.points.length - 1);\r\n _updateRealtimeMarker(track);\r\n }\r\n\r\n // ่‡ชๅŠจ้ฃž่กŒ่ทŸ้š๏ผˆๆœ€ๅŽไธ€็‚น๏ผ‰\r\n if (mapCtx.map.value) {\r\n mapCtx.map.value.flyToPoint(\r\n [lng, lat, alt + 50],\r\n { radius: 500, duration: 0.5 },\r\n );\r\n }\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅœๆญขๅฎžๆ—ถๆŽจ้€๏ผˆๅ›บๅŒ–่ฝจ่ฟน๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function stopRealtime(id?: string) {\r\n const targetId = id ?? activeRealtimeId.value;\r\n if (!targetId) return;\r\n\r\n const track = trackList.value.find((t) => t.id === targetId);\r\n if (track) {\r\n track.realtimeDrawnIdx = undefined;\r\n if (track.realtimePoint) {\r\n trackLayer.value?.removeGraphic(track.realtimePoint);\r\n track.realtimePoint = undefined;\r\n }\r\n }\r\n\r\n if (activeRealtimeId.value === targetId) {\r\n activeRealtimeId.value = null;\r\n isRealtimeMode.value = false;\r\n }\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅކๅฒ่ฝจ่ฟนๅ›žๆ”พ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function play(trackId?: string) {\r\n const id = trackId ?? activeTrackId.value;\r\n if (!id) return;\r\n\r\n const track = trackList.value.find((t) => t.id === id);\r\n if (!track || track.points.length < 2) return;\r\n\r\n if (activeTrackId.value !== id) {\r\n selectTrack(id);\r\n }\r\n\r\n isPlaying.value = true;\r\n _clearPlayInterval();\r\n\r\n const start = track.points[0].time;\r\n const end = track.points[track.points.length - 1].time;\r\n const totalMs = end - start;\r\n\r\n // ่ฟ›ๅบฆๆฏๅธงๆ›ดๆ–ฐ\r\n _playInterval = setInterval(() => {\r\n const track = trackList.value.find((t) => t.id === activeTrackId.value);\r\n if (!track || !isPlaying.value) return;\r\n\r\n const elapsed = Date.now() - (track._playStartTime ?? Date.now());\r\n const total = end - start;\r\n const progress = Math.min(elapsed / total, 1);\r\n\r\n // ๆ›ดๆ–ฐๅฝ“ๅ‰ๆ—ถ้—ด โ†’ ้ฉฑๅŠจ่ฟ›ๅบฆๆก\r\n currentTime.value = start + progress * total;\r\n playbackProgress.value = progress * 100;\r\n\r\n // ้€ๆญฅ็ป˜ๅˆถ่ฝจ่ฟน\r\n const targetIdx = Math.floor(progress * (track.points.length - 1));\r\n _updatePlaybackLine(track, targetIdx);\r\n }, 60);\r\n }\r\n\r\n function _updatePlaybackLine(track: TrackItem, toIdx: number) {\r\n const layer = trackLayer.value;\r\n if (!layer) return;\r\n\r\n // ๆธ…้™คๆ—ง็บฟ\r\n if (track.lineGraphic) {\r\n layer.removeGraphic(track.lineGraphic);\r\n }\r\n\r\n // ็”ปๅˆฐ toIdx ไฝ็ฝฎ\r\n const positions = track.points.slice(0, toIdx + 1)\r\n .map((p) => [p.lng, p.lat, p.alt] as [number, number, number]);\r\n\r\n track.lineGraphic = new mars3d.graphic.PolylinePrimitive({\r\n positions,\r\n style: {\r\n color: mars3d.Cesium.Color.fromCssColorString(\"#00ff88\") as any,\r\n width: 4,\r\n opacity: 1,\r\n clampToGround: false,\r\n },\r\n });\r\n layer.addGraphic(track.lineGraphic);\r\n\r\n // ็”ปๅฝ“ๅ‰็‚นไฝ\r\n const pt = track.points[toIdx];\r\n mapCtx.map.value?.flyToPoint(\r\n [pt.lng, pt.lat, pt.alt + 200],\r\n { radius: 300, duration: 0 },\r\n );\r\n }\r\n\r\n function pause() {\r\n isPlaying.value = false;\r\n _clearPlayInterval();\r\n }\r\n\r\n function stop() {\r\n isPlaying.value = false;\r\n playbackProgress.value = 0;\r\n currentTime.value = 0;\r\n _clearPlayInterval();\r\n\r\n // ๆขๅคๆ•ดๆก่ฝจ่ฟน\r\n const track = trackList.value.find((t) => t.id === activeTrackId.value);\r\n if (track && trackLayer.value) {\r\n if (track.lineGraphic) trackLayer.value.removeGraphic(track.lineGraphic);\r\n track.lineGraphic = _buildLineGraphic(track);\r\n }\r\n }\r\n\r\n function setSpeed(speed: number) {\r\n playbackSpeed.value = speed;\r\n if (isPlaying.value) {\r\n pause();\r\n play();\r\n }\r\n }\r\n\r\n /** ่ทณ่ฝฌๅˆฐๆŒ‡ๅฎš่ฟ›ๅบฆ๏ผˆ0~100๏ผ‰ */\r\n function seek(progress: number) {\r\n const track = trackList.value.find((t) => t.id === activeTrackId.value);\r\n if (!track) return;\r\n\r\n const targetIdx = Math.floor((progress / 100) * (track.points.length - 1));\r\n currentTime.value = track.points[targetIdx].time;\r\n playbackProgress.value = progress;\r\n _updatePlaybackLine(track, targetIdx);\r\n }\r\n\r\n // โ”€โ”€โ”€ ้€‰ไธญ่ฝจ่ฟน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function selectTrack(id: string) {\r\n activeTrackId.value = id;\r\n stop();\r\n }\r\n\r\n /** ้ฃž่กŒๅˆฐ่ฝจ่ฟนๆฆ‚่งˆ */\r\n function flyToTrack(id: string) {\r\n const track = trackList.value.find((t) => t.id === id);\r\n if (!track || !mapCtx.map.value) return;\r\n\r\n const first = track.points[0];\r\n mapCtx.map.value.flyToPoint(\r\n [first.lng, first.lat, first.alt + 2000],\r\n { radius: 3000, duration: 1.5 },\r\n );\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅˆ ้™ค / ๆธ…็ฉบ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function removeTrack(id: string) {\r\n const idx = trackList.value.findIndex((t) => t.id === id);\r\n if (idx === -1) return;\r\n\r\n const track = trackList.value[idx];\r\n if (track.lineGraphic) trackLayer.value?.removeGraphic(track.lineGraphic);\r\n if (track.realtimePoint) trackLayer.value?.removeGraphic(track.realtimePoint);\r\n // ๅˆ ้™คๅฎžๆ—ถ่ฝจ่ฟน็š„ๆ‰€ๆœ‰็บฟๆฎต\r\n if (track.realtimeLineSegments) {\r\n track.realtimeLineSegments.forEach((seg) => {\r\n trackLayer.value?.removeGraphic(seg);\r\n });\r\n }\r\n trackList.value.splice(idx, 1);\r\n\r\n if (activeTrackId.value === id) {\r\n activeTrackId.value = null;\r\n stop();\r\n }\r\n if (activeRealtimeId.value === id) {\r\n activeRealtimeId.value = null;\r\n isRealtimeMode.value = false;\r\n }\r\n }\r\n\r\n function clearAll() {\r\n stop();\r\n stopRealtime();\r\n trackLayer.value?.clear();\r\n trackList.value = [];\r\n activeTrackId.value = null;\r\n }\r\n\r\n // โ”€โ”€โ”€ ๅ†…้ƒจๅทฅๅ…ท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n function _clearPlayInterval() {\r\n if (_playInterval) {\r\n clearInterval(_playInterval);\r\n _playInterval = null;\r\n }\r\n }\r\n\r\n return {\r\n trackLayer,\r\n trackList,\r\n activeTrackId,\r\n isPlaying,\r\n currentTime,\r\n playbackSpeed,\r\n playbackProgress,\r\n isRealtimeMode,\r\n activeRealtimeId,\r\n initTrackLayer,\r\n addTrack,\r\n startRealtime,\r\n pushRealtimePoint,\r\n stopRealtime,\r\n play,\r\n pause,\r\n stop,\r\n setSpeed,\r\n seek,\r\n selectTrack,\r\n flyToTrack,\r\n removeTrack,\r\n clearAll,\r\n };\r\n}\r\n\r\nexport type UseTrackReturn = ReturnType<typeof useTrack>;\r\n","<!--\r\n TrackLayer โ€” ่ฝจ่ฟน็ป„ไปถ้€ป่พ‘ๅฑ‚\r\n\r\n ่Œ่ดฃ๏ผš\r\n - ๆ”พ็ฝฎๅœจ MarsMapContainer ็š„ slot ๅ†…๏ผˆ้€š่ฟ‡ <slot /> ๆธฒๆŸ“ๅญ็ป„ไปถ๏ผ‰\r\n - inject mapContext๏ผŒๅˆๅง‹ๅŒ–่ฝจ่ฟนๅ›พๅฑ‚\r\n - provide trackContext๏ผŒไพ›ๅญ็ป„ไปถ inject ไฝฟ็”จ\r\n - expose useTrack ๅ…จ้‡ๆŽฅๅฃ๏ผŒไพ›็ˆถ็ป„ไปถ ref ่ฎฟ้—ฎ\r\n\r\n ไฝฟ็”จๆ–นๅผ๏ผˆPanel ๅฟ…้กปไฝœไธบๅญๅ†…ๅฎนไผ ๅ…ฅ๏ผ‰๏ผš\r\n <MarsMapContainer>\r\n <TrackLayer ref=\"trackLayerRef\">\r\n <TrackPanel />\r\n </TrackLayer>\r\n </MarsMapContainer>\r\n-->\r\n<template>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject, provide, watch, onUnmounted } from \"vue\";\r\nimport type { UseMapReturn } from \"../../mars-map/composables/useMap\";\r\nimport { useTrack } from \"./useTrack\";\r\n\r\n// โ”€โ”€โ”€ ๆณจๅ…ฅๅœฐๅ›พไธŠไธ‹ๆ–‡ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst mapCtx = inject<UseMapReturn>(\"mapContext\");\r\nif (!mapCtx) throw new Error(\"[TrackLayer] ๅฟ…้กปๆ”พ็ฝฎๅœจ MarsMapContainer ๅ†…้ƒจ\");\r\n\r\n// โ”€โ”€โ”€ ๅˆๅง‹ๅŒ–่ฝจ่ฟน็ฎก็† โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst track = useTrack(mapCtx);\r\n\r\n// โ”€โ”€โ”€ ็ญ‰ๅพ…ๅœฐๅ›พๅฐฑ็ปชๅŽๅˆๅง‹ๅŒ–ๅ›พๅฑ‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst stopWatch = watch(\r\n () => mapCtx.map.value,\r\n (map) => {\r\n if (map) {\r\n track.initTrackLayer();\r\n stopWatch();\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonUnmounted(() => {\r\n track.clearAll();\r\n});\r\n\r\n// โ”€โ”€โ”€ provide ็ป™ๅญ็ป„ไปถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nprovide(\"trackContext\", track);\r\n\r\n// โ”€โ”€โ”€ expose ็ป™็ˆถ็ป„ไปถ ref โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\ndefineExpose(track);\r\n</script>\r\n","<!--\r\n TrackPanel โ€” ่ฝจ่ฟน็ฎก็†้ขๆฟ\r\n\r\n ๅŠŸ่ƒฝ๏ผš\r\n - ่ฝจ่ฟนๅˆ—่กจ็ฎก็†๏ผˆๆทปๅŠ ๅކๅฒ่ฝจ่ฟน / ๅฎžๆ—ถ่ฝจ่ฟน๏ผ‰\r\n - ๅކๅฒ่ฝจ่ฟนๅ›žๆ”พๆŽงๅˆถ๏ผˆๆ’ญๆ”พ / ๆš‚ๅœ / ๅœๆญข / ๅ€้€Ÿ / ่ฟ›ๅบฆๆ‹–ๆ‹ฝ๏ผ‰\r\n - ๅฎžๆ—ถ่ฝจ่ฟนๆŽจ้€๏ผˆๅผ€ๅง‹ / ่ฟฝๅŠ ๆจกๆ‹Ÿ็‚น / ๅœๆญข๏ผ‰\r\n - ๆ‹–ๆ‹ฝ็งปๅŠจ + ๆ”ถ็ผฉๅ›พๆ ‡ๆ€\r\n\r\n ๆ•ฐๆฎๆฅๆบ๏ผšinject('trackContext')๏ผŒ็”ฑ TrackLayer provide\r\n-->\r\n<template>\r\n <div\r\n class=\"track-panel\"\r\n :class=\"{ collapsed: isCollapsed }\"\r\n :style=\"{ left: pos.x + 'px', top: pos.y + 'px' }\"\r\n >\r\n <!-- ๆ ‡้ข˜ๆ ๏ผˆๅฏๆ‹–ๆ‹ฝ๏ผ‰ -->\r\n <div\r\n class=\"track-panel__header\"\r\n :class=\"{ 'is-dragging': isDragging }\"\r\n @mousedown.prevent=\"startDrag\"\r\n @click=\"isDragging ? null : toggleCollapse()\"\r\n >\r\n <template v-if=\"isCollapsed\">\r\n <div class=\"collapsed-icon-wrap\">\r\n <i class=\"fa fa-share-alt collapsed-icon\" />\r\n <span class=\"track-badge\">{{ track.trackList.value.length }}</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <span class=\"track-panel__title\">\r\n <i class=\"fa fa-share-alt\" />\r\n ่ฝจ่ฟน็ฎก็†\r\n <span class=\"track-count\">{{ track.trackList.value.length }}</span>\r\n </span>\r\n <i class=\"fa fa-chevron-left collapse-icon\" />\r\n </template>\r\n </div>\r\n\r\n <!-- ้ขๆฟไฝ“ -->\r\n <div class=\"track-panel__body\" v-show=\"!isCollapsed\">\r\n <!-- โ”€โ”€ ๆ“ไฝœๆ  โ”€โ”€ -->\r\n <div class=\"track-panel__toolbar\">\r\n <button class=\"btn btn--primary\" @click=\"addDemoTrack\">\r\n <i class=\"fa fa-plus\" /> ๅކๅฒ่ฝจ่ฟน\r\n </button>\r\n <button\r\n class=\"btn\"\r\n :class=\"track.isRealtimeMode.value ? 'btn--active' : 'btn--info'\"\r\n @click=\"toggleRealtime\"\r\n >\r\n <i\r\n :class=\"['fa', track.isRealtimeMode.value ? 'fa-stop' : 'fa-bolt']\"\r\n />\r\n {{ track.isRealtimeMode.value ? \"ๅœๆญขๆŽจ้€\" : \"ๅฎžๆ—ถ่ฝจ่ฟน\" }}\r\n </button>\r\n <button\r\n class=\"btn btn--danger\"\r\n @click=\"confirmClear\"\r\n :disabled=\"track.trackList.value.length === 0\"\r\n >\r\n <i class=\"fa fa-trash-o\" />\r\n </button>\r\n </div>\r\n\r\n <!-- โ”€โ”€ ๅ›žๆ”พๆŽงๅˆถ๏ผˆ้€‰ไธญ่ฝจ่ฟนๆ—ถๆ˜พ็คบ๏ผ‰ โ”€โ”€ -->\r\n <div class=\"track-panel__playback\" v-if=\"track.activeTrackId.value\">\r\n <!-- ่ฝจ่ฟนๅ็งฐ -->\r\n <div class=\"playback__track-name\">\r\n <i class=\"fa fa-road\" />\r\n {{ activeTrackName }}\r\n <span class=\"playback__mode-badge\">ๅކๅฒๅ›žๆ”พ</span>\r\n </div>\r\n\r\n <!-- ๆ’ญๆ”พๆŒ‰้’ฎ็ป„ -->\r\n <div class=\"playback__controls\">\r\n <button class=\"ctrl-btn\" @click=\"track.stop()\">\r\n <i class=\"fa fa-stop\" />\r\n </button>\r\n <button\r\n class=\"ctrl-btn ctrl-btn--play\"\r\n @click=\"track.isPlaying.value ? track.pause() : track.play()\"\r\n >\r\n <i\r\n :class=\"['fa', track.isPlaying.value ? 'fa-pause' : 'fa-play']\"\r\n />\r\n </button>\r\n <button class=\"ctrl-btn\" @click=\"track.play()\">\r\n <i class=\"fa fa-refresh\" />\r\n </button>\r\n </div>\r\n\r\n <!-- ๅ€้€Ÿ้€‰ๆ‹ฉ -->\r\n <div class=\"playback__speed\">\r\n <span class=\"speed-label\">ๅ€้€Ÿ</span>\r\n <div class=\"speed-btns\">\r\n <button\r\n v-for=\"s in speedOptions\"\r\n :key=\"s\"\r\n class=\"speed-btn\"\r\n :class=\"{ active: track.playbackSpeed.value === s }\"\r\n @click=\"track.setSpeed(s)\"\r\n >\r\n {{ s }}x\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- ่ฟ›ๅบฆๆก -->\r\n <div class=\"playback__timeline\">\r\n <span class=\"time-label\">{{\r\n formatTime(track.currentTime.value)\r\n }}</span>\r\n <input\r\n type=\"range\"\r\n class=\"progress-slider\"\r\n min=\"0\"\r\n max=\"100\"\r\n step=\"0.1\"\r\n :value=\"track.playbackProgress.value\"\r\n @input=\"onSeek\"\r\n />\r\n <span class=\"time-label\">{{ formatTime(trackMaxTime) }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- โ”€โ”€ ๅฎžๆ—ถๆจกๅผๆŒ‡็คบ โ”€โ”€ -->\r\n <div\r\n class=\"track-panel__realtime-hint\"\r\n v-if=\"track.isRealtimeMode.value && !track.activeTrackId.value\"\r\n >\r\n <div class=\"realtime-pulse\">\r\n <i class=\"fa fa-bolt\" />\r\n ๅฎžๆ—ถๆŽจ้€ไธญ\r\n <span class=\"blink-dot\" />\r\n </div>\r\n <div class=\"realtime-count\">\r\n ๅทฒๆŽจ้€ <strong>{{ realtimePointCount }}</strong> ไธชๅๆ ‡็‚น\r\n </div>\r\n </div>\r\n\r\n <!-- โ”€โ”€ ่ฝจ่ฟนๅˆ—่กจ โ”€โ”€ -->\r\n <div class=\"track-panel__list\">\r\n <TransitionGroup name=\"track-list\">\r\n <div\r\n v-for=\"item in track.trackList.value\"\r\n :key=\"item.id\"\r\n class=\"track-item\"\r\n :class=\"{\r\n 'track-item--active': track.activeTrackId.value === item.id,\r\n 'track-item--realtime': item.id.startsWith('realtime'),\r\n }\"\r\n @click=\"onSelectTrack(item.id)\"\r\n >\r\n <!-- ้ขœ่‰ฒๆก -->\r\n <span\r\n class=\"track-item__bar\"\r\n :style=\"{\r\n background: item.id.startsWith('realtime')\r\n ? '#ff6b35'\r\n : '#3ea6ff',\r\n }\"\r\n />\r\n\r\n <div class=\"track-item__info\">\r\n <div class=\"track-item__name\">\r\n <i\r\n :class=\"[\r\n 'fa',\r\n item.id.startsWith('realtime') ? 'fa-bolt' : 'fa-road',\r\n ]\"\r\n />\r\n {{ item.name }}\r\n </div>\r\n <div class=\"track-item__meta\">\r\n {{ item.points.length }} ไธช็‚น\r\n <span v-if=\"item.id.startsWith('realtime')\" class=\"realtime-tag\"\r\n >ๅฎžๆ—ถ</span\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"track-item__actions\">\r\n <button\r\n class=\"icon-btn\"\r\n title=\"้ฃž่กŒ\"\r\n @click.stop=\"track.flyToTrack(item.id)\"\r\n >\r\n <i class=\"fa fa-crosshairs\" />\r\n </button>\r\n <button\r\n class=\"icon-btn icon-btn--danger\"\r\n title=\"ๅˆ ้™ค\"\r\n @click.stop=\"track.removeTrack(item.id)\"\r\n >\r\n <i class=\"fa fa-times\" />\r\n </button>\r\n </div>\r\n </div>\r\n </TransitionGroup>\r\n\r\n <!-- ็ฉบ็Šถๆ€ -->\r\n <div\r\n v-if=\"track.trackList.value.length === 0\"\r\n class=\"track-panel__empty\"\r\n >\r\n <i class=\"fa fa-map-o\" />\r\n <p>ๆš‚ๆ— ่ฝจ่ฟนๆ•ฐๆฎ</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, inject, reactive } from \"vue\";\r\nimport type { UseTrackReturn } from \"./useTrack\";\r\n\r\n// โ”€โ”€โ”€ ๆณจๅ…ฅ่ฝจ่ฟนไธŠไธ‹ๆ–‡ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst track = inject<UseTrackReturn>(\"trackContext\");\r\nif (!track) throw new Error(\"[TrackPanel] ๅฟ…้กปไธŽ TrackLayer ๅŒ็บงไฝฟ็”จ\");\r\n\r\n// โ”€โ”€โ”€ ๆ‹–ๆ‹ฝ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst isCollapsed = ref(true);\r\nconst isDragging = ref(false);\r\nconst pos = reactive({ x: 10, y: 80 }); // ้ป˜่ฎค้”™ๅผ€ POI ้ขๆฟ\r\n\r\nlet dragStartX = 0,\r\n dragStartY = 0,\r\n origX = 0,\r\n origY = 0;\r\n\r\nfunction toggleCollapse() {\r\n isCollapsed.value = !isCollapsed.value;\r\n}\r\n\r\nfunction startDrag(e: MouseEvent) {\r\n isDragging.value = true;\r\n dragStartX = e.clientX;\r\n dragStartY = e.clientY;\r\n origX = pos.x;\r\n origY = pos.y;\r\n document.addEventListener(\"mousemove\", onDrag);\r\n document.addEventListener(\"mouseup\", stopDrag);\r\n}\r\nfunction onDrag(e: MouseEvent) {\r\n if (!isDragging.value) return;\r\n pos.x = origX + (e.clientX - dragStartX);\r\n pos.y = origY + (e.clientY - dragStartY);\r\n}\r\nfunction stopDrag() {\r\n isDragging.value = false;\r\n document.removeEventListener(\"mousemove\", onDrag);\r\n document.removeEventListener(\"mouseup\", stopDrag);\r\n}\r\n\r\n// โ”€โ”€โ”€ ้€‰ไธญ่ฝจ่ฟน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction onSelectTrack(id: string) {\r\n if (track.activeTrackId.value === id) return;\r\n track.selectTrack(id);\r\n track.stop();\r\n}\r\n\r\nconst activeTrackName = computed(() => {\r\n const t = track.trackList.value.find(\r\n (x) => x.id === track.activeTrackId.value,\r\n );\r\n return t?.name ?? \"\";\r\n});\r\n\r\nconst trackMaxTime = computed(() => {\r\n const t = track.trackList.value.find(\r\n (x) => x.id === track.activeTrackId.value,\r\n );\r\n if (!t || t.points.length < 2) return 0;\r\n return t.points[t.points.length - 1].time;\r\n});\r\n\r\n// โ”€โ”€โ”€ ๅ€้€Ÿ้€‰้กน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nconst speedOptions = [1, 2, 4, 8];\r\n\r\n// โ”€โ”€โ”€ ่ฟ›ๅบฆๆ‹–ๆ‹ฝ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction onSeek(e: Event) {\r\n const val = parseFloat((e.target as HTMLInputElement).value);\r\n track.seek(val);\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆ—ถ้—ดๆ ผๅผๅŒ– โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction formatTime(ts: number): string {\r\n if (!ts) return \"00:00\";\r\n const d = new Date(ts);\r\n return `${String(d.getMinutes()).padStart(2, \"0\")}:${String(d.getSeconds()).padStart(2, \"0\")}`;\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆทปๅŠ ๆผ”็คบๅކๅฒ่ฝจ่ฟน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction addDemoTrack() {\r\n // ็”Ÿๆˆไธ€ๆฎตๅŒ—ไบฌๅŒบๅŸŸ่ดด่ฟ‘ๅฎž้™…็š„่ทฏๅพ„๏ผšๆ–นๅ‘ๆƒฏๆ€ง + ้ซ˜ๅบฆ้š่ทฏ็บฟ่ตทไผ\r\n const baseLng = 116.3974;\r\n const baseLat = 39.909;\r\n const points = [];\r\n let t = Date.now();\r\n\r\n // ๅˆๅง‹ๆ–นๅ‘่ง’๏ผˆๅผงๅบฆ๏ผ‰\r\n let heading = Math.random() * Math.PI * 2;\r\n const STEP = 20; // ๅ‡ๅฐ‘ๅˆฐ 20 ไธช็‚น\r\n\r\n for (let i = 0; i < STEP; i++) {\r\n t += 5000 + Math.random() * 5000;\r\n // ๆ–นๅ‘ๆฏๆญฅๅพฎ่ฐƒ ยฑ15ยฐ๏ผŒๆจกๆ‹Ÿๆฒฟ้“่ทฏ่กŒ้ฉถ\r\n heading += (Math.random() - 0.5) * (Math.PI / 6);\r\n const stepLng = baseLng + Math.cos(heading) * 0.004;\r\n const stepLat = baseLat + Math.sin(heading) * 0.002;\r\n const alt = 30 + Math.sin((i / STEP) * Math.PI) * 80; // ๆ‹ฑๅฝข่ตทไผ\r\n points.push({ time: t, lng: stepLng, lat: stepLat, alt });\r\n }\r\n\r\n track.addTrack(points, `่ฝจ่ฟน ${_counter++}`);\r\n}\r\n\r\nlet _counter = 1;\r\n\r\n// โ”€โ”€โ”€ ๅฎžๆ—ถ่ฝจ่ฟน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nlet _realtimeTimer: ReturnType<typeof setInterval> | null = null;\r\nlet _currentRealtimeId: string | null = null;\r\n\r\nfunction toggleRealtime() {\r\n if (track.isRealtimeMode.value) {\r\n stopRealtime();\r\n } else {\r\n startRealtime();\r\n }\r\n}\r\n\r\nfunction startRealtime() {\r\n const id = track.startRealtime(`ๅฎžๆ—ถ่ฝจ่ฟน ${_counter++}`)?.id;\r\n if (!id) return;\r\n _currentRealtimeId = id;\r\n\r\n // ๅคฉๅฎ‰้—จๅๆ ‡๏ผˆๅœ†ๅฟƒ๏ผ‰\r\n const CENTER_LNG = 116.397;\r\n const CENTER_LAT = 39.908;\r\n // ็ป•ๅœˆๅŠๅพ„๏ผˆ็บฆ 400 ็ฑณ๏ผ‰\r\n const RADIUS_LNG = 0.004;\r\n const RADIUS_LAT = 0.003;\r\n // ๆ€ปๅ…ฑ 36 ไธช็‚น๏ผŒๆฏ 10ยฐ ไธ€ไธช็‚น๏ผŒๅฎŒๆˆไธ€ๅœˆ\r\n const TOTAL_POINTS = 36;\r\n const ANGLE_STEP = (2 * Math.PI) / TOTAL_POINTS;\r\n // ๅˆๅง‹่ง’ๅบฆ้šๆœบ๏ผŒ่ฎฉ่ตท็‚นไธๅœจๅ›บๅฎšไฝ็ฝฎ\r\n let angle = Math.random() * 2 * Math.PI;\r\n let pushCount = 0;\r\n\r\n _realtimeTimer = setInterval(() => {\r\n pushCount++;\r\n // ๆฒฟๅœ†ๅฝข่ฝจ่ฟน็งปๅŠจ\r\n const lng = CENTER_LNG + Math.cos(angle) * RADIUS_LNG;\r\n const lat = CENTER_LAT + Math.sin(angle) * RADIUS_LAT;\r\n const alt = 40 + Math.sin(angle * 3) * 20; // ้ซ˜ๅบฆ้šไฝ็ฝฎๅพฎๅพฎ่ตทไผ\r\n track.pushRealtimePoint(id, lng, lat, alt);\r\n\r\n // ่ง’ๅบฆ้€’ๅขž๏ผŒ็ป˜ๅˆถไธ‹ไธ€ไฝ็ฝฎ\r\n angle += ANGLE_STEP;\r\n\r\n // ๅฎŒๆˆไธ€ๅœˆๅŽ่‡ชๅŠจๅœๆญข\r\n if (pushCount >= TOTAL_POINTS) {\r\n stopRealtime();\r\n }\r\n }, 800);\r\n}\r\n\r\nfunction stopRealtime() {\r\n if (_realtimeTimer) {\r\n clearInterval(_realtimeTimer);\r\n _realtimeTimer = null;\r\n }\r\n if (_currentRealtimeId) {\r\n track.stopRealtime(_currentRealtimeId);\r\n _currentRealtimeId = null;\r\n }\r\n}\r\n\r\nconst realtimePointCount = computed(() => {\r\n const t = track.trackList.value.find((x) => x.id === _currentRealtimeId);\r\n return t?.points.length ?? 0;\r\n});\r\n\r\n// โ”€โ”€โ”€ ๆธ…็ฉบ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nfunction confirmClear() {\r\n if (window.confirm(`็กฎ่ฎคๆธ…็ฉบๅ…จ้ƒจ ${track.trackList.value.length} ๆก่ฝจ่ฟน๏ผŸ`)) {\r\n stopRealtime();\r\n track.clearAll();\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n// โ”€โ”€โ”€ ไธป้ขๆฟ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel {\r\n position: absolute;\r\n width: 280px;\r\n height: auto;\r\n max-height: calc(100vh - 40px);\r\n background: rgba(23, 35, 50, 0.92);\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n border-radius: 6px;\r\n z-index: 998;\r\n display: flex;\r\n flex-direction: column;\r\n backdrop-filter: blur(4px);\r\n transition: width 0.25s ease;\r\n\r\n &.collapsed {\r\n width: 46px;\r\n max-height: none;\r\n overflow: hidden;\r\n\r\n .track-panel__title {\r\n display: none;\r\n }\r\n .track-panel__body {\r\n display: none;\r\n }\r\n .collapse-icon {\r\n display: none;\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆ ‡้ข˜ๆ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__header {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 14px;\r\n background: rgba(15, 25, 40, 0.9);\r\n border-radius: 6px 6px 0 0;\r\n cursor: grab;\r\n user-select: none;\r\n flex-shrink: 0;\r\n\r\n &.is-dragging {\r\n cursor: grabbing;\r\n }\r\n\r\n .collapsed-icon {\r\n display: none;\r\n color: #ff6b35;\r\n font-size: 18px;\r\n }\r\n\r\n .track-panel__title {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #e8f4ff;\r\n font-size: 14px;\r\n font-weight: 600;\r\n .fa {\r\n color: #ff6b35;\r\n font-size: 15px;\r\n }\r\n }\r\n\r\n // ๅฑ•ๅผ€ๆ€่ง’ๆ ‡๏ผˆ็บข่‰ฒ๏ผ‰\r\n .track-count {\r\n background: #e74c3c;\r\n color: #fff;\r\n font-size: 11px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n min-width: 18px;\r\n text-align: center;\r\n }\r\n\r\n .collapse-icon {\r\n color: #7a9ec0;\r\n font-size: 12px;\r\n }\r\n}\r\n\r\n// ๆ”ถ็ผฉๆ€\r\n.track-panel.collapsed .track-panel__header {\r\n flex-direction: column;\r\n align-items: flex-start; // ๅทฆๅฏน้ฝ\r\n padding: 8px 10px 10px; // ๅบ•้ƒจ็•™ๆ›ดๅคš็ฉบ้—ด\r\n gap: 0;\r\n cursor: pointer;\r\n\r\n // ๅ›พๆ ‡ + ่ง’ๆ ‡ไธ€ไฝ“ๅŒ–ๅฎนๅ™จ๏ผŒๅ›พๆ ‡ๅœจๅทฆไธ‹๏ผŒ่ง’ๆ ‡ๅ ๅœจๅ›พๆ ‡ๅณไธŠ\r\n .collapsed-icon-wrap {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-top: 12px; // ๅพ€ไธ‹ไธ€็‚น\r\n margin-left: 2px; // ๅพ€ๅทฆไธ€็‚น\r\n }\r\n\r\n .collapsed-icon {\r\n display: block;\r\n color: #ff6b35;\r\n font-size: 18px;\r\n }\r\n\r\n // ่ง’ๆ ‡๏ผš็›ธๅฏนไบŽๅ›พๆ ‡ๅฎนๅ™จๅฎšไฝ๏ผŒ่ฝๅœจๅ›พๆ ‡ๅณไธŠ่ง’\r\n .track-badge {\r\n position: absolute;\r\n top: -12px;\r\n right: -12px;\r\n background: #e74c3c;\r\n color: #fff;\r\n font-size: 10px;\r\n font-weight: 600;\r\n min-width: 16px;\r\n height: 16px;\r\n line-height: 16px;\r\n text-align: center;\r\n border-radius: 8px;\r\n padding: 0 3px;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ้ขๆฟไฝ“ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__body {\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n// โ”€โ”€โ”€ ๆ“ไฝœๆ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__toolbar {\r\n display: flex;\r\n gap: 6px;\r\n padding: 10px 12px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\r\n\r\n .btn {\r\n flex: 1;\r\n padding: 5px 8px;\r\n border: 1px solid rgba(62, 166, 255, 0.4);\r\n background: rgba(62, 166, 255, 0.1);\r\n color: #9dc8f0;\r\n border-radius: 4px;\r\n font-size: 12px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 5px;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.25);\r\n color: #fff;\r\n }\r\n &--active {\r\n background: rgba(255, 100, 50, 0.35);\r\n color: #ffaa88;\r\n border-color: #ff6b35;\r\n }\r\n &--primary {\r\n background: rgba(62, 166, 255, 0.2);\r\n color: #fff;\r\n border-color: rgba(62, 166, 255, 0.6);\r\n }\r\n &--info {\r\n background: rgba(255, 107, 53, 0.2);\r\n color: #ffaa88;\r\n border-color: rgba(255, 107, 53, 0.5);\r\n }\r\n &--danger {\r\n flex: 0 0 auto;\r\n width: 36px;\r\n border-color: rgba(255, 80, 80, 0.4);\r\n background: rgba(255, 80, 80, 0.1);\r\n color: #ffaaaa;\r\n &:hover:not(:disabled) {\r\n background: rgba(255, 80, 80, 0.25);\r\n color: #fff;\r\n }\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅ›žๆ”พๆŽงๅˆถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__playback {\r\n padding: 10px 12px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\r\n\r\n .playback__track-name {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n color: #9dc8f0;\r\n margin-bottom: 8px;\r\n\r\n .fa {\r\n color: #00ff88;\r\n }\r\n .playback__mode-badge {\r\n background: rgba(0, 255, 136, 0.15);\r\n color: #00ff88;\r\n font-size: 10px;\r\n padding: 1px 6px;\r\n border-radius: 8px;\r\n margin-left: 4px;\r\n }\r\n }\r\n\r\n // ๆ’ญๆ”พๆŒ‰้’ฎ็ป„\r\n .playback__controls {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n margin-bottom: 8px;\r\n }\r\n\r\n // ๅ•็‹ฌๆŽงๅˆถๆŒ‰้’ฎ\r\n .ctrl-btn {\r\n width: 30px;\r\n height: 30px;\r\n border: 1px solid rgba(62, 166, 255, 0.4);\r\n background: rgba(62, 166, 255, 0.1);\r\n color: #9dc8f0;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 12px;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.3);\r\n color: #fff;\r\n }\r\n\r\n &--play {\r\n width: 38px;\r\n height: 38px;\r\n background: rgba(0, 200, 100, 0.2);\r\n border-color: rgba(0, 200, 100, 0.6);\r\n color: #00ff88;\r\n font-size: 15px;\r\n &:hover {\r\n background: rgba(0, 200, 100, 0.35);\r\n }\r\n }\r\n }\r\n\r\n // ๅ€้€Ÿ\r\n .playback__speed {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-bottom: 8px;\r\n\r\n .speed-label {\r\n font-size: 11px;\r\n color: #5a7a9a;\r\n }\r\n .speed-btns {\r\n display: flex;\r\n gap: 4px;\r\n }\r\n .speed-btn {\r\n padding: 2px 7px;\r\n border: 1px solid rgba(62, 166, 255, 0.3);\r\n background: rgba(255, 255, 255, 0.04);\r\n color: #7a9ec0;\r\n border-radius: 10px;\r\n font-size: 11px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.2);\r\n color: #fff;\r\n }\r\n &.active {\r\n background: rgba(62, 166, 255, 0.3);\r\n color: #3ea6ff;\r\n border-color: #3ea6ff;\r\n }\r\n }\r\n }\r\n\r\n // ่ฟ›ๅบฆๆก\r\n .playback__timeline {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n\r\n .time-label {\r\n font-size: 10px;\r\n color: #5a7a9a;\r\n font-family: monospace;\r\n min-width: 36px;\r\n text-align: center;\r\n }\r\n\r\n .progress-slider {\r\n flex: 1;\r\n height: 4px;\r\n -webkit-appearance: none;\r\n appearance: none;\r\n background: rgba(62, 166, 255, 0.2);\r\n border-radius: 2px;\r\n outline: none;\r\n cursor: pointer;\r\n\r\n &::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n background: #3ea6ff;\r\n cursor: pointer;\r\n box-shadow: 0 0 6px rgba(62, 166, 255, 0.6);\r\n }\r\n\r\n &::-moz-range-thumb {\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n background: #3ea6ff;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅฎžๆ—ถๆจกๅผๆ็คบ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__realtime-hint {\r\n padding: 8px 12px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n\r\n .realtime-pulse {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n color: #ff6b35;\r\n .fa {\r\n color: #ff6b35;\r\n }\r\n }\r\n\r\n .blink-dot {\r\n width: 6px;\r\n height: 6px;\r\n border-radius: 50%;\r\n background: #ff6b35;\r\n animation: blink 1s ease-in-out infinite;\r\n }\r\n\r\n .realtime-count {\r\n font-size: 11px;\r\n color: #7a9ec0;\r\n strong {\r\n color: #ff6b35;\r\n }\r\n }\r\n}\r\n\r\n@keyframes blink {\r\n 0%,\r\n 100% {\r\n opacity: 1;\r\n }\r\n 50% {\r\n opacity: 0.2;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ่ฝจ่ฟนๅˆ—่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__list {\r\n overflow-y: auto;\r\n max-height: calc(100vh - 340px);\r\n padding: 6px 0;\r\n\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background: rgba(62, 166, 255, 0.3);\r\n border-radius: 2px;\r\n }\r\n}\r\n\r\n.track-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background 0.15s;\r\n\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.1);\r\n }\r\n &--active {\r\n background: rgba(62, 166, 255, 0.18);\r\n }\r\n &--realtime .track-item__bar {\r\n background: #ff6b35 !important;\r\n }\r\n\r\n &__bar {\r\n width: 3px;\r\n height: 30px;\r\n border-radius: 2px;\r\n background: #3ea6ff;\r\n flex-shrink: 0;\r\n }\r\n\r\n &__info {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n &__name {\r\n overflow: hidden;\r\n font-size: 13px;\r\n color: #ffffff;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n .fa {\r\n color: #8ab4d4;\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n &__meta {\r\n font-size: 11px;\r\n color: #9dc8f0;\r\n margin-top: 2px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n\r\n .realtime-tag {\r\n background: rgba(255, 107, 53, 0.2);\r\n color: #ff6b35;\r\n font-size: 10px;\r\n padding: 0 5px;\r\n border-radius: 6px;\r\n }\r\n\r\n &__actions {\r\n display: flex;\r\n gap: 4px;\r\n flex-shrink: 0;\r\n opacity: 0;\r\n transition: opacity 0.15s;\r\n }\r\n\r\n &:hover &__actions {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.icon-btn {\r\n width: 22px;\r\n height: 22px;\r\n border: none;\r\n background: rgba(255, 255, 255, 0.08);\r\n color: #9dc8f0;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 11px;\r\n transition: all 0.15s;\r\n &:hover {\r\n background: rgba(62, 166, 255, 0.3);\r\n color: #fff;\r\n }\r\n &--danger:hover {\r\n background: rgba(255, 80, 80, 0.35);\r\n color: #fff;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ็ฉบ็Šถๆ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-panel__empty {\r\n text-align: center;\r\n padding: 30px 20px;\r\n color: #4a6a8a;\r\n .fa {\r\n font-size: 32px;\r\n margin-bottom: 10px;\r\n display: block;\r\n }\r\n p {\r\n font-size: 12px;\r\n margin: 0;\r\n }\r\n}\r\n\r\n// โ”€โ”€โ”€ ๅˆ—่กจๅŠจ็”ป โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\n.track-list-enter-active,\r\n.track-list-leave-active {\r\n transition: all 0.25s ease;\r\n}\r\n.track-list-enter-from {\r\n opacity: 0;\r\n transform: translateX(-12px);\r\n}\r\n.track-list-leave-to {\r\n opacity: 0;\r\n transform: translateX(12px);\r\n}\r\n</style>\r\n","/**\r\n * Mars3D Vue3 Components - ็ปŸไธ€ๅฏผๅ‡บๅ…ฅๅฃ\r\n *\r\n * @description ๅฐ่ฃ…ไบ† Mars3D ๅœฐๅ›พ็š„ๅŸบ็ก€่ƒฝๅŠ›๏ผˆๆต‹้‡ใ€็ป˜ๅˆถใ€่ง†่ง’ๆŽงๅˆถ๏ผ‰\r\n * ๅŠไธšๅŠก็ป„ไปถ๏ผˆPOI ๆ ‡ๆณจใ€่ฝจ่ฟน็ฎก็†๏ผ‰็š„ Vue3 ็ป„ไปถๅบ“\r\n *\r\n * @example\r\n * // ๅฎŒๆ•ดๅผ•ๅ…ฅ\r\n * import Mars3dVueComponents from '@your-org/mars3d-vue-components'\r\n * app.use(Mars3dVueComponents)\r\n *\r\n * // ๆŒ‰้œ€ๅผ•ๅ…ฅ\r\n * import { MarsMapContainer, useMap } from '@your-org/mars3d-vue-components'\r\n*/\r\n\r\n// ๅผ•ๅ…ฅๅ…จๅฑ€ๆ ทๅผ๏ผˆๅฏผ่ˆช็ƒใ€Cesium ๆŽงไปถ็ญ‰ๆ ทๅผ่ฆ†็›–๏ผ‰\r\nimport \"./styles/mars3d-theme.css\";\r\n\r\n// ๅผ•ๅ…ฅ Mars3D / Cesium ๅŸบ็ก€ CSS๏ผˆๅฏผ่ˆช็ƒใ€็ฝ—็›˜ใ€็Šถๆ€ๆ ็ญ‰ๆŽงไปถๆ ทๅผ๏ผ‰\r\nimport \"mars3d-cesium/Build/Cesium/Widgets/widgets.css\";\r\nimport \"mars3d/mars3d.css\";\r\n\r\n// โ”€โ”€ ๅŸบ็ก€็ป„ไปถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport { default as MarsMapContainer } from \"./components/mars-map/MarsMapContainer.vue\";\r\nexport { default as ToolbarPanel } from \"./components/mars-map/panels/ToolbarPanel.vue\";\r\nexport { default as VisionPanel } from \"./components/mars-map/panels/VisionPanel.vue\";\r\n\r\n// โ”€โ”€ Composables โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport { useMap } from \"./components/mars-map/composables/useMap\";\r\nexport { useMeasure } from \"./components/mars-map/composables/useMeasure\";\r\nexport { useDraw } from \"./components/mars-map/composables/useDraw\";\r\nexport { useVision } from \"./components/mars-map/composables/useVision\";\r\n\r\n// โ”€โ”€ ไธšๅŠก็ป„ไปถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport { default as PoiMarkerLayer } from \"./components/business/poi-marker/PoiMarkerLayer.vue\";\r\nexport { default as PoiMarkerPanel } from \"./components/business/poi-marker/PoiMarkerPanel.vue\";\r\nexport { default as TrackLayer } from \"./components/business/track/TrackLayer.vue\";\r\nexport { default as TrackPanel } from \"./components/business/track/TrackPanel.vue\";\r\n\r\n// โ”€โ”€ ไธšๅŠก Composable โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport { usePoiMarker } from \"./components/business/poi-marker/usePoiMarker\";\r\nexport { useTrack } from \"./components/business/track/useTrack\";\r\n\r\n// โ”€โ”€ ็ฑปๅž‹ๅฏผๅ‡บ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nexport type { UseMapReturn } from \"./components/mars-map/composables/useMap\";\r\nexport type { DrawType } from \"./components/mars-map/composables/useDraw\";\r\nexport type {\r\n PoiItem,\r\n UsePoiMarkerReturn,\r\n} from \"./components/business/poi-marker/usePoiMarker\";\r\nexport type {\r\n TrackPoint,\r\n TrackItem,\r\n UseTrackReturn,\r\n} from \"./components/business/track/useTrack\";\r\n\r\n// โ”€โ”€ ๅฎ‰่ฃ…ๆ’ไปถ๏ผˆๅฎŒๆ•ดๅผ•ๅ…ฅๆ—ถไฝฟ็”จ๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\r\nimport type { App, Component } from \"vue\";\r\nimport MarsMapContainer from \"./components/mars-map/MarsMapContainer.vue\";\r\nimport ToolbarPanel from \"./components/mars-map/panels/ToolbarPanel.vue\";\r\nimport VisionPanel from \"./components/mars-map/panels/VisionPanel.vue\";\r\nimport PoiMarkerLayer from \"./components/business/poi-marker/PoiMarkerLayer.vue\";\r\nimport PoiMarkerPanel from \"./components/business/poi-marker/PoiMarkerPanel.vue\";\r\nimport TrackLayer from \"./components/business/track/TrackLayer.vue\";\r\nimport TrackPanel from \"./components/business/track/TrackPanel.vue\";\r\n\r\nconst components: Record<string, Component> = {\r\n MarsMapContainer,\r\n ToolbarPanel,\r\n VisionPanel,\r\n PoiMarkerLayer,\r\n PoiMarkerPanel,\r\n TrackLayer,\r\n TrackPanel,\r\n};\r\n\r\nconst YiMap = {\r\n install(app: App, options?: { prefix?: string }) {\r\n const prefix = options?.prefix ?? \"\";\r\n for (const [name, component] of Object.entries(components)) {\r\n app.component(prefix ? `${prefix}${name}` : name, component);\r\n }\r\n },\r\n};\r\n\r\nexport default YiMap;\r\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_withDirectives","_hoisted_1","_hoisted_2","_Fragment","_renderList","_hoisted_4","_createVNode","_Transition","_openBlock","_hoisted_3","_toDisplayString","MarsMap","_createBlock","_unref","_renderSlot","_idCounter","_normalizeStyle","_hoisted_5","_hoisted_6","_createTextVNode","_hoisted_8","_hoisted_10","_TransitionGroup","_hoisted_12","_withModifiers","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_19","track","_a","PoiMarkerLayer","TrackLayer"],"mappings":";;AAYO,MAAM,mBAAmB,OAAO,SAAS;AAAA;AAAA,EAE9C,gBAAgB;AACd,SAAK,KAAK,kBAAkB,KAAK,QAAQ,IAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,aAAa;AACX,SAAK,aAAY;AAAA,EACnB;AACF;AACA,OAAO,MAAM,KAAK,SAAS,cAAc,UAAU;ACV5C,MAAM,mBAAmB,OAAO,SAAS;AAAA;AAAA,EAE9C,gBAAgB;AACd,SAAK,KAAK,cAAc,KAAK,QAAQ,QAAQ,EAAE,UAAU,KAAK,WAAW;AAAA,EAC3E;AAAA;AAAA,EAGA,eAAe;AACb,SAAK,KAAK,YAAW;AAAA,EACvB;AACF;AACA,OAAO,MAAM,KAAK,SAAS,UAAU,UAAU;ACVxC,MAAM,kBAAkB,OAAO,SAAS;AAAA,EAC7C,YAAY,UAAU,IAAI;AACxB,UAAM,OAAO;AAEb,SAAK,SAAS,KAAK,QAAQ,SAAS;AACpC,SAAK,UAAU,KAAK,QAAQ,UAAU,EAAE,KAAK,WAAW,KAAK,YAAY,KAAK,cAAY,SAAS,GAAG,OAAO,IAAG;AAAA,EAClH;AAAA;AAAA,EAGA,gBAAgB;AACd,SAAK,KAAK,cAAc,KAAK,SAAS;AAAA,MACpC,UAAU;AAAA,MACV,UAAU,MAAM;AACd,aAAK,KAAK,GAAG,OAAO,UAAU,WAAW,KAAK,kBAAkB,IAAI;AAAA,MACtE;AAAA,IACN,CAAK;AAAA,EACH;AAAA;AAAA,EAGA,eAAe;AACb,SAAK,KAAK,IAAI,OAAO,UAAU,WAAW,KAAK,kBAAkB,IAAI;AAAA,EACvE;AAAA,EAEA,mBAAmB;AACjB,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AAEA,SAAK,KAAK,MAAM,OAAO,OAAO,OAAO,OAAO,WAAW,QAAQ,KAAK,MAAM;AAAA,EAC5E;AACF;AACA,OAAO,MAAM,KAAK,SAAS,aAAa,SAAS;AC5B1C,MAAM,oBAAoB,OAAO,SAAS;AAAA;AAAA,EAE/C,gBAAgB;AACd,QAAI,KAAK,QAAQ,QAAQ;AACvB,WAAK,KAAK,cAAc,KAAK,QAAQ,QAAQ,EAAE,UAAU,GAAG;AAAA,IAC9D;AAEA,QAAI,KAAK,QAAQ,UAAU;AACzB,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,aAAa,IAAI,OAAO,MAAM,UAAU,KAAK,OAAO;AACzD,WAAK,KAAK,SAAS,KAAK,UAAU;AAAA,IACpC,OAAO;AACL,WAAK,eAAe,IAAI,OAAO,MAAM,YAAY,KAAK,OAAO;AAC7D,WAAK,KAAK,SAAS,KAAK,YAAY;AAAA,IACtC;AAEA,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,WAAW,MAAK;AAAA,IACvB,OAAO;AACL,WAAK,aAAa,MAAM,KAAK,QAAQ,KAAK;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,KAAI;AACtB,WAAK,aAAa,QAAO;AACzB,aAAO,KAAK;AAAA,IACd;AACA,QAAI,KAAK,YAAY;AACnB,WAAK,WAAW,KAAI;AACpB,WAAK,WAAW,QAAO;AACvB,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AACA,OAAO,MAAM,KAAK,SAAS,eAAe,WAAW;AC5C9C,MAAM,kBAAkB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7C,gBAAgB;AACd,SAAK,gBAAgB,IAAI,OAAO,MAAM,aAAY;AAClD,SAAK,KAAK,SAAS,KAAK,aAAa;AAErC,UAAM,aAAa,IAAI,OAAO,QAAQ,WAAW,KAAK,QAAQ,KAAK;AACnE,SAAK,cAAc,WAAW,UAAU;AACxC,SAAK,cAAc;AAEnB,eAAW,MAAK;AAAA,EAClB;AAAA;AAAA,EAGA,WAAW,SAAS;AAClB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAO;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,KAAI;AACrB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,QAAO;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AACA,OAAO,MAAM,KAAK,SAAS,aAAa,SAAS;AC5C1C,MAAM,eAAe,OAAO,SAAS;AAAA;AAAA,EAE1C,gBAAgB;AACd,SAAK,KAAK,OAAO,KAAK,QAAQ,cAAc;AAAA,EAC9C;AACF;AACA,OAAO,MAAM,KAAK,SAAS,UAAU,MAAM;ACNpC,MAAM,gBAAgB,OAAO,SAAS;AAAA;AAAA,EAE3C,gBAAgB;AACd,SAAK,KAAK,QAAQ,KAAK,QAAQ,cAAc;AAAA,EAC/C;AACF;AACA,OAAO,MAAM,KAAK,SAAS,WAAW,OAAO;ACDtC,MAAM,sBAAsB,OAAO,SAAS;AAAA;AAAA,EAEjD,gBAAgB;AACd,UAAM,QAAQ,KAAK,KAAK,aAAa,KAAK,QAAQ,OAAO;AACzD,QAAI,OAAO;AACT,YAAM,OAAO;AACb,YAAM,aAAa,KAAK,MAAM;AAC5B,aAAK,WAAW,MAAM,eAAe,KAAK,QAAQ,SAAS;AAC3D,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,OAAO;AACrB,eAAK,SAAS,aAAa;AAAA,YACzB,MAAM,KAAK;AAAA,YACX,MAAM,KAAK,QAAQ;AAAA,YACnB,UAAU,KAAK,QAAQ;AAAA,YACvB,OAAO,KAAK,QAAQ;AAAA,UAChC,CAAW;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,YAAW;AAAA,IAC3B;AAAA,EACF;AACF;AACA,OAAO,MAAM,KAAK,SAAS,iBAAiB,aAAa;AC3ClD,MAAM,wBAAwB,OAAO,QAAQ,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrE,IAAI,OAAO;AACT,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,KAAK,KAAK;AACZ,SAAK,MAAM,OAAO;AAElB,SAAK,MAAM,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,OAAO;AAChB,UAAM,QAAQ;AACd,UAAM,QAAQ;AAAA,MACZ,GAAG;AAAA,MACH,MAAM,KAAK,MAAM;AAAA,MACjB,WAAW;AAAA,MACX,OAAO,MAAM,aAAa;AAAA,MAC1B,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,cAAc,OAAO,MAAM,SAAS;AAAA,IAC1C;AACI,QAAI,MAAM,iBAAiB;AACzB,YAAM,MAAM,6BAA6B,MAAM;AAAA,IACjD;AAEA,UAAM,WAAW,KAAK;AAAA,EACxB;AACF;AAGA,OAAO,YAAY,SAAS,mBAAmB,eAAe;;;;;;;;;;;AC9B9D,UAAM,QAAQ;AAcd,QAAI;AAGJ,UAAM,YAAY,SAAS,MAAM,oBAAoB,MAAM,MAAM,EAAE;AAGnE,UAAM,OAAO;AAEb,UAAM,aAAa,YAAY;AAE7B,UAAI;AACJ,UAAI,MAAM,KAAK;AAEb,qBAAa,MAAM,OAAO,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK;AAC3D,YAAI,MAAM,SAAS;AACjB,uBAAa,OAAO,KAAK,MAAM,YAAY,MAAM,MAAM,OAAO,CAAC;AAAA,QACjE;AAAA,MACF,WAAW,MAAM,SAAS;AACxB,qBAAa,MAAM,MAAM,OAAO;AAAA,MAClC;AAIC,aAAe,KAAK,gBAAgB;AAErC,YAAM,IAAI,OAAO,IAAI,UAAU,OAAO,UAAU;AAGhD,UAAI,OAAO,KAAK,eAAe;AAC7B,YAAI,aAAa;AAGjB,YAAI,OAAO,UAAU,UAAU,YAAA,EAAc,QAAQ,MAAM,KAAK,GAAG;AACjE,cAAI,OAAO,kBAAkB;AAC7B,cAAI,MAAM,oBAAoB;AAAA,QAChC;AAAA,MACF,OAAO;AACL,YAAI,aAAa;AAGjB,YAAI,MAAM,oBAAoB;AAC9B,YAAI,MAAM,IAAI,UAAU;AACxB,YAAI,MAAM,cAAc,OAAO;AAC/B,YAAI,MAAM,MAAM,uBAAuB;AAAA,MACzC;AAGA,UAAI,IAAI,OAAO,iBAAiB;AAC9B,YAAI,OAAO,gBAAgB,UAAU,WAAW;AAAA,MAClD;AAMA,UAAK,IAAY,YAAY;AAC1B,YAAY,WAAW,OAAO;AAAA,MACjC;AAEA,iBAAW,MAAM;AACf,cAAM,eAAe,SAAS,uBAAuB,aAAa;AAClE,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,uBAAa,CAAC,EAAE,OAAA;AAAA,QAClB;AAAA,MACF,GAAG,GAAG;AASN,WAAK,UAAU,GAAG;AAAA,IACpB;AAWA,cAAU,MAAM;AACd,iBAAA;AAAA,IACF,CAAC;AAED,gBAAY,MAAM;AAChB,UAAI,KAAK;AACP,YAAI,QAAA;AACJ,cAAM;AAAA,MACR;AAAA,IAEF,CAAC;;0BAtHCA,mBAAoD,OAAA;AAAA,QAA9C,IAAI,UAAA;AAAA,QAAW,OAAM;AAAA,MAAA;;;;;;;;;;;;;;;;AC+D7B,UAAM,OAAO;AAMb,UAAM,cAAc,IAAI,KAAK;AAE7B,UAAM,iBAAiB,MAAM;AAC3B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AACA,UAAM,eAAe,CAAC,SAAiB;AACrC,WAAK,gBAAgB,IAAI;AAAA,IAC3B;AACA,UAAM,YAAY,MAAM;AACtB,WAAK,OAAO;AAAA,IACd;AAUA,UAAM,eAA2B;AAAA,MAC/B;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,iBAAiB;AAAA;AAAA,MAAA;AAAA,MAEvC;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,kBAAkB;AAAA;AAAA,MAAA;AAAA,MAExC;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,iBAAiB;AAAA;AAAA,MAAA;AAAA,MAEvC;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,YAAY,qBAAqB;AAAA;AAAA,MAAA;AAAA,IACjD;AAGF,UAAM,YAAwB;AAAA,MAC5B;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,eAAe;AAAA;AAAA,QACnC,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,UAAU;AAAA;AAAA,QAC9B,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,YAAY,iBAAiB;AAAA;AAAA,QAC3C,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,WAAW;AAAA;AAAA,QAC/B,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,cAAc,WAAW;AAAA;AAAA,QACvC,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,CAAC,MAAM,WAAW;AAAA;AAAA,QAC/B,UAAU;AAAA,MAAA;AAAA,IACZ;;0BAhJAA,mBA+CM,OAAA;AAAA,QA/CD,OAAKC,eAAA,CAAC,iBAAe,EAAA,WAAsB,YAAA,OAAW,CAAA;AAAA,MAAA;QAEzDC,mBAQM,OAAA;AAAA,UARD,OAAM;AAAA,UAAgB,SAAO;AAAA,QAAA;UAChCA,mBAME,KAAA;AAAA,YALC,OAAKD,eAAA;AAAA;;cAA0D,YAAA,QAAW,oBAAA;AAAA,YAAA;;;QAQ/EE,eAAAD,mBAkCM,OAlCNE,cAkCM;AAAA,UAhCJF,mBAUM,OAVNG,cAUM;AAAA,0BATJL,mBAQMM,UAAA,MAAAC,WAPW,cAAY,CAApB,SAAI;qBADbL,mBAQM,OAAA;AAAA,gBANH,KAAK,KAAK;AAAA,gBACX,OAAM;AAAA,gBACL,OAAO,KAAK;AAAA,gBACZ,SAAK,CAAA,WAAE,aAAa,KAAK,IAAI;AAAA,cAAA;gBAE9BA,mBAA+B,KAAA;AAAA,kBAA3B,OAAKD,eAAE,KAAK,WAAW;AAAA,gBAAA;;;;oCAI/BC,mBAAuB,OAAA,EAAlB,OAAM,UAAA,GAAS,MAAA,EAAA;AAAA,UAGpBA,mBAgBM,OAhBNM,cAgBM;AAAA,0BAfJR,mBASMM,UAAA,MAAAC,WARW,WAAS,CAAjB,SAAI;qBADbL,mBASM,OAAA;AAAA,gBAPH,KAAK,KAAK;AAAA,gBACX,uBAAM,aAAW,EAAA,QACC,2BAAmB,KAAK,SAAA,CAAQ,CAAA;AAAA,gBACjD,OAAO,KAAK;AAAA,gBACZ,SAAK,CAAA,WAAE,aAAa,KAAK,IAAI;AAAA,cAAA;gBAE9BA,mBAA+B,KAAA;AAAA,kBAA3B,OAAKD,eAAE,KAAK,WAAW;AAAA,gBAAA;;;sCAE7BC,mBAAuB,OAAA,EAAlB,OAAM,UAAA,GAAS,MAAA,EAAA;AAAA,YAEpBA,mBAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAAY,OAAM;AAAA,cAAQ,SAAO;AAAA,YAAA;cAC1CA,mBAAmC,KAAA,EAAhC,OAAM,wBAAA,GAAuB,MAAA,EAAA;AAAA,YAAA;;;mBA/BF,YAAA,KAAW;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoBnD,UAAM,QAAQ;AAQd,UAAM,OAAO;AAKb,UAAM,eAAe,IAAI,KAAK;AAC9B,UAAM,cAAc,MAAM;AAAE,mBAAa,QAAQ,CAAC,aAAa;AAAA,IAAO;AACtE,UAAM,UAAU,CAAC,WAAmB;AAAE,WAAK,iBAAiB,MAAM;AAAA,IAAG;AAWrE,UAAM,cAA4B;AAAA,MAChC;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAY;AAAA,MAAA;AAAA,MAEd;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,MAAA;AAAA,MAEd;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAY;AAAA,MAAA;AAAA,MAEd;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAY;AAAA,MAAA;AAAA,IACd;AAGF,UAAM,WAAW,CAAC,SAChB,KAAK,aAAa,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI;AAE/C,UAAM,WAAW,CAAC,SAChB,SAAS,IAAI,KAAK,KAAK,cAAc,KAAK,cAAc,KAAK;;;QA3F7DA,mBAEM,OAAA;AAAA,UAFD,OAAM;AAAA,UAAgB,OAAM;AAAA,UAAQ,SAAO;AAAA,QAAA;UAC9CA,mBAAuB,KAAA,EAApB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,QAAA;QAItBO,YAmBaC,YAAA,EAnBD,MAAK,iBAAa;AAAA,2BAC5B,MAiBM;AAAA,YAjBK,aAAA,SAAXC,UAAA,GAAAX,mBAiBM,OAjBNI,cAiBM;AAAA,cAhBJF,mBAGM,OAHNG,cAGM;AAAA,gBAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAH,mBAAiB,cAAX,QAAI,EAAA;AAAA,gBACVA,mBAAkE,KAAA;AAAA,kBAA/D,OAAM;AAAA,kBAA0B,+CAAO,aAAA,QAAY;AAAA,gBAAA;;cAExDA,mBAWM,OAXNU,cAWM;AAAA,8BAVJZ,mBASMM,UAAA,MAAAC,WARW,aAAW,CAAnB,SAAI;yBADbL,mBASM,OAAA;AAAA,oBAPH,KAAK,KAAK;AAAA,oBACX,OAAKD,eAAA,CAAC,cAAY,EAAA,QACA,SAAS,IAAI,EAAA,CAAA,CAAA;AAAA,oBAC9B,SAAK,CAAA,WAAE,QAAQ,KAAK,MAAM;AAAA,kBAAA;oBAE3BC,mBAAgC,KAAA;AAAA,sBAA5B,OAAKD,eAAA,CAAA,MAAS,KAAK,IAAI,CAAA;AAAA,oBAAA;oBAC3BC,mBAAiC,QAAA,MAAAW,gBAAxB,SAAS,IAAI,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;;;;;;ACdzB,SAAS,SAAS;AACvB,QAAM,SAAS,OAAO;AAGtB,QAAM,SAAS,WAA8B,IAAI;AAGjD,QAAM,eAAe,WAA6C,IAAI;AACtE,QAAM,eAAe,WAA6C,IAAI;AAGtE,QAAM,kBAAkB,IAAS,IAAI;AAGrC,QAAM,oBAAoB,IAAsD,IAAI;AAKpF,WAAS,QAAQ,KAAiB;AAChC,WAAO,QAAQ;AAGf,UAAM,SAAS,IAAI,OAAO,MAAM,aAAA;AAChC,QAAI,SAAS,MAAM;AACnB,iBAAa,QAAQ;AAGrB,UAAM,SAAS,IAAI,OAAO,MAAM,aAAA;AAChC,QAAI,SAAS,MAAM;AACnB,iBAAa,QAAQ;AAGrB,QAAI,GAAG,OAAO,UAAU,OAAO,CAAC,UAAe;AAC7C,UAAI,MAAM,QAAQ;AAChB,0BAAkB,QAAQ,MAAM;AAAA,MAClC,WAAW,MAAM,WAAW;AAC1B,cAAM,QAAQ,OAAO,UAAU,MAAM,wBAAwB,MAAM,SAAS;AAC5E,0BAAkB,QAAQ;AAAA,UACxB,KAAK,OAAO,KAAK,UAAU,MAAM,SAAS;AAAA,UAC1C,KAAK,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,UACzC,KAAK,MAAM,SAAS,IAAI,MAAM,SAAS;AAAA,QAAA;AAAA,MAE3C;AAAA,IACF,CAAC;AAGD,WAAO,GAAG,OAAO,UAAU,OAAO,CAAC,UAAe;AAChD,sBAAgB,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,GAAG,OAAO,UAAU,WAAW,CAAC,UAAe;AACpD,UAAI,CAAC,gBAAgB,OAAO;AAC1B,wBAAgB,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF,CAAC;AACD,WAAO,GAAG,OAAO,UAAU,UAAU,CAAC,UAAe;AACnD,UAAI,gBAAgB,UAAU,MAAM,SAAS;AAC3C,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAKA,WAAS,aAAa;AACpB,QAAI,OAAO,OAAO;AAChB,aAAO,MAAM,QAAA;AACb,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAKA,WAAS,WAAW,SAAc;;AAChC,uBAAa,UAAb,mBAAoB,WAAW;AAAA,EACjC;AAKA,WAAS,SAAS,OAAY;;AAC5B,iBAAO,UAAP,mBAAc,SAAS;AAAA,EACzB;AAEA,SAAO;AAAA;AAAA,IAEL,KAAK;AAAA;AAAA,IAEL;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACtGO,SAAS,WAAW,YAA0B;AACnD,QAAM,eAAe,WAAwC,IAAI;AAGjE,WAAS,cAAc;AACrB,UAAM,MAAM,WAAW,IAAI;AAC3B,UAAM,QAAQ,WAAW,aAAa;AACtC,QAAI,CAAC,OAAO,CAAC,MAAO;AAEpB,UAAM,IAAI,IAAI,OAAO,MAAM,QAAQ,EAAE,cAAc,OAAc;AACjE,QAAI,SAAS,CAAC;AACd,iBAAa,QAAQ;AAAA,EACvB;AAGA,WAAS,gBAAgB,OAA6B;;AACpD,uBAAa,UAAb,mBAAoB,SAAS;AAAA,MAC3B,OAAO,EAAE,OAAO,WAAW,OAAO,GAAG,GAAG,MAAA;AAAA,IAAM;AAAA,EAElD;AAGA,WAAS,YAAY,OAA6B;;AAChD,uBAAa,UAAb,mBAAoB,KAAK;AAAA,MACvB,OAAO,EAAE,OAAO,WAAW,SAAS,KAAK,GAAG,MAAA;AAAA,IAAM;AAAA,EAEtD;AAGA,WAAS,cAAc,OAA6B;;AAClD,uBAAa,UAAb,mBAAoB,OAAO;AAAA,MACzB,OAAO,EAAE,OAAO,WAAW,OAAO,GAAG,GAAG,MAAA;AAAA,IAAM;AAAA,EAElD;AAGA,WAAS,aAAa,OAA6B;;AACjD,uBAAa,UAAb,mBAAoB,MAAM;AAAA,MACxB,OAAO,EAAE,OAAO,WAAW,OAAO,GAAG,GAAG,MAAA;AAAA,IAAM;AAAA,EAElD;AAGA,WAAS,eAAe;;AACtB,uBAAa,UAAb,mBAAoB;AACpB,qBAAW,aAAa,UAAxB,mBAA+B;AAAA,EACjC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACvDO,SAAS,QAAQ,YAA0B;AAChD,QAAM,cAAc,WAAgB,IAAI;AAExC,QAAM,iBAAiB,IAAqB,IAAI;AAGhD,WAAS,WAAW;AAClB,WAAO,WAAW,aAAa;AAAA,EACjC;AAGA,WAAS,UAAU,MAAc,OAA4B,UAAoB;AAC/E,UAAM,QAAQ,SAAA;AACd,QAAI,CAAC,MAAO;AACZ,aAAA;AACA,gBAAY,QAAQ,MAAM,UAAU,EAAE,MAAM,OAAO;AACnD,mBAAe,QAAQ;AAAA,EACzB;AAGA,WAAS,UAAU,OAA6B;AAC9C,cAAU,SAAS,EAAE,WAAW,IAAI,OAAO,WAAW,GAAG,MAAA,GAAS,OAAO;AAAA,EAC3E;AAGA,WAAS,SAAS,OAA6B;AAC7C,cAAU,YAAY,EAAE,OAAO,GAAG,OAAO,WAAW,GAAG,MAAA,GAAS,UAAU;AAAA,EAC5E;AAGA,WAAS,YAAY,OAA6B;AAChD,cAAU,WAAW,EAAE,OAAO,WAAW,SAAS,KAAK,GAAG,MAAA,GAAS,SAAS;AAAA,EAC9E;AAGA,WAAS,WAAW,OAA6B;AAC/C,cAAU,UAAU,EAAE,QAAQ,KAAM,OAAO,WAAW,SAAS,KAAK,GAAG,MAAA,GAAS,QAAQ;AAAA,EAC1F;AAGA,WAAS,cAAc,OAA6B;AAClD,cAAU,aAAa,EAAE,OAAO,WAAW,SAAS,KAAK,GAAG,MAAA,GAAS,WAAW;AAAA,EAClF;AAGA,WAAS,gBAAgB,OAA6B;AACpD;AAAA,MACE;AAAA,MACA,EAAE,OAAO,WAAW,SAAS,KAAK,eAAe,MAAM,GAAG,MAAA;AAAA,MAC1D;AAAA,IAAA;AAAA,EAEJ;AAGA,WAAS,WAAW;;AAClB,QAAI,YAAY,OAAO;AACrB,qBAAA,MAAA,mBAAY;AACZ,kBAAY,QAAQ;AAAA,IACtB;AACA,mBAAe,QAAQ;AAAA,EACzB;AAGA,WAAS,YAAY;;AACnB,aAAA;AACA,mBAAA,MAAA,mBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AChFO,SAAS,UAAU,YAA0B;AAElD,QAAM,kBAAkB,IAAI,KAAK;AACjC,QAAM,oBAAoB,IAAI,KAAK;AACnC,QAAM,iBAAiB,IAAI,KAAK;AAChC,QAAM,cAAc,IAAI,KAAK;AAG7B,QAAM,cAAc,WAA4C,IAAI;AACpE,QAAM,kBAAkB,WAAgD,IAAI;AAC5E,QAAM,eAAe,WAA6C,IAAI;AACtE,MAAI,oBAAyB;AAG7B,WAAS,SAAS;AAChB,WAAO,WAAW,IAAI;AAAA,EACxB;AAGA,WAAS,kBAAkB;AACzB,UAAM,MAAM,OAAA;AACZ,QAAI,CAAC,IAAK;AAEV,QAAI,YAAY,OAAO;AACrB,UAAI,YAAY,MAAM,SAAS;AAC7B,oBAAY,MAAM,KAAA;AAAA,MACpB;AACA,UAAI,YAAY,YAAY,KAAK;AACjC,kBAAY,QAAQ;AACpB,sBAAgB,QAAQ;AACxB;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,UAAA;AACnB,UAAM,KAAK,IAAI,OAAO,MAAM,YAAY,EAAE,UAAU,KAAM,MAAM,IAAI;AACpE,QAAI,SAAS,EAAE;AACf,OAAG,MAAM,MAAM;AACf,gBAAY,QAAQ;AACpB,oBAAgB,QAAQ;AAAA,EAC1B;AAGA,WAAS,QAAQ;AACf,UAAM,MAAM,OAAA;AACZ,QAAI,CAAC,IAAK;AAEV,gBAAY,QAAQ;AACpB,UAAM,OAAO,MAAM,WAAW,MAAM;AAAE,kBAAY,QAAQ;AAAA,IAAO,GAAG,GAAI;AAExE,UAAM,MAAM,WAAW,kBAAkB;AACzC,QAAI,KAAK;AACP,YAAM,SAAS,EAAE,GAAG,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,IAAA;AACtD,UAAI,cAAc,QAAQ,EAAE,UAAU,GAAG,UAAU,MAAM;AAAA,IAC3D,OAAO;AACL,UAAI,QAAQ,EAAE,UAAU,EAAA,CAAG;AAC3B,WAAA;AAAA,IACF;AAAA,EACF;AAGA,WAAS,oBAAoB;AAC3B,UAAM,MAAM,OAAA;AACZ,QAAI,CAAC,IAAK;AAEV,QAAI,CAAC,gBAAgB,OAAO;AAC1B,YAAM,OAAO,IAAI,OAAO,MAAM,gBAAgB,CAAA,CAAE;AAChD,UAAI,SAAS,IAAI;AACjB,0BAAoB,IAAI,cAAA;AACxB,WAAK,UAAU;AACf,sBAAgB,QAAQ;AACxB,wBAAkB,QAAQ;AAAA,IAC5B,OAAO;AACL,YAAM,OAAO,gBAAgB;AAC7B,WAAK,UAAU,CAAC,KAAK;AACrB,wBAAkB,QAAQ,KAAK;AAC/B,UAAI,CAAC,KAAK,WAAW,mBAAmB;AACtC,YAAI,cAAc,mBAAmB,EAAE,UAAU,GAAG;AAAA,MACtD,WAAW,KAAK,SAAS;AACvB,4BAAoB,IAAI,cAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,WAAS,yBAAyB;AAChC,UAAM,MAAM,OAAA;AACZ,QAAI,CAAC,IAAK;AAEV,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,OAAO,IAAI,OAAO,MAAM,aAAa,CAAA,CAAE;AAC7C,UAAI,SAAS,IAAI;AACjB,WAAK,UAAU;AACf,mBAAa,QAAQ;AACrB,qBAAe,QAAQ;AAAA,IACzB,OAAO;AACL,YAAM,OAAO,aAAa;AAC1B,WAAK,UAAU,CAAC,KAAK;AACrB,qBAAe,QAAQ,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;;;;AC3CA,UAAM,OAAO;AAMb,UAAM,SAAS,OAAA;AACf,UAAM,UAAU,WAAW,MAAM;AACjC,UAAM,OAAO,QAAQ,MAAM;AAC3B,UAAM,SAAS,UAAU,MAAM;AAG/B,YAAQ,cAAc,MAAM;AAC5B,YAAQ,kBAAkB,OAAO;AACjC,YAAQ,eAAe,IAAI;AAC3B,YAAQ,iBAAiB,MAAM;AAG/B,aAAS,UAAU,KAAU;AAC3B,aAAO,QAAQ,GAAG;AAClB,cAAQ,YAAA;AACR,WAAK,UAAU,GAAG;AAAA,IACpB;AAOA,aAAS,mBAAmB,MAAc;AACxC,cAAQ,MAAA;AAAA,QACN,KAAK;AAAoB,kBAAQ,gBAAA;AAAmB;AAAA,QACpD,KAAK;AAAoB,kBAAQ,YAAA;AAAe;AAAA,QAChD,KAAK;AAAoB,kBAAQ,cAAA;AAAiB;AAAA,QAClD,KAAK;AAAoB,kBAAQ,aAAA;AAAgB;AAAA,QACjD,KAAK;AAAoB,eAAK,UAAA;AAAa;AAAA,QAC3C,KAAK;AAAoB,eAAK,SAAA;AAAY;AAAA,QAC1C,KAAK;AAAoB,eAAK,YAAA;AAAe;AAAA,QAC7C,KAAK;AAAoB,eAAK,WAAA;AAAc;AAAA,QAC5C,KAAK;AAAoB,eAAK,cAAA;AAAiB;AAAA,QAC/C,KAAK;AAAoB,eAAK,gBAAA;AAAmB;AAAA,MAAA;AAAA,IAErD;AAEA,aAAS,cAAc;AACrB,cAAQ,aAAA;AACR,WAAK,UAAA;AAAA,IACP;AAKA,aAAS,oBAAoB,QAAgB;AAC3C,cAAQ,QAAA;AAAA,QACN,KAAK;AAAqB,iBAAO,gBAAA;AAAmB;AAAA,QACpD,KAAK;AAAqB,iBAAO,MAAA;AAAS;AAAA,QAC1C,KAAK;AAAqB,iBAAO,kBAAA;AAAqB;AAAA,QACtD,KAAK;AAAqB,iBAAO,uBAAA;AAA0B;AAAA,MAAA;AAAA,IAE/D;AAGA,aAAa;AAAA,MACX,KAAK,OAAO;AAAA,MACZ,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,iBAAiB,OAAO;AAAA,MACxB,mBAAmB,OAAO;AAAA,MAC1B,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;;AApIC,aAAAF,UAAA,GAAAX,mBA4BM,OA5BNI,cA4BM;AAAA,QA1BJK,YAIEK,aAAA;AAAA,UAHC,KAAK,QAAA;AAAA,UACL,WAAS,QAAA;AAAA,UACT,UAAQ;AAAA,QAAA;SAKF,QAAA,4BADTC,YAKE,cAAA;AAAA;UAHC,oBAAkBC,MAAA,IAAA,EAAK,eAAe;AAAA,UACtC,gBAAe;AAAA,UACf,SAAO;AAAA,QAAA;SAKD,QAAA,2BADTD,YAOE,aAAA;AAAA;UALC,qBAAmBC,MAAA,MAAA,EAAO,gBAAgB;AAAA,UAC1C,iBAAeA,MAAA,MAAA,EAAO,YAAY;AAAA,UAClC,uBAAqBA,MAAA,MAAA,EAAO,kBAAkB;AAAA,UAC9C,4BAA0BA,MAAA,MAAA,EAAO,eAAe;AAAA,UAChD,iBAAgB;AAAA,QAAA;QAInBC,WAAQ,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,MAAA;;;;;ACvBZ,MAAM,gBAAqD;AAAA,EACzD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAS;AACX;AAEA,IAAIC,eAAa;AAEV,SAAS,aAAa,QAAsB;AAEjD,QAAM,WAAW,WAA6C,IAAI;AAGlE,QAAM,UAAU,IAAe,EAAE;AAGjC,QAAM,cAAc,IAAmB,IAAI;AAG3C,WAAS,eAAe;AACtB,UAAM,MAAM,OAAO,IAAI;AACvB,QAAI,CAAC,IAAK;AAEV,UAAM,QAAQ,IAAI,OAAO,MAAM,aAAA;AAC/B,QAAI,SAAS,KAAK;AAClB,aAAS,QAAQ;AAGjB,UAAM,GAAG,OAAO,UAAU,OAAO,CAAC,MAAW;;AAC3C,YAAM,SAAQ,aAAE,YAAF,mBAAW,SAAX,mBAAiB;AAC/B,UAAI,iBAAiB,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,WAAS,OAAO,QAAyC;AACvD,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,KAAK,OAAOA,cAAY;AAG9B,UAAM,UAAU,IAAI,OAAO,QAAQ,gBAAgB;AAAA,MACjD,UAAU,CAAC,OAAO,KAAK,OAAO,KAAK,OAAO,GAAG;AAAA,MAC7C,OAAO;AAAA,QACL,OAAO,cAAc,OAAO,QAAQ;AAAA,QACpC,OAAO;AAAA,QACP,kBAAkB,OAAO,OAAO,iBAAiB;AAAA,QACjD,gBAAgB,OAAO,OAAO,eAAe;AAAA,QAC7C,eAAe;AAAA;AAAA,QAEf,OAAO;AAAA,UACL,MAAM,OAAO;AAAA,UACb,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS;AAAA,UACT,cAAc;AAAA,UACd,cAAc;AAAA,UACd,aAAa,IAAI,OAAO,OAAO,WAAW,GAAG,GAAG;AAAA,UAChD,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA;AAAA,MAGF,OAAO,eAAe,MAAM;AAAA,MAC5B,MAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAA;AAAA,IAAK,CACtC;AAED,UAAM,WAAW,OAAO;AAExB,UAAM,MAAe,EAAE,GAAG,QAAQ,IAAI,QAAA;AACtC,YAAQ,MAAM,KAAK,GAAG;AACtB,WAAO;AAAA,EACT;AAGA,WAAS,UAAU,IAAY;;AAC7B,UAAM,MAAM,QAAQ,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,QAAI,QAAQ,GAAI;AAEhB,UAAM,MAAM,QAAQ,MAAM,GAAG;AAC7B,QAAI,aAAW,cAAS,UAAT,mBAAgB,cAAc,IAAI;AACjD,YAAQ,MAAM,OAAO,KAAK,CAAC;AAE3B,QAAI,YAAY,UAAU,GAAI,aAAY,QAAQ;AAAA,EACpD;AAGA,WAAS,UAAU,IAAY,QAAQ,OAAO;AAC5C,gBAAY,QAAQ;AACpB,UAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,QAAI,CAAC,IAAK;AAGV,YAAQ,MAAM,QAAQ,CAAC,MAAM;AAC3B,UAAI,EAAE,SAAS;AACb,UAAE,QAAQ,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAM;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,QAAI,gBAAgB,EAAE;AAAA,EACxB;AAGA,WAAS,cAAc,IAAY,SAAiB;;AAClD,UAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,QAAI,CAAC,IAAK;AAEV,QAAI,OAAO;AAGX,QAAI,IAAI,SAAS;AACf,UAAI,QAAQ,OAAO,EAAE,GAAG,IAAI,QAAQ,MAAM,MAAM,QAAA;AAChD,UAAI,QAAQ,QAAQ,eAAe,GAAG;AAEtC,WAAI,SAAI,QAAQ,UAAZ,mBAAmB,OAAO;AAC5B,YAAI,QAAQ,MAAM,MAAM,OAAO;AAAA,MACjC;AACA,sBAAI,SAAQ,eAAZ;AAAA,IACF;AAAA,EACF;AAGA,WAAS,SAAS,IAAY;AAC5B,UAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,QAAI,CAAC,OAAO,CAAC,OAAO,IAAI,MAAO;AAE/B,UAAM,MAAM,OAAO,IAAI;AAGvB,UAAM,UAAU,IAAI,MAAM,IAAI,IAAI,MAAM;AACxC,UAAM,SAAS,UAAU;AAGzB,QAAI,cAAc,EAAE,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,OAAA,GAAU,EAAE,UAAU,KAAK;AAAA,EAClF;AAGA,WAAS,WAAW;;AAClB,mBAAS,UAAT,mBAAgB;AAChB,YAAQ,QAAQ,CAAA;AAChB,gBAAY,QAAQ;AAAA,EACtB;AAGA,QAAM,YAAY,IAAI,KAAK;AAC3B,MAAI,gBAA2C;AAE/C,WAAS,cACP,SACA,cAAc,OACd,WAAgC,WAChC;AACA,UAAM,MAAM,OAAO,IAAI;AACvB,QAAI,CAAC,IAAK;AAEV,QAAI,UAAU,OAAO;AAEnB,UAAI,eAAe;AACjB,YAAI,IAAI,OAAO,UAAU,OAAO,aAAa;AAC7C,wBAAgB;AAAA,MAClB;AACA,gBAAU,QAAQ;AAAA,IACpB,OAAO;AAEL,gBAAU,QAAQ;AAClB,sBAAgB,CAAC,MAAW;AAE1B,YAAI,KAAa,KAAa;AAE9B,YAAI,EAAE,QAAQ;AACZ,gBAAM,EAAE,OAAO;AACf,gBAAM,EAAE,OAAO;AACf,gBAAM,EAAE,OAAO,OAAO;AAAA,QACxB,WAAW,EAAE,WAAW;AACtB,gBAAM,QAAQ,OAAO,OAAO,aAAa,cAAc,EAAE,SAAS;AAClE,gBAAM,OAAO,OAAO,KAAK,UAAU,MAAM,SAAS;AAClD,gBAAM,OAAO,OAAO,KAAK,UAAU,MAAM,QAAQ;AACjD,gBAAM,MAAM,SAAS,IAAI,MAAM,SAAS;AAAA,QAC1C,OAAO;AACL;AAAA,QACF;AAGA,cAAM,WAAW,MAAM,IAAI,MAAM;AAEjC,cAAM,MAAM,OAAO;AAAA,UACjB,MAAM,GAAG,WAAW,IAAIA,YAAU;AAAA,UAClC;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QAAA,CACD;AACD,YAAI,wCAAe;AAEnB,sBAAA;AAAA,MACF;AACA,UAAI,GAAG,OAAO,UAAU,OAAO,aAAa;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAGA,SAAS,eAAe,KAAsC;AAC5D,SAAO;AAAA;AAAA,mFAE0E,IAAI,IAAI;AAAA;AAAA,kBAEzE,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,kBAClB,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,kBAClB,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,UAC1B,IAAI,cAAc,gCAAgC,IAAI,WAAW,WAAW,EAAE;AAAA;AAAA;AAAA;AAIxF;;;;ACxOA,UAAM,SAAS,OAAqB,YAAY;AAChD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAGzE,UAAM,MAAM,aAAa,MAAM;AAI/B,UAAM,YAAY;AAAA,MAChB,MAAM,OAAO,IAAI;AAAA,MACjB,CAAC,QAAQ;AACP,YAAI,KAAK;AACP,cAAI,aAAA;AACJ,oBAAA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAGpB,gBAAY,MAAM;AAChB,UAAI,SAAA;AAAA,IACN,CAAC;AAGD,YAAQ,cAAc,GAAG;AAGzB,aAAa,GAAG;;aApCdD,WAAQ,KAAA,QAAA,SAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqJV,UAAM,MAAM,OAA2B,YAAY;AACnD,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0CAA0C;AAGpE,UAAM,cAAc,IAAI,IAAI;AAC5B,UAAM,iBAAiB,MAAM;AAC3B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAGA,UAAM,UAAU,IAAwB,IAAI;AAC5C,UAAM,aAAa,IAAI,KAAK;AAG5B,UAAM,MAAM,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI;AAErC,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,QAAQ;AACZ,QAAI,QAAQ;AAEZ,aAAS,UAAU,GAAe;AAChC,iBAAW,QAAQ;AACnB,mBAAa,EAAE;AACf,mBAAa,EAAE;AACf,cAAQ,IAAI;AACZ,cAAQ,IAAI;AAEZ,eAAS,iBAAiB,aAAa,MAAM;AAC7C,eAAS,iBAAiB,WAAW,QAAQ;AAAA,IAC/C;AAEA,aAAS,OAAO,GAAe;AAC7B,UAAI,CAAC,WAAW,MAAO;AACvB,UAAI,IAAI,SAAS,EAAE,UAAU;AAC7B,UAAI,IAAI,SAAS,EAAE,UAAU;AAAA,IAC/B;AAEA,aAAS,WAAW;AAClB,iBAAW,QAAQ;AACnB,eAAS,oBAAoB,aAAa,MAAM;AAChD,eAAS,oBAAoB,WAAW,QAAQ;AAAA,IAClD;AAGA,UAAM,aAAa;AAAA,MACjB,EAAE,OAAO,OAAO,OAAO,MAAM,MAAM,WAAW,OAAO,OAAA;AAAA,MACrD,EAAE,OAAO,WAAW,OAAO,MAAM,MAAM,iBAAiB,OAAO,UAAA;AAAA,MAC/D;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,EAAE,OAAO,QAAQ,OAAO,MAAM,MAAM,kBAAkB,OAAO,UAAA;AAAA,IAAU;AAGzE,UAAM,iBAAiB,IAAY,KAAK;AAExC,UAAM,eAAe,SAAS,MAAM;AAClC,UAAI,eAAe,UAAU,MAAO,QAAO,IAAI,QAAQ;AACvD,aAAO,IAAI,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,eAAe,KAAK;AAAA,IAC5E,CAAC;AAED,UAAM,mBAAmB,CAAC,QAA6B;AACrD,YAAM,MAA8B;AAAA,QAClC,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAER,aAAO,IAAI,GAAG,KAAK;AAAA,IACrB;AAGA,UAAM,cAAc,IAAyB,SAAS;AAEtD,aAAS,YAAY;AACnB,UAAI;AAAA,QACF;AAAA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,IAEhB;AAGA,aAAS,SAAS,IAAY;AAC5B,UAAI,UAAU,IAAI,IAAI;AAAA,IACxB;AAEA,aAAS,QAAQ,IAAY;AAC3B,UAAI,SAAS,EAAE;AAAA,IACjB;AAEA,aAAS,SAAS,IAAY;AAC5B,UAAI,UAAU,EAAE;AAAA,IAClB;AAGA,UAAM,YAAY,IAAmB,IAAI;AACzC,UAAM,WAAW,IAAI,EAAE;AACvB,UAAM,cAAc,IAA6B,IAAI;AAErD,aAAS,UAAU,MAAe;AAChC,gBAAU,QAAQ,KAAK;AACvB,eAAS,QAAQ,KAAK;AAEtB,iBAAW,MAAA;;AAAM,iCAAY,UAAZ,mBAAmB;AAAA,SAAU,EAAE;AAAA,IAClD;AAEA,aAAS,WAAW;AAClB,UAAI,UAAU,SAAS,SAAS,MAAM,QAAQ;AAC5C,YAAI,cAAc,UAAU,OAAO,SAAS,MAAM,MAAM;AAAA,MAC1D;AACA,iBAAA;AAAA,IACF;AAEA,aAAS,aAAa;AACpB,gBAAU,QAAQ;AAClB,eAAS,QAAQ;AAAA,IACnB;AAEA,aAAS,eAAe;AACtB,UAAI,OAAO,QAAQ,UAAU,IAAI,QAAQ,MAAM,MAAM,OAAO,GAAG;AAC7D,YAAI,SAAA;AAAA,MACN;AAAA,IACF;;0BAzREjB,mBAoJM,OAAA;AAAA,iBAnJA;AAAA,QAAJ,KAAI;AAAA,QACJ,OAAKC,eAAA,CAAC,aAAW,EAAA,WACI,YAAA,MAAA,CAAW,CAAA;AAAA,QAC/B,OAAKkB;AAAAA,WAAW,YAAA,QAA+B,EAAA,MAAA,IAAI,IAAC,MAAA,KAAc,IAAI,IAAC,SAA6B,EAAA,MAAA,IAAI,IAAC,MAAA,KAAc,IAAI,IAAC,KAAA;AAAA,QAAA;AAAA;QAO7HjB,mBAuBM,OAAA;AAAA,UAtBJ,OAAKD,eAAA,CAAC,qBAAmB,EAAA,eACA,WAAA,MAAA,CAAU,CAAA;AAAA,UAClC,2BAAmB,WAAS,CAAA,SAAA,CAAA;AAAA,UAC5B,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,WAAA,QAAU,OAAU,eAAA;AAAA,QAAc;UAG1B,YAAA,SACdU,UAAA,GAAAX,mBAKM,OALNI,cAKM;AAAA,sCAJJF,mBAA6C,KAAA,EAA1C,OAAM,kCAAA,GAAiC,MAAA,EAAA;AAAA,YAC1CA,mBAES,QAFTG,cAESQ,gBADP,aAAA,MAAa,MAAM,GAAA,CAAA;AAAA,UAAA,oBAIzBb,mBAOWM,UAAA,EAAA,KAAA,KAAA;AAAA,YANTJ,mBAIO,QAJPU,cAIO;AAAA,wCAHLV,mBAA8B,KAAA,EAA3B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,wDAAG,cAE9B,EAAA;AAAA,cAAAA,mBAAwD,QAAxDM,cAAwDK,gBAA7B,aAAA,MAAa,MAAM,GAAA,CAAA;AAAA,YAAA;sCAEhDX,mBAA8C,KAAA,EAA3C,OAAM,sCAAkC,MAAA,EAAA;AAAA,UAAA;;QAI/CC,eAAAD,mBA+GM,OA/GNkB,cA+GM;AAAA,UA7GJlB,mBAgBM,OAhBNmB,cAgBM;AAAA,YAfJnB,mBAOS,UAAA;AAAA,cANP,uBAAM,OAAK,EAAA,eACcc,WAAI,UAAU,MAAA,CAAK,CAAA;AAAA,cAC3C,SAAO;AAAA,YAAA;cAERd,mBAAmE,KAAA;AAAA,gBAA/D,OAAKD,eAAA,CAAA,MAASe,MAAA,GAAA,EAAI,UAAU,QAAK,aAAA,SAAA,CAAA;AAAA,cAAA;cAA8BM,gBAAA,MACnET,gBAAGG,MAAA,GAAA,EAAI,UAAU,QAAK,SAAA,QAAA,GAAA,CAAA;AAAA,YAAA;YAExBd,mBAMS,UAAA;AAAA,cALP,OAAM;AAAA,cACL,SAAO;AAAA,cACP,UAAUc,MAAA,GAAA,EAAI,QAAQ,MAAM,WAAM;AAAA,YAAA;cAEnCd,mBAA2B,KAAA,EAAxB,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,8BAAG,QAC7B,EAAA;AAAA,YAAA;;UAIFA,mBAWM,OAXNqB,cAWM;AAAA,0BAVJvB,mBASOM,UAAA,MAAAC,WARS,YAAU,CAAjB,QAAG;qBADZL,mBASO,QAAA;AAAA,gBAPJ,KAAK,IAAI;AAAA,gBACV,uBAAM,cAAY,EAAA,QACA,yBAAmB,IAAI,MAAA,CAAK,CAAA;AAAA,gBAC7C,SAAK,CAAA,WAAE,eAAA,QAAiB,IAAI;AAAA,cAAA;gBAE7BA,mBAA6D,KAAA;AAAA,kBAAzD,OAAKD,eAAA,CAAA,MAAS,IAAI,IAAI,CAAA;AAAA,kBAAI,OAAKkB,eAAA,EAAA,OAAW,IAAI,OAAK;AAAA,gBAAA;gCAAM,MAC7DN,gBAAG,IAAI,KAAK,GAAA,CAAA;AAAA,cAAA;;;UAKhBX,mBA2EM,OA3ENsB,eA2EM;AAAA,YA1EJf,YA+DkBgB,iBAAA,EA/DD,MAAK,cAAU;AAAA,+BAE5B,MAA4B;AAAA,kCAD9BzB,mBA6DMM,UAAA,MAAAC,WA5DW,aAAA,OAAY,CAApB,SAAI;sCADbP,mBA6DM,OAAA;AAAA,oBA3DH,KAAK,KAAK;AAAA,oBACX,OAAKC,eAAA,CAAC,YAAU,EAAA,oBACce,MAAA,GAAA,EAAI,YAAY,UAAU,KAAK,GAAA,CAAE,CAAA;AAAA,oBAC9D,SAAK,CAAA,WAAE,SAAS,KAAK,EAAE;AAAA,kBAAA;oBAGxBd,mBAGE,QAAA;AAAA,sBAFA,OAAM;AAAA,sBACL,OAAKiB,eAAA,EAAA,YAAgB,iBAAiB,KAAK,QAAQ,GAAA;AAAA,oBAAA;oBAGtDjB,mBAsBM,OAtBNwB,eAsBM;AAAA,sBAnBI,UAAA,UAAc,KAAK,kCAD3B1B,mBAQE,SAAA;AAAA;wBANA,OAAM;AAAA,qFACG,SAAQ,QAAA;AAAA,wBAChB,WAAO;AAAA,mCAAQ,UAAQ,CAAA,OAAA,CAAA;AAAA,mCACP,YAAU,CAAA,QAAA,CAAA;AAAA,wBAAA;AAAA,wBAC1B,iDAAD,MAAA;AAAA,wBAAA,GAAW,CAAA,MAAA,CAAA;AAAA;iCACP;AAAA,wBAAJ,KAAI;AAAA,sBAAA;qCAJK,SAAA,KAAQ;AAAA,sBAAA,mBAOnBA,mBAMM,OAAA;AAAA;wBAJJ,OAAM;AAAA,wBACL,YAAQ2B,cAAA,CAAA,WAAO,UAAU,IAAI,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA,GAE3Bd,gBAAA,KAAK,IAAI,GAAA,IAAAe,aAAA;AAAA,sBAEd1B,mBAEM,OAFN2B,eAEMhB,gBADD,KAAK,IAAI,QAAO,CAAA,CAAA,IAAM,OAAEA,gBAAG,KAAK,IAAI,QAAO,CAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;oBAKlDX,mBAsBM,OAtBN4B,eAsBM;AAAA,sBArBJ5B,mBAMS,UAAA;AAAA,wBALP,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,SAAKyB,cAAA,CAAA,WAAO,UAAU,IAAI,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAE3BzB,mBAA0B,KAAA,EAAvB,OAAM,eAAA,GAAc,MAAA,EAAA;AAAA,sBAAA;sBAEzBA,mBAMS,UAAA;AAAA,wBALP,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,SAAKyB,cAAA,CAAA,WAAO,QAAQ,KAAK,EAAE,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAE5BzB,mBAA8B,KAAA,EAA3B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,sBAAA;sBAE7BA,mBAMS,UAAA;AAAA,wBALP,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,SAAKyB,cAAA,CAAA,WAAO,SAAS,KAAK,EAAE,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAE7BzB,mBAAyB,KAAA,EAAtB,OAAM,cAAA,GAAa,MAAA,EAAA;AAAA,sBAAA;;;;;;;YAOnB,aAAA,MAAa,WAAM,KAA9BS,aAAAX,mBAOM,OAPN+B,eAOM;AAAA,0CANJ7B,mBAAyB,KAAA,EAAtB,OAAM,cAAA,GAAa,MAAA,EAAA;AAAA,cACtBA,mBAII,KAAA,MAAAW,gBAFAG,MAAA,GAAA,EAAI,UAAU,QAAK,gBAAA,QAAA,GAAA,CAAA;AAAA,YAAA;;;mBA1GS,YAAA,KAAW;AAAA,QAAA;;;;;;ACArD,IAAI,aAAa;AAEV,SAAS,SAAS,QAAsB;AAE7C,QAAM,aAAa,WAA6C,IAAI;AAGpE,QAAM,YAAY,IAAiB,EAAE;AAGrC,QAAM,gBAAgB,IAAmB,IAAI;AAG7C,QAAM,YAAY,IAAI,KAAK;AAC3B,QAAM,cAAc,IAAI,CAAC;AACzB,QAAM,gBAAgB,IAAI,CAAC;AAC3B,QAAM,mBAAmB,IAAI,CAAC;AAG9B,QAAM,iBAAiB,IAAI,KAAK;AAChC,QAAM,mBAAmB,IAAmB,IAAI;AAGhD,MAAI,gBAAuD;AAI3D,WAAS,iBAAiB;AACxB,UAAM,MAAM,OAAO,IAAI;AACvB,QAAI,CAAC,IAAK;AAEV,UAAM,QAAQ,IAAI,OAAO,MAAM,aAAA;AAC/B,QAAI,SAAS,KAAK;AAClB,eAAW,QAAQ;AAAA,EACrB;AAGA,WAAS,kBAAkB,OAAkB;AAC3C,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,MAAO,QAAO;AAGnB,UAAM,YAAY,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAA6B;AAE3F,UAAM,OAAO,IAAI,OAAO,QAAQ,kBAAkB;AAAA,MAChD;AAAA,MACA,OAAO;AAAA,QACL,OAAO,OAAO,OAAO,MAAM,mBAAmB,SAAS;AAAA,QACvD,OAAO;AAAA,QACP,SAAS;AAAA,QACT,eAAe;AAAA,MAAA;AAAA,MAEjB,MAAM,EAAE,SAAS,MAAM,GAAA;AAAA,IAAG,CAC3B;AAED,UAAM,WAAW,IAAI;AACrB,WAAO;AAAA,EACT;AAGA,WAAS,oBAAoB,OAAkB,SAAiB,OAAe;AAC7E,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,SAAS,SAAS,QAAS;AAEhC,UAAM,YAAY,MAAM,OAAO,MAAM,SAAS,QAAQ,CAAC,EACpD,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAA6B;AAE/D,UAAM,UAAU,IAAI,OAAO,QAAQ,kBAAkB;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,QACL,OAAO,OAAO,OAAO,MAAM,mBAAmB,SAAS;AAAA,QACvD,OAAO;AAAA,QACP,SAAS;AAAA,QACT,eAAe;AAAA,MAAA;AAAA,IACjB,CACD;AACD,UAAM,WAAW,OAAO;AAExB,QAAI,CAAC,MAAM,sBAAsB;AAC/B,YAAM,uBAAuB,CAAA;AAAA,IAC/B;AACA,UAAM,qBAAqB,KAAK,OAAO;AAAA,EACzC;AAGA,WAAS,sBAAsB,OAAkB;AAC/C,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,MAAM,OAAO,MAAM,gBAAiB;AACtD,QAAI,CAAC,UAAW;AAGhB,QAAI,MAAM,eAAe;AACvB,YAAM,cAAc,WAAW,CAAC,UAAU,KAAK,UAAU,KAAK,UAAU,GAAG;AAAA,IAC7E,OAAO;AACL,YAAM,SAAS,IAAI,OAAO,QAAQ,gBAAgB;AAAA,QAChD,UAAU,CAAC,UAAU,KAAK,UAAU,KAAK,UAAU,GAAG;AAAA,QACtD,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,kBAAkB,OAAO,OAAO,iBAAiB;AAAA,UACjD,gBAAgB,OAAO,OAAO,eAAe;AAAA,QAAA;AAAA,MAC/C,CACD;AACD,YAAM,WAAW,MAAM;AACvB,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAGA,WAAS,SAAS,QAAsB,OAAO,MAAM;AACnD,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,KAAK,SAAS,YAAY;AAChC,UAAM,QAAmB,EAAE,IAAI,MAAM,OAAA;AACrC,UAAM,cAAc,kBAAkB,KAAK;AAC3C,cAAU,MAAM,KAAK,KAAK;AAC1B,WAAO;AAAA,EACT;AAGA,WAAS,cAAc,OAAO,QAAQ;AACpC,QAAI,iBAAiB,MAAO,cAAA;AAE5B,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA,QAAQ,CAAA;AAAA,MACR,kBAAkB;AAAA,IAAA;AAEpB,eAAW,QAAQ;AACnB,cAAU,MAAM,KAAK,KAAK;AAC1B,qBAAiB,QAAQ;AACzB,mBAAe,QAAQ;AACvB,WAAO;AAAA,EACT;AAGA,WAAS,kBAAkB,IAAY,KAAa,KAAa,MAAM,GAAG;AACxE,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD,QAAI,CAAC,MAAO;AAEZ,UAAM,QAAoB;AAAA,MACxB,MAAM,KAAK,IAAA;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,mBAAmB,MAAM,OAAO,SAAS;AAG/C,QAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,YAAM,cAAc,kBAAkB,KAAK;AAC3C,4BAAsB,KAAK;AAAA,IAC7B,OAAO;AAEL,0BAAoB,OAAO,MAAM,OAAO,SAAS,GAAG,MAAM,OAAO,SAAS,CAAC;AAC3E,4BAAsB,KAAK;AAAA,IAC7B;AAGA,QAAI,OAAO,IAAI,OAAO;AACpB,aAAO,IAAI,MAAM;AAAA,QACf,CAAC,KAAK,KAAK,MAAM,EAAE;AAAA,QACnB,EAAE,QAAQ,KAAK,UAAU,IAAA;AAAA,MAAI;AAAA,IAEjC;AAAA,EACF;AAGA,WAAS,aAAa,IAAa;;AACjC,UAAM,WAAW,MAAM,iBAAiB;AACxC,QAAI,CAAC,SAAU;AAEf,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC3D,QAAI,OAAO;AACT,YAAM,mBAAmB;AACzB,UAAI,MAAM,eAAe;AACvB,yBAAW,UAAX,mBAAkB,cAAc,MAAM;AACtC,cAAM,gBAAgB;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,iBAAiB,UAAU,UAAU;AACvC,uBAAiB,QAAQ;AACzB,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AAGA,WAAS,KAAK,SAAkB;AAC9B,UAAM,KAAK,WAAW,cAAc;AACpC,QAAI,CAAC,GAAI;AAET,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD,QAAI,CAAC,SAAS,MAAM,OAAO,SAAS,EAAG;AAEvC,QAAI,cAAc,UAAU,IAAI;AAC9B,kBAAY,EAAE;AAAA,IAChB;AAEA,cAAU,QAAQ;AAClB,uBAAA;AAEA,UAAM,QAAQ,MAAM,OAAO,CAAC,EAAE;AAC9B,UAAM,MAAM,MAAM,OAAO,MAAM,OAAO,SAAS,CAAC,EAAE;AAIlD,oBAAgB,YAAY,MAAM;AAChC,YAAMgB,SAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,KAAK;AACtE,UAAI,CAACA,UAAS,CAAC,UAAU,MAAO;AAEhC,YAAM,UAAU,KAAK,IAAA,KAASA,OAAM,kBAAkB,KAAK;AAC3D,YAAM,QAAQ,MAAM;AACpB,YAAM,WAAW,KAAK,IAAI,UAAU,OAAO,CAAC;AAG5C,kBAAY,QAAQ,QAAQ,WAAW;AACvC,uBAAiB,QAAQ,WAAW;AAGpC,YAAM,YAAY,KAAK,MAAM,YAAYA,OAAM,OAAO,SAAS,EAAE;AACjE,0BAAoBA,QAAO,SAAS;AAAA,IACtC,GAAG,EAAE;AAAA,EACP;AAEA,WAAS,oBAAoB,OAAkB,OAAe;;AAC5D,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,aAAa;AACrB,YAAM,cAAc,MAAM,WAAW;AAAA,IACvC;AAGA,UAAM,YAAY,MAAM,OAAO,MAAM,GAAG,QAAQ,CAAC,EAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAA6B;AAE/D,UAAM,cAAc,IAAI,OAAO,QAAQ,kBAAkB;AAAA,MACvD;AAAA,MACA,OAAO;AAAA,QACL,OAAO,OAAO,OAAO,MAAM,mBAAmB,SAAS;AAAA,QACvD,OAAO;AAAA,QACP,SAAS;AAAA,QACT,eAAe;AAAA,MAAA;AAAA,IACjB,CACD;AACD,UAAM,WAAW,MAAM,WAAW;AAGlC,UAAM,KAAK,MAAM,OAAO,KAAK;AAC7B,iBAAO,IAAI,UAAX,mBAAkB;AAAA,MAChB,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG;AAAA,MAC7B,EAAE,QAAQ,KAAK,UAAU,EAAA;AAAA;AAAA,EAE7B;AAEA,WAAS,QAAQ;AACf,cAAU,QAAQ;AAClB,uBAAA;AAAA,EACF;AAEA,WAAS,OAAO;AACd,cAAU,QAAQ;AAClB,qBAAiB,QAAQ;AACzB,gBAAY,QAAQ;AACpB,uBAAA;AAGA,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,KAAK;AACtE,QAAI,SAAS,WAAW,OAAO;AAC7B,UAAI,MAAM,YAAa,YAAW,MAAM,cAAc,MAAM,WAAW;AACvE,YAAM,cAAc,kBAAkB,KAAK;AAAA,IAC7C;AAAA,EACF;AAEA,WAAS,SAAS,OAAe;AAC/B,kBAAc,QAAQ;AACtB,QAAI,UAAU,OAAO;AACnB,YAAA;AACA,WAAA;AAAA,IACF;AAAA,EACF;AAGA,WAAS,KAAK,UAAkB;AAC9B,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,KAAK;AACtE,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,KAAK,MAAO,WAAW,OAAQ,MAAM,OAAO,SAAS,EAAE;AACzE,gBAAY,QAAQ,MAAM,OAAO,SAAS,EAAE;AAC5C,qBAAiB,QAAQ;AACzB,wBAAoB,OAAO,SAAS;AAAA,EACtC;AAGA,WAAS,YAAY,IAAY;AAC/B,kBAAc,QAAQ;AACtB,SAAA;AAAA,EACF;AAGA,WAAS,WAAW,IAAY;AAC9B,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD,QAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAO;AAEjC,UAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,WAAO,IAAI,MAAM;AAAA,MACf,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,GAAI;AAAA,MACvC,EAAE,QAAQ,KAAM,UAAU,IAAA;AAAA,IAAI;AAAA,EAElC;AAGA,WAAS,YAAY,IAAY;;AAC/B,UAAM,MAAM,UAAU,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACxD,QAAI,QAAQ,GAAI;AAEhB,UAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,QAAI,MAAM,YAAa,kBAAW,UAAX,mBAAkB,cAAc,MAAM;AAC7D,QAAI,MAAM,cAAe,kBAAW,UAAX,mBAAkB,cAAc,MAAM;AAE/D,QAAI,MAAM,sBAAsB;AAC9B,YAAM,qBAAqB,QAAQ,CAAC,QAAQ;;AAC1C,SAAAC,MAAA,WAAW,UAAX,gBAAAA,IAAkB,cAAc;AAAA,MAClC,CAAC;AAAA,IACH;AACA,cAAU,MAAM,OAAO,KAAK,CAAC;AAE7B,QAAI,cAAc,UAAU,IAAI;AAC9B,oBAAc,QAAQ;AACtB,WAAA;AAAA,IACF;AACA,QAAI,iBAAiB,UAAU,IAAI;AACjC,uBAAiB,QAAQ;AACzB,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,WAAS,WAAW;;AAClB,SAAA;AACA,iBAAA;AACA,qBAAW,UAAX,mBAAkB;AAClB,cAAU,QAAQ,CAAA;AAClB,kBAAc,QAAQ;AAAA,EACxB;AAGA,WAAS,qBAAqB;AAC5B,QAAI,eAAe;AACjB,oBAAc,aAAa;AAC3B,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;AC3ZA,UAAM,SAAS,OAAqB,YAAY;AAChD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wCAAwC;AAGrE,UAAM,QAAQ,SAAS,MAAM;AAG7B,UAAM,YAAY;AAAA,MAChB,MAAM,OAAO,IAAI;AAAA,MACjB,CAAC,QAAQ;AACP,YAAI,KAAK;AACP,gBAAM,eAAA;AACN,oBAAA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAGpB,gBAAY,MAAM;AAChB,YAAM,SAAA;AAAA,IACR,CAAC;AAGD,YAAQ,gBAAgB,KAAK;AAG7B,aAAa,KAAK;;aAnChBhB,WAAQ,KAAA,QAAA,SAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC2MV,UAAM,QAAQ,OAAuB,cAAc;AACnD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kCAAkC;AAG9D,UAAM,cAAc,IAAI,IAAI;AAC5B,UAAM,aAAa,IAAI,KAAK;AAC5B,UAAM,MAAM,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI;AAErC,QAAI,aAAa,GACf,aAAa,GACb,QAAQ,GACR,QAAQ;AAEV,aAAS,iBAAiB;AACxB,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAEA,aAAS,UAAU,GAAe;AAChC,iBAAW,QAAQ;AACnB,mBAAa,EAAE;AACf,mBAAa,EAAE;AACf,cAAQ,IAAI;AACZ,cAAQ,IAAI;AACZ,eAAS,iBAAiB,aAAa,MAAM;AAC7C,eAAS,iBAAiB,WAAW,QAAQ;AAAA,IAC/C;AACA,aAAS,OAAO,GAAe;AAC7B,UAAI,CAAC,WAAW,MAAO;AACvB,UAAI,IAAI,SAAS,EAAE,UAAU;AAC7B,UAAI,IAAI,SAAS,EAAE,UAAU;AAAA,IAC/B;AACA,aAAS,WAAW;AAClB,iBAAW,QAAQ;AACnB,eAAS,oBAAoB,aAAa,MAAM;AAChD,eAAS,oBAAoB,WAAW,QAAQ;AAAA,IAClD;AAGA,aAAS,cAAc,IAAY;AACjC,UAAI,MAAM,cAAc,UAAU,GAAI;AACtC,YAAM,YAAY,EAAE;AACpB,YAAM,KAAA;AAAA,IACR;AAEA,UAAM,kBAAkB,SAAS,MAAM;AACrC,YAAM,IAAI,MAAM,UAAU,MAAM;AAAA,QAC9B,CAAC,MAAM,EAAE,OAAO,MAAM,cAAc;AAAA,MAAA;AAEtC,cAAO,uBAAG,SAAQ;AAAA,IACpB,CAAC;AAED,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,IAAI,MAAM,UAAU,MAAM;AAAA,QAC9B,CAAC,MAAM,EAAE,OAAO,MAAM,cAAc;AAAA,MAAA;AAEtC,UAAI,CAAC,KAAK,EAAE,OAAO,SAAS,EAAG,QAAO;AACtC,aAAO,EAAE,OAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAAA,IACvC,CAAC;AAGD,UAAM,eAAe,CAAC,GAAG,GAAG,GAAG,CAAC;AAGhC,aAAS,OAAO,GAAU;AACxB,YAAM,MAAM,WAAY,EAAE,OAA4B,KAAK;AAC3D,YAAM,KAAK,GAAG;AAAA,IAChB;AAGA,aAAS,WAAW,IAAoB;AACtC,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,IAAI,IAAI,KAAK,EAAE;AACrB,aAAO,GAAG,OAAO,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,WAAA,CAAY,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC9F;AAGA,aAAS,eAAe;AAEtB,YAAM,UAAU;AAChB,YAAM,UAAU;AAChB,YAAM,SAAS,CAAA;AACf,UAAI,IAAI,KAAK,IAAA;AAGb,UAAI,UAAU,KAAK,OAAA,IAAW,KAAK,KAAK;AACxC,YAAM,OAAO;AAEb,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,aAAK,MAAO,KAAK,OAAA,IAAW;AAE5B,oBAAY,KAAK,OAAA,IAAW,QAAQ,KAAK,KAAK;AAC9C,cAAM,UAAU,UAAU,KAAK,IAAI,OAAO,IAAI;AAC9C,cAAM,UAAU,UAAU,KAAK,IAAI,OAAO,IAAI;AAC9C,cAAM,MAAM,KAAK,KAAK,IAAK,IAAI,OAAQ,KAAK,EAAE,IAAI;AAClD,eAAO,KAAK,EAAE,MAAM,GAAG,KAAK,SAAS,KAAK,SAAS,KAAK;AAAA,MAC1D;AAEA,YAAM,SAAS,QAAQ,MAAM,UAAU,EAAE;AAAA,IAC3C;AAEA,QAAI,WAAW;AAGf,QAAI,iBAAwD;AAC5D,QAAI,qBAAoC;AAExC,aAAS,iBAAiB;AACxB,UAAI,MAAM,eAAe,OAAO;AAC9B,qBAAA;AAAA,MACF,OAAO;AACL,sBAAA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,gBAAgB;;AACvB,YAAM,MAAK,WAAM,cAAc,QAAQ,UAAU,EAAE,MAAxC,mBAA2C;AACtD,UAAI,CAAC,GAAI;AACT,2BAAqB;AAGrB,YAAM,aAAa;AACnB,YAAM,aAAa;AAEnB,YAAM,aAAa;AACnB,YAAM,aAAa;AAEnB,YAAM,eAAe;AACrB,YAAM,aAAc,IAAI,KAAK,KAAM;AAEnC,UAAI,QAAQ,KAAK,OAAA,IAAW,IAAI,KAAK;AACrC,UAAI,YAAY;AAEhB,uBAAiB,YAAY,MAAM;AACjC;AAEA,cAAM,MAAM,aAAa,KAAK,IAAI,KAAK,IAAI;AAC3C,cAAM,MAAM,aAAa,KAAK,IAAI,KAAK,IAAI;AAC3C,cAAM,MAAM,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI;AACvC,cAAM,kBAAkB,IAAI,KAAK,KAAK,GAAG;AAGzC,iBAAS;AAGT,YAAI,aAAa,cAAc;AAC7B,uBAAA;AAAA,QACF;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAEA,aAAS,eAAe;AACtB,UAAI,gBAAgB;AAClB,sBAAc,cAAc;AAC5B,yBAAiB;AAAA,MACnB;AACA,UAAI,oBAAoB;AACtB,cAAM,aAAa,kBAAkB;AACrC,6BAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,qBAAqB,SAAS,MAAM;AACxC,YAAM,IAAI,MAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,kBAAkB;AACvE,cAAO,uBAAG,OAAO,WAAU;AAAA,IAC7B,CAAC;AAGD,aAAS,eAAe;AACtB,UAAI,OAAO,QAAQ,UAAU,MAAM,UAAU,MAAM,MAAM,OAAO,GAAG;AACjE,qBAAA;AACA,cAAM,SAAA;AAAA,MACR;AAAA,IACF;;0BA5XEjB,mBAwMM,OAAA;AAAA,QAvMJ,OAAKC,eAAA,CAAC,eAAa,EAAA,WACE,YAAA,MAAA,CAAW,CAAA;AAAA,QAC/B,8BAAe,IAAI,IAAC,MAAA,KAAc,IAAI,IAAC,KAAA,CAAA;AAAA,MAAA;QAGxCC,mBAoBM,OAAA;AAAA,UAnBJ,OAAKD,eAAA,CAAC,uBAAqB,EAAA,eACF,WAAA,MAAA,CAAU,CAAA;AAAA,UAClC,2BAAmB,WAAS,CAAA,SAAA,CAAA;AAAA,UAC5B,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,WAAA,QAAU,OAAU,eAAA;AAAA,QAAc;UAE1B,YAAA,SACdU,UAAA,GAAAX,mBAGM,OAHN,YAGM;AAAA,sCAFJE,mBAA4C,KAAA,EAAzC,OAAM,iCAAA,GAAgC,MAAA,EAAA;AAAA,YACzCA,mBAAmE,QAAnE,YAAmEW,gBAAtCG,MAAA,KAAA,EAAM,UAAU,MAAM,MAAM,GAAA,CAAA;AAAA,UAAA,oBAG7DhB,mBAOWM,UAAA,EAAA,KAAA,KAAA;AAAA,YANTJ,mBAIO,QAJP,YAIO;AAAA,wCAHLA,mBAA6B,KAAA,EAA1B,OAAM,kBAAA,GAAiB,MAAA,EAAA;AAAA,wDAAG,UAE7B,EAAA;AAAA,cAAAA,mBAAmE,QAAnE,YAAmEW,gBAAtCG,MAAA,KAAA,EAAM,UAAU,MAAM,MAAM,GAAA,CAAA;AAAA,YAAA;sCAE3Dd,mBAA8C,KAAA,EAA3C,OAAM,sCAAkC,MAAA,EAAA;AAAA,UAAA;;QAK/CC,eAAAD,mBA0KM,OA1KN,YA0KM;AAAA,UAxKJA,mBAqBM,OArBN,YAqBM;AAAA,YApBJA,mBAES,UAAA;AAAA,cAFD,OAAM;AAAA,cAAoB,SAAO;AAAA,YAAA;cACvCA,mBAAwB,KAAA,EAArB,OAAM,aAAA,GAAY,MAAA,EAAA;AAAA,8BAAG,UAC1B,EAAA;AAAA,YAAA;YACAA,mBASS,UAAA;AAAA,cARP,uBAAM,OACEc,aAAM,eAAe,QAAK,gBAAA,WAAA,CAAA;AAAA,cACjC,SAAO;AAAA,YAAA;cAERd,mBAEE,KAAA;AAAA,gBADC,OAAKD,eAAA,CAAA,MAASe,MAAA,KAAA,EAAM,eAAe,QAAK,YAAA,SAAA,CAAA;AAAA,cAAA;cACzCM,gBAAA,MACFT,gBAAGG,MAAA,KAAA,EAAM,eAAe,QAAK,SAAA,MAAA,GAAA,CAAA;AAAA,YAAA;YAE/Bd,mBAMS,UAAA;AAAA,cALP,OAAM;AAAA,cACL,SAAO;AAAA,cACP,UAAUc,MAAA,KAAA,EAAM,UAAU,MAAM,WAAM;AAAA,YAAA;cAEvCd,mBAA2B,KAAA,EAAxB,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,YAAA;;UAKac,MAAA,KAAA,EAAM,cAAc,SAA7DL,aAAAX,mBA0DM,OA1DN,YA0DM;AAAA,YAxDJE,mBAIM,OAJN,YAIM;AAAA,0CAHJA,mBAAwB,KAAA,EAArB,OAAM,aAAA,GAAY,MAAA,EAAA;AAAA,8BAAG,MACxBW,gBAAG,gBAAA,KAAe,IAAG,KACrB,CAAA;AAAA,cAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAX,mBAA8C,QAAA,EAAxC,OAAM,0BAAuB,QAAI,EAAA;AAAA,YAAA;YAIzCA,mBAeM,OAfN,aAeM;AAAA,cAdJA,mBAES,UAAA;AAAA,gBAFD,OAAM;AAAA,gBAAY,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEc,MAAA,KAAA,EAAM,KAAA;AAAA,cAAI;gBACzCd,mBAAwB,KAAA,EAArB,OAAM,aAAA,GAAY,MAAA,EAAA;AAAA,cAAA;cAEvBA,mBAOS,UAAA;AAAA,gBANP,OAAM;AAAA,gBACL,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEc,MAAA,KAAA,EAAM,UAAU,QAAQA,MAAA,KAAA,EAAM,UAAUA,MAAA,KAAA,EAAM,KAAA;AAAA,cAAI;gBAE1Dd,mBAEE,KAAA;AAAA,kBADC,OAAKD,eAAA,CAAA,MAASe,MAAA,KAAA,EAAM,UAAU,QAAK,aAAA,SAAA,CAAA;AAAA,gBAAA;;cAGxCd,mBAES,UAAA;AAAA,gBAFD,OAAM;AAAA,gBAAY,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEc,MAAA,KAAA,EAAM,KAAA;AAAA,cAAI;gBACzCd,mBAA2B,KAAA,EAAxB,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,cAAA;;YAK5BA,mBAaM,OAbN,aAaM;AAAA,cAZJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAA,mBAAmC,QAAA,EAA7B,OAAM,cAAA,GAAc,MAAE,EAAA;AAAA,cAC5BA,mBAUM,OAVN,aAUM;AAAA,8BATJF,mBAQSM,UAAA,MAAAC,WAPK,cAAY,CAAjB,MAAC;yBADVL,mBAQS,UAAA;AAAA,oBANN,KAAK;AAAA,oBACN,OAAKD,eAAA,CAAC,aAAW,EAAA,QACCe,MAAA,KAAA,EAAM,cAAc,UAAU,EAAA,CAAC,CAAA;AAAA,oBAChD,SAAK,CAAA,WAAEA,MAAA,KAAA,EAAM,SAAS,CAAC;AAAA,kBAAA,GAErBH,gBAAA,CAAC,IAAG,MACT,IAAA,WAAA;AAAA;;;YAKJX,mBAcM,OAdN,aAcM;AAAA,cAbJA,mBAES,QAFT,aAESW,gBADP,WAAWG,MAAA,KAAA,EAAM,YAAY,KAAK,CAAA,GAAA,CAAA;AAAA,cAEpCd,mBAQE,SAAA;AAAA,gBAPA,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,KAAI;AAAA,gBACJ,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACJ,OAAOc,MAAA,KAAA,EAAM,iBAAiB;AAAA,gBAC9B,SAAO;AAAA,cAAA;cAEVd,mBAA8D,QAA9D,aAA8DW,gBAAlC,WAAW,aAAA,KAAY,CAAA,GAAA,CAAA;AAAA,YAAA;;UAO/CG,MAAA,KAAA,EAAM,eAAe,UAAUA,MAAA,KAAA,EAAM,cAAc,SAF3DL,UAAA,GAAAX,mBAYM,OAZN,aAYM;AAAA,wCARJE,mBAIM,OAAA,EAJD,OAAM,oBAAgB;AAAA,cACzBA,mBAAwB,KAAA,EAArB,OAAM,cAAY;AAAA,8BAAG,SAExB;AAAA,cAAAA,mBAA0B,QAAA,EAApB,OAAM,aAAW;AAAA,YAAA;YAEzBA,mBAEM,OAFN,aAEM;AAAA,0DAFsB,SACtB,EAAA;AAAA,cAAAA,mBAAyC,gCAA9B,mBAAA,KAAkB,GAAA,CAAA;AAAA,0DAAY,UAC/C,EAAA;AAAA,YAAA;;UAIFA,mBAmEM,OAnEN,aAmEM;AAAA,YAlEJO,YAwDkBgB,iBAAA,EAxDD,MAAK,gBAAY;AAAA,+BAE9B,MAAqC;AAAA,iBADvCd,UAAA,IAAA,GAAAX,mBAsDMM,2BArDWU,MAAA,KAAA,EAAM,UAAU,QAAxB,SAAI;sCADbhB,mBAsDM,OAAA;AAAA,oBApDH,KAAK,KAAK;AAAA,oBACX,uBAAM,cAAY;AAAA,sBAC6B,sBAAAgB,MAAA,KAAA,EAAM,cAAc,UAAU,KAAK;AAAA,8CAA2C,KAAK,GAAG,WAAU,UAAA;AAAA,oBAAA;oBAI9I,SAAK,CAAA,WAAE,cAAc,KAAK,EAAE;AAAA,kBAAA;oBAG7Bd,mBAOE,QAAA;AAAA,sBANA,OAAM;AAAA,sBACL,OAAKiB,eAAA;AAAA,oCAAiC,KAAK,GAAG,WAAU,UAAA;;;oBAO3DjB,mBAgBM,OAhBN,aAgBM;AAAA,sBAfJA,mBAQM,OARN,aAQM;AAAA,wBAPJA,mBAKE,KAAA;AAAA,0BAJC,OAAKD,eAAA;AAAA;4BAAoD,KAAK,GAAG,WAAU,UAAA,IAAA,YAAA;AAAA,0BAAA;;wCAI5E,MACFY,gBAAG,KAAK,IAAI,GAAA,CAAA;AAAA,sBAAA;sBAEdX,mBAKM,OALN,aAKM;AAAA,wBAJDoB,gBAAAT,gBAAA,KAAK,OAAO,MAAM,IAAG,QACxB,CAAA;AAAA,wBAAY,KAAK,GAAG,WAAU,UAAA,kBAA9Bb,mBAC8B,QAD9B,aACG,IAAE;;;oBAKTE,mBAeM,OAfN,aAeM;AAAA,sBAdJA,mBAMS,UAAA;AAAA,wBALP,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,mCAAYc,MAAA,KAAA,EAAM,WAAW,KAAK,EAAE,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAErCd,mBAA8B,KAAA,EAA3B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,sBAAA;sBAE7BA,mBAMS,UAAA;AAAA,wBALP,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,mCAAYc,MAAA,KAAA,EAAM,YAAY,KAAK,EAAE,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAEtCd,mBAAyB,KAAA,EAAtB,OAAM,cAAA,GAAa,MAAA,EAAA;AAAA,sBAAA;;;;;;;YAQtBc,MAAA,KAAA,EAAM,UAAU,MAAM,WAAM,KADpCL,UAAA,GAAAX,mBAMM,OANN,aAMM,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,cAFJE,mBAAyB,KAAA,EAAtB,OAAM,cAAA,GAAa,MAAA,EAAA;AAAA,cACtBA,mBAAa,WAAV,UAAM,EAAA;AAAA,YAAA;;;mBAvKyB,YAAA,KAAW;AAAA,QAAA;;;;;;ACyBvD,MAAM,aAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EAAA,gBACAgC;AAAAA,EACA;AAAA,EAAA,YACAC;AAAAA,EACA;AACF;AAEA,MAAM,QAAQ;AAAA,EACZ,QAAQ,KAAU,SAA+B;AAC/C,UAAM,UAAS,mCAAS,WAAU;AAClC,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC1D,UAAI,UAAU,SAAS,GAAG,MAAM,GAAG,IAAI,KAAK,MAAM,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;"}