@jax-data-science/sci-image-visualizer 0.1.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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/esm2022/index.mjs +52 -0
  4. package/esm2022/jax-data-science-sci-image-visualizer.mjs +5 -0
  5. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +398 -0
  6. package/esm2022/lib/contracts/capabilities.contract.mjs +32 -0
  7. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +12 -0
  8. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +14 -0
  9. package/esm2022/lib/contracts/colormap-lut.mjs +95 -0
  10. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +2 -0
  11. package/esm2022/lib/contracts/display-types.mjs +8 -0
  12. package/esm2022/lib/contracts/image.contract.mjs +11 -0
  13. package/esm2022/lib/contracts/intensity.mjs +28 -0
  14. package/esm2022/lib/contracts/plot-type.mjs +112 -0
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +3 -0
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +3 -0
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +3 -0
  18. package/esm2022/lib/contracts/ports/tile-access.port.mjs +3 -0
  19. package/esm2022/lib/contracts/region-editor-api.contract.mjs +4 -0
  20. package/esm2022/lib/contracts/region-overlay.contract.mjs +2 -0
  21. package/esm2022/lib/contracts/region-store.contract.mjs +2 -0
  22. package/esm2022/lib/contracts/sam.contract.mjs +12 -0
  23. package/esm2022/lib/contracts/toolbar-config.mjs +8 -0
  24. package/esm2022/lib/contracts/visualizer.contract.mjs +10 -0
  25. package/esm2022/lib/contracts/viz-config.mjs +3 -0
  26. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +260 -0
  27. package/esm2022/lib/implementations/base-store-visualizer.mjs +76 -0
  28. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +106 -0
  29. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +847 -0
  30. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +92 -0
  31. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2283 -0
  32. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +126 -0
  33. package/esm2022/lib/implementations/osd/display-pipeline.mjs +143 -0
  34. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +217 -0
  35. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +1780 -0
  36. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +25 -0
  37. package/esm2022/lib/implementations/osd/osd-coords.mjs +53 -0
  38. package/esm2022/lib/implementations/osd/osd-lib.mjs +20 -0
  39. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +1237 -0
  40. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +88 -0
  41. package/esm2022/lib/implementations/osd/slice-cache.mjs +488 -0
  42. package/esm2022/lib/implementations/osd/tile-client.mjs +29 -0
  43. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +37 -0
  44. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +31 -0
  45. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +183 -0
  46. package/esm2022/lib/implementations/plotly/plotly.service.mjs +2137 -0
  47. package/esm2022/lib/implementations/simple-slice-access.service.mjs +99 -0
  48. package/esm2022/lib/models/bezier.mjs +120 -0
  49. package/esm2022/lib/models/class-preset.mjs +46 -0
  50. package/esm2022/lib/models/geometry.mjs +198 -0
  51. package/esm2022/lib/models/region.mjs +166 -0
  52. package/esm2022/lib/models/shape.mjs +53 -0
  53. package/esm2022/lib/plot.utilities.mjs +693 -0
  54. package/esm2022/lib/processing/image-converter.service.mjs +90 -0
  55. package/esm2022/lib/processing/image-crop.mjs +62 -0
  56. package/esm2022/lib/processing/processing-image.mjs +50 -0
  57. package/esm2022/lib/provide-visualization.mjs +63 -0
  58. package/esm2022/lib/region-editor/mask-raster.mjs +95 -0
  59. package/esm2022/lib/region-editor/mask-worker.mjs +10 -0
  60. package/esm2022/lib/region-editor/region-editor.component.mjs +1190 -0
  61. package/esm2022/lib/region-ops.service.mjs +301 -0
  62. package/esm2022/lib/render-orchestrator.mjs +87 -0
  63. package/esm2022/lib/routing-visualizer.service.mjs +533 -0
  64. package/esm2022/lib/store/class-color.util.mjs +52 -0
  65. package/esm2022/lib/store/region-store.service.mjs +1029 -0
  66. package/esm2022/lib/store/visualizer-store.service.mjs +352 -0
  67. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +546 -0
  68. package/esm2022/lib/toolbar/crop/slide-crop.mjs +57 -0
  69. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +115 -0
  70. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +84 -0
  71. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +133 -0
  72. package/esm2022/lib/toolbar/segmentation/ort-runtime-config.mjs +31 -0
  73. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +108 -0
  74. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +159 -0
  75. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +255 -0
  76. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +94 -0
  77. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +188 -0
  78. package/esm2022/lib/toolbar/toolbar.component.mjs +311 -0
  79. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +234 -0
  80. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +499 -0
  81. package/esm2022/lib/toolbar/wand/wand.service.mjs +921 -0
  82. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +157 -0
  83. package/esm2022/lib/visualization.module.mjs +162 -0
  84. package/esm2022/lib/visualizer.component.mjs +1597 -0
  85. package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs +12 -0
  86. package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs.map +1 -0
  87. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs +327 -0
  88. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map +1 -0
  89. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +21314 -0
  90. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -0
  91. package/fesm2022/mask.worker.js +989 -0
  92. package/fesm2022/onnx-sam.worker.js +202 -0
  93. package/index.d.ts +39 -0
  94. package/lib/channel-histogram/channel-histogram.component.d.ts +112 -0
  95. package/lib/contracts/capabilities.contract.d.ts +30 -0
  96. package/lib/contracts/cell-segmenter.contract.d.ts +40 -0
  97. package/lib/contracts/channel-histogram-api.contract.d.ts +98 -0
  98. package/lib/contracts/colormap-lut.d.ts +21 -0
  99. package/lib/contracts/coordinate-transform.contract.d.ts +43 -0
  100. package/lib/contracts/display-types.d.ts +41 -0
  101. package/lib/contracts/image.contract.d.ts +72 -0
  102. package/lib/contracts/intensity.d.ts +18 -0
  103. package/lib/contracts/plot-type.d.ts +108 -0
  104. package/lib/contracts/ports/image-state.port.d.ts +29 -0
  105. package/lib/contracts/ports/preferences.port.d.ts +19 -0
  106. package/lib/contracts/ports/region-io.port.d.ts +29 -0
  107. package/lib/contracts/ports/tile-access.port.d.ts +27 -0
  108. package/lib/contracts/region-editor-api.contract.d.ts +83 -0
  109. package/lib/contracts/region-overlay.contract.d.ts +47 -0
  110. package/lib/contracts/region-store.contract.d.ts +74 -0
  111. package/lib/contracts/sam.contract.d.ts +98 -0
  112. package/lib/contracts/toolbar-config.d.ts +24 -0
  113. package/lib/contracts/visualizer.contract.d.ts +346 -0
  114. package/lib/contracts/viz-config.d.ts +25 -0
  115. package/lib/hex-color-picker/hex-color-picker.component.d.ts +47 -0
  116. package/lib/implementations/base-store-visualizer.d.ts +71 -0
  117. package/lib/implementations/napari-js/napari-axes-labels.d.ts +47 -0
  118. package/lib/implementations/napari-js/napari-region-overlay.d.ts +115 -0
  119. package/lib/implementations/napari-js/napari-scale-bar.d.ts +31 -0
  120. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +455 -0
  121. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +46 -0
  122. package/lib/implementations/osd/display-pipeline.d.ts +47 -0
  123. package/lib/implementations/osd/histogram-sampler.d.ts +85 -0
  124. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +476 -0
  125. package/lib/implementations/osd/osd-coordinate-transform.d.ts +17 -0
  126. package/lib/implementations/osd/osd-coords.d.ts +16 -0
  127. package/lib/implementations/osd/osd-lib.d.ts +19 -0
  128. package/lib/implementations/osd/osd-region-overlay.d.ts +191 -0
  129. package/lib/implementations/osd/osd-scale-bar.d.ts +17 -0
  130. package/lib/implementations/osd/slice-cache.d.ts +161 -0
  131. package/lib/implementations/osd/tile-client.d.ts +32 -0
  132. package/lib/implementations/plotly/plotly-coordinate-transform.d.ts +19 -0
  133. package/lib/implementations/plotly/plotly-region-overlay.d.ts +23 -0
  134. package/lib/implementations/plotly/plotly-trace-builders.d.ts +60 -0
  135. package/lib/implementations/plotly/plotly.service.d.ts +594 -0
  136. package/lib/implementations/simple-slice-access.service.d.ts +64 -0
  137. package/lib/models/bezier.d.ts +59 -0
  138. package/lib/models/class-preset.d.ts +39 -0
  139. package/lib/models/geometry.d.ts +66 -0
  140. package/lib/models/region.d.ts +132 -0
  141. package/lib/models/shape.d.ts +44 -0
  142. package/lib/plot.utilities.d.ts +107 -0
  143. package/lib/processing/image-converter.service.d.ts +28 -0
  144. package/lib/processing/image-crop.d.ts +18 -0
  145. package/lib/processing/processing-image.d.ts +17 -0
  146. package/lib/provide-visualization.d.ts +34 -0
  147. package/lib/region-editor/mask-raster.d.ts +61 -0
  148. package/lib/region-editor/mask-worker.d.ts +7 -0
  149. package/lib/region-editor/region-editor.component.d.ts +305 -0
  150. package/lib/region-ops.service.d.ts +92 -0
  151. package/lib/render-orchestrator.d.ts +59 -0
  152. package/lib/routing-visualizer.service.d.ts +227 -0
  153. package/lib/store/class-color.util.d.ts +26 -0
  154. package/lib/store/region-store.service.d.ts +315 -0
  155. package/lib/store/visualizer-store.service.d.ts +123 -0
  156. package/lib/toolbar/brush/brush-tool.service.d.ts +143 -0
  157. package/lib/toolbar/crop/slide-crop.d.ts +30 -0
  158. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +32 -0
  159. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +39 -0
  160. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +25 -0
  161. package/lib/toolbar/segmentation/ort-runtime-config.d.ts +4 -0
  162. package/lib/toolbar/segmentation/sam-model-registry.d.ts +36 -0
  163. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +48 -0
  164. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +59 -0
  165. package/lib/toolbar/segmentation/sam-prompt.d.ts +34 -0
  166. package/lib/toolbar/segmentation/sam-tool.service.d.ts +50 -0
  167. package/lib/toolbar/toolbar.component.d.ts +167 -0
  168. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +64 -0
  169. package/lib/toolbar/wand/wand-tool.service.d.ts +149 -0
  170. package/lib/toolbar/wand/wand.service.d.ts +133 -0
  171. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +49 -0
  172. package/lib/visualization.module.d.ts +45 -0
  173. package/lib/visualizer.component.d.ts +378 -0
  174. package/package.json +73 -0
  175. package/src/lib/assets/3d-coordinates.svg +49 -0
  176. package/src/lib/assets/cells.svg +1 -0
  177. package/src/lib/assets/click.svg +1 -0
  178. package/src/lib/assets/colormap-luts.json +1 -0
  179. package/src/lib/assets/contour.svg +48 -0
  180. package/src/lib/assets/cube-3d.svg +1 -0
  181. package/src/lib/assets/edit-selection-white.svg +47 -0
  182. package/src/lib/assets/heatmap.svg +1 -0
  183. package/src/lib/assets/icons/colormap-Pastel1.png +0 -0
  184. package/src/lib/assets/icons/colormap-accent.png +0 -0
  185. package/src/lib/assets/icons/colormap-afmhot.png +0 -0
  186. package/src/lib/assets/icons/colormap-autumn.png +0 -0
  187. package/src/lib/assets/icons/colormap-berlin.png +0 -0
  188. package/src/lib/assets/icons/colormap-binary.png +0 -0
  189. package/src/lib/assets/icons/colormap-blackbody.png +0 -0
  190. package/src/lib/assets/icons/colormap-bluered.png +0 -0
  191. package/src/lib/assets/icons/colormap-blues.png +0 -0
  192. package/src/lib/assets/icons/colormap-bone.png +0 -0
  193. package/src/lib/assets/icons/colormap-brbg.png +0 -0
  194. package/src/lib/assets/icons/colormap-brg.png +0 -0
  195. package/src/lib/assets/icons/colormap-bugn.png +0 -0
  196. package/src/lib/assets/icons/colormap-bupu.png +0 -0
  197. package/src/lib/assets/icons/colormap-bwr.png +0 -0
  198. package/src/lib/assets/icons/colormap-cividis.png +0 -0
  199. package/src/lib/assets/icons/colormap-cmrmap.png +0 -0
  200. package/src/lib/assets/icons/colormap-cool.png +0 -0
  201. package/src/lib/assets/icons/colormap-coolwarm.png +0 -0
  202. package/src/lib/assets/icons/colormap-copper.png +0 -0
  203. package/src/lib/assets/icons/colormap-cubehelix.png +0 -0
  204. package/src/lib/assets/icons/colormap-dark2.png +0 -0
  205. package/src/lib/assets/icons/colormap-earth.png +0 -0
  206. package/src/lib/assets/icons/colormap-electric.png +0 -0
  207. package/src/lib/assets/icons/colormap-flag.png +0 -0
  208. package/src/lib/assets/icons/colormap-gist_earth.png +0 -0
  209. package/src/lib/assets/icons/colormap-gist_gray.png +0 -0
  210. package/src/lib/assets/icons/colormap-gist_heat.png +0 -0
  211. package/src/lib/assets/icons/colormap-gist_ncar.png +0 -0
  212. package/src/lib/assets/icons/colormap-gist_rainbow.png +0 -0
  213. package/src/lib/assets/icons/colormap-gist_stern.png +0 -0
  214. package/src/lib/assets/icons/colormap-gist_yarg.png +0 -0
  215. package/src/lib/assets/icons/colormap-gnbu.png +0 -0
  216. package/src/lib/assets/icons/colormap-gnuplot.png +0 -0
  217. package/src/lib/assets/icons/colormap-gnuplot2.png +0 -0
  218. package/src/lib/assets/icons/colormap-gray.png +0 -0
  219. package/src/lib/assets/icons/colormap-greens-inv.png +0 -0
  220. package/src/lib/assets/icons/colormap-greens.png +0 -0
  221. package/src/lib/assets/icons/colormap-greys-inv.png +0 -0
  222. package/src/lib/assets/icons/colormap-greys.png +0 -0
  223. package/src/lib/assets/icons/colormap-hot.png +0 -0
  224. package/src/lib/assets/icons/colormap-hsv.png +0 -0
  225. package/src/lib/assets/icons/colormap-inferno.png +0 -0
  226. package/src/lib/assets/icons/colormap-jet.png +0 -0
  227. package/src/lib/assets/icons/colormap-magma.png +0 -0
  228. package/src/lib/assets/icons/colormap-managua.png +0 -0
  229. package/src/lib/assets/icons/colormap-nipy_spectral.png +0 -0
  230. package/src/lib/assets/icons/colormap-ocean.png +0 -0
  231. package/src/lib/assets/icons/colormap-oranges.png +0 -0
  232. package/src/lib/assets/icons/colormap-orrd.png +0 -0
  233. package/src/lib/assets/icons/colormap-pastel2.png +0 -0
  234. package/src/lib/assets/icons/colormap-picnic.png +0 -0
  235. package/src/lib/assets/icons/colormap-pink.png +0 -0
  236. package/src/lib/assets/icons/colormap-piyg.png +0 -0
  237. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  238. package/src/lib/assets/icons/colormap-plasma.png +0 -0
  239. package/src/lib/assets/icons/colormap-portland.png +0 -0
  240. package/src/lib/assets/icons/colormap-prgn.png +0 -0
  241. package/src/lib/assets/icons/colormap-prism.png +0 -0
  242. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  243. package/src/lib/assets/icons/colormap-pubugn.png +0 -0
  244. package/src/lib/assets/icons/colormap-puor.png +0 -0
  245. package/src/lib/assets/icons/colormap-purd.png +0 -0
  246. package/src/lib/assets/icons/colormap-purples.png +0 -0
  247. package/src/lib/assets/icons/colormap-rainbow.png +0 -0
  248. package/src/lib/assets/icons/colormap-rdbu.png +0 -0
  249. package/src/lib/assets/icons/colormap-rdgy.png +0 -0
  250. package/src/lib/assets/icons/colormap-rdpu.png +0 -0
  251. package/src/lib/assets/icons/colormap-rdylbu.png +0 -0
  252. package/src/lib/assets/icons/colormap-rdylgn.png +0 -0
  253. package/src/lib/assets/icons/colormap-reds.png +0 -0
  254. package/src/lib/assets/icons/colormap-seismic.png +0 -0
  255. package/src/lib/assets/icons/colormap-set1.png +0 -0
  256. package/src/lib/assets/icons/colormap-set2.png +0 -0
  257. package/src/lib/assets/icons/colormap-set3.png +0 -0
  258. package/src/lib/assets/icons/colormap-spectral.png +0 -0
  259. package/src/lib/assets/icons/colormap-spring.png +0 -0
  260. package/src/lib/assets/icons/colormap-summer.png +0 -0
  261. package/src/lib/assets/icons/colormap-tab10.png +0 -0
  262. package/src/lib/assets/icons/colormap-tab20.png +0 -0
  263. package/src/lib/assets/icons/colormap-tab20b.png +0 -0
  264. package/src/lib/assets/icons/colormap-tab20c.png +0 -0
  265. package/src/lib/assets/icons/colormap-terrain.png +0 -0
  266. package/src/lib/assets/icons/colormap-turbo.png +0 -0
  267. package/src/lib/assets/icons/colormap-twilight.png +0 -0
  268. package/src/lib/assets/icons/colormap-twilight_shifted.png +0 -0
  269. package/src/lib/assets/icons/colormap-vanimo.png +0 -0
  270. package/src/lib/assets/icons/colormap-viridis.png +0 -0
  271. package/src/lib/assets/icons/colormap-winter.png +0 -0
  272. package/src/lib/assets/icons/colormap-wistia.png +0 -0
  273. package/src/lib/assets/icons/colormap-ylgn.png +0 -0
  274. package/src/lib/assets/icons/colormap-ylgnbu-inv.png +0 -0
  275. package/src/lib/assets/icons/colormap-ylgnbu.png +0 -0
  276. package/src/lib/assets/icons/colormap-ylorbr.png +0 -0
  277. package/src/lib/assets/icons/colormap-ylorrd-inv.png +0 -0
  278. package/src/lib/assets/icons/colormap-ylorrd.png +0 -0
  279. package/src/lib/assets/interactive-segmentation-cursor.svg +1 -0
  280. package/src/lib/assets/invert.svg +1 -0
  281. package/src/lib/assets/isosurface.svg +7 -0
  282. package/src/lib/assets/mask.svg +1 -0
  283. package/src/lib/assets/paintbrush.svg +1 -0
  284. package/src/lib/assets/picture-segmentation.svg +43 -0
  285. package/src/lib/assets/polygon-vertices.svg +13 -0
  286. package/src/lib/assets/polyline.svg +3 -0
  287. package/src/lib/assets/redo.svg +39 -0
  288. package/src/lib/assets/region-editor.svg +37 -0
  289. package/src/lib/assets/region-move.svg +7 -0
  290. package/src/lib/assets/smooth.svg +56 -0
  291. package/src/lib/assets/spline-chart.svg +7 -0
  292. package/src/lib/assets/surface.svg +37 -0
  293. package/src/lib/assets/test/download-379.svg +1 -0
  294. package/src/lib/assets/test/download-98.svg +1 -0
  295. package/src/lib/assets/test/json-1.svg +1 -0
  296. package/src/lib/assets/test/load-53.svg +1 -0
  297. package/src/lib/assets/test/mask-44.svg +1 -0
  298. package/src/lib/assets/test/mask-download-44.svg +15 -0
  299. package/src/lib/assets/test/mask-save-44.svg +11 -0
  300. package/src/lib/assets/test/overlay-1.svg +1 -0
  301. package/src/lib/assets/test/overlay-4.svg +1 -0
  302. package/src/lib/assets/test/region-26.svg +1 -0
  303. package/src/lib/assets/test/save-56.svg +1 -0
  304. package/src/lib/assets/test/upload-43.svg +1 -0
  305. package/src/lib/assets/to-bezier.svg +15 -0
  306. package/src/lib/assets/to-polygon.svg +11 -0
  307. package/src/lib/assets/undo.svg +38 -0
  308. package/src/lib/assets/vertex-add.svg +12 -0
  309. package/src/lib/assets/vertex-delete.svg +12 -0
  310. package/src/lib/assets/wand.svg +54 -0
  311. package/src/lib/assets/zoom-box.svg +10 -0
@@ -0,0 +1,10 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * DI token for the active visualization backend. Bind it (`useExisting`) to the
4
+ * `RoutingVisualizerService`, which selects Plotly vs OpenSeadragon per plot
5
+ * type. Consumers — including this library's own `VisualizerComponent` —
6
+ * inject `IVisualizer` through this token rather than the concrete router, so
7
+ * the routing/fallback implementation can change without touching constructors.
8
+ */
9
+ export const VISUALIZER = new InjectionToken('VISUALIZER');
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXFXL0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFjLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBQbG90VHlwZSwgUGxvdFR5cGVEZXNjcmlwdG9yIH0gZnJvbSAnLi9wbG90LXR5cGUnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIElXYW5kT3B0aW9ucywgSUJydXNoT3B0aW9ucyB9IGZyb20gJy4vZGlzcGxheS10eXBlcyc7XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIHZpc3VhbGl6YXRpb24gY29udHJhY3QuIFBsb3RseSBpcyBvbmUgaW1wbGVtZW50YXRpb247XG4gKiBPcGVuU2VhZHJhZ29uIGlzIGFub3RoZXIgKGZvciB0aGUgaW1hZ2UgcGxvdCB0eXBlKS4gVGhlIGFic3RyYWN0aW9uIHJlbmRlcnNcbiAqIGRhdGEg4oCUIGEgcmFzdGVyIGltYWdlIE9SIGEgc2NpZW50aWZpYyBwbG90IChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLFxuICogc2NhdHRlciwgbGluZSwgaXNvc3VyZmFjZSkg4oCUIGRyYXdzIHJlZ2lvbnMgb24gaXQsIGFuZCBkcml2ZXMgb24tY2FudmFzIHRvb2xzLlxuICpcbiAqIFNwbGl0IGludG8gcm9sZSBpbnRlcmZhY2VzIHNvIGEgY29uc3VtZXIgY2FuIGRlcGVuZCBvbmx5IG9uIHRoZSBzbGljZSBpdFxuICogdXNlcywgdGhlbiBjb21wb3NlZCBpbnRvIGBJVmlzdWFsaXplcmAuXG4gKlxuICogVHlwZXMgYXJlIGludGVudGlvbmFsbHkgcGVybWlzc2l2ZSAoYGFueWAgd2hlcmUgdGhlIGN1cnJlbnQgUGxvdGx5IHNlcnZpY2VcbiAqIGlzIHVudHlwZWQpIHNvIGBQbG90bHlTZXJ2aWNlYCBzYXRpc2ZpZXMgdGhlIGNvbnRyYWN0IHdpdGhvdXQgYSB0eXBpbmdcbiAqIHJld3JpdGUg4oCUIHRpZ2h0ZW5pbmcgaXMgYSBmb2xsb3ctdXAsIG5vdCBwYXJ0IG9mIHN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgdXAuXG4gKi9cblxuLyoqIFBpeGVsIHJlYWRiYWNrIHNoYXBlIHJldHVybmVkIGJ5IGBnZXREaXNwbGF5ZWRQaXhlbERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbERhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7XG59XG5cbi8qKiBJbnRlbnNpdHkgc2FtcGxlZCBhbG9uZyBhIGxpbmUgUk9JIChQbG90VHlwZS5MSU5FIG92ZXIgaW1hZ2UgZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVuc2l0eVByb2ZpbGUge1xuICAvKiogRGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUuIEluIG1pY3JvbnMgd2hlbiB0aGUgaW1hZ2UgY2FycmllcyBhIHBoeXNpY2FsXG4gICAqICBwaXhlbCBzaXplIChtcHApOyBvdGhlcndpc2UgaW4gaW1hZ2UgcGl4ZWxzLiBTZWUge0BsaW5rIHVuaXR9LiAqL1xuICBwb3NpdGlvbnM6IG51bWJlcltdO1xuICAvKiogU2FtcGxlZCBpbnRlbnNpdHkgKGdyYXlzY2FsZSB2YWx1ZSBvciBSR0IgbHVtaW5hbmNlKS4gKi9cbiAgdmFsdWVzOiBudW1iZXJbXTtcbiAgLyoqIFVuaXQgb2Yge0BsaW5rIHBvc2l0aW9uc306ICfCtW0nIHdoZW4gc2NhbGVkIGJ5IHRoZSBpbWFnZSdzIG1wcCwgZWxzZSAncHgnLiAqL1xuICB1bml0PzogJ8K1bScgfCAncHgnO1xuICAvKiogU3RhYmxlIGlkIG9mIHRoZSBsaW5lIFJPSSB0aGlzIHByb2ZpbGUgY2FtZSBmcm9tIChtdWx0aS1saW5lIHN1cHBvcnQpLiAqL1xuICBpZD86IG51bWJlcjtcbiAgLyoqIENvbG91ciBvZiB0aGUgbGluZSBST0kg4oCUIHRoZSBpbnNldCB0cmFjZSBpcyBkcmF3biBpbiB0aGUgc2FtZSBjb2xvdXIuICovXG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8YW55PjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIGJhY2tlbmQtc3BlY2lmaWMgaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIOKAlFxuICAgKiAgdHJlYXQgaXQgYXMgb3BhcXVlIGFuZCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guICovXG4gIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogdW5rbm93biwgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICAgICBwbG90VHlwZTogUGxvdFR5cGUsIGluUGxhY2U/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyByZS1yZW5kZXI7IHRoZSBPU0QgYmFja2VuZCBuby1vcHMgaXQuIFRoZSBob3N0XG4gICAqICByZS1kcml2ZXMgYHBsb3QoKWAgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtIGluc3RlYWQuICovXG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgcmVsYXlvdXQodHJ1ZUltYWdlU2l6ZT86IG51bWJlcltdKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyAoYXhpcyByZXNldCk7IHRoZSBPU0QgYmFja2VuZCBuby1vcHMgaXQuIEdhdGVcbiAgICogIG9uIHtAbGluayBWaWV3ZXJDYXBhYmlsaXRpZXN9IGJlZm9yZSBjYWxsaW5nLiAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyAoYXV0b3NjYWxlKTsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gR2F0ZVxuICAgKiAgb24ge0BsaW5rIFZpZXdlckNhcGFiaWxpdGllc30gYmVmb3JlIGNhbGxpbmcuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBPcGVuU2VhZHJhZ29uIG9ubHkg4oCUIFBsb3RseVxuICAgKiAgbm8tb3BzIGl0IChpdCBoYXMgbm8gbmF2aWdhdG9yKS4gQXBwbGllZCB3aGVuIHRoZSB2aWV3ZXIgaXMgKHJlKWNyZWF0ZWQsIGFuZFxuICAgKiAgdG9nZ2xlZCBsaXZlIHdoZW4gb25lIGlzIGFscmVhZHkgbW91bnRlZC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikuIGBmYWxzZWAgPSBuZWFyZXN0LW5laWdoYm91ciwgc29cbiAgICogIHpvb21pbmcgcGFzdCAxOjEgc2hvd3MgY3Jpc3AgcGl4ZWwgYmxvY2tzIChwaXhlbC1sZXZlbCBpbnNwZWN0aW9uKS5cbiAgICogIE9wZW5TZWFkcmFnb24gb25seSDigJQgUGxvdGx5IG5vLW9wcyBpdC4gQXBwbGllZCBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmVcbiAgICogICh3aXRoIGEgcmVkcmF3KSB3aGVuIG9uZSBpcyBtb3VudGVkLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLiBcbiAgICpcbiAgICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgdmlld3BvcnQgaXNuJ3QgbGFpZCBvdXQgeWV0IG9yIHRoZSBiYWNrZW5kIGNhbid0XG4gICAqIHJlcG9ydCBpdCDigJQgY2FsbGVycyBzaG91bGQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGZ1bGwtaW1hZ2Ugc2NhbGUgKHRyZWF0XG4gICAqIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzIGFzIGEgZG93bnNhbXBsZSBvZiB0aGUgd2hvbGUgaW1hZ2UpLlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkO1xuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQ7XG4gIC8qKiBTZXQgdGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gT3B0aW9uYWwg4oCUIG9ubHkgdGhlIG5hcGFyaS1qcyBXZWJHUFVcbiAgICogIGJhY2tlbmQgaG9ub3JzIGl0OyBjaGFuZ2luZyBpdCByZS1sb2FkcyB0aGUgY3VycmVudCAzRCBwbG90IGF0IHRoZSBjb2Fyc2VyL2ZpbmVyIHNhbXBsaW5nLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGU/KHNjYWxlOiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIGN1cnJlbnQgbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gT3B0aW9uYWwuICovXG4gIGdldFJlc29sdXRpb25TY2FsZT8oKTogbnVtYmVyO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYCDigJQgM0Qgc2NlbmUgY29udHJvbHMgb25seSBleGlzdCBvblxuICAgKiAgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyAzRCBwbG90IHR5cGVzOyB0aGlzIG1ldGhvZCBzaWxlbnRseSBuby1vcHMgb24gT1NELiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAg4oCUIHNlZSB7QGxpbmsgc2V0U3VyZmFjZURyYWdNb2RlfS4gKi9cbiAgcmVzZXRTdXJmYWNlQ2FtZXJhKCk6IHZvaWQ7XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKiBQbG90IHR5cGVzIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIChkcml2ZXMgdGhlIFVJIHNlbGVjdG9yKS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXTtcblxuICAvKiogSW50ZW5zaXR5IGFsb25nIHRoZSBsaW5lIFJPSXM7IGVtaXRzIHRoZSBmdWxsIHNldCBhcyBhbnkgbGluZSBpcyBhZGRlZCxcbiAgICogIG1vdmVkLCBvciByZW1vdmVkIChQbG90VHlwZS5MSU5FKS4gT25lIGVudHJ5IHBlciBsaW5lIFJPSS4gKi9cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+O1xuXG4gIC8qKiBSZW5kZXIgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGNoYXJ0IGludG8gYGRpdklkYCBmcm9tIHRoZVxuICAgKiAgZ2l2ZW4gcHJvZmlsZXMgKG9uZSB0cmFjZSBwZXIgbGluZSBST0ksIGNvbG91cmVkIHRvIG1hdGNoIGl0cyBsaW5lKS5cbiAgICogIE93bmVkIGJ5IHRoZSBiYWNrZW5kIHNvIGNvbnN1bWVycyBuZXZlciByZWFjaCBhIGNoYXJ0aW5nIGxpYnJhcnkgZGlyZWN0bHkuICovXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkO1xufVxuXG4vKiogUmVnaW9uL3NoYXBlIHN0YXRlOiBDUlVELCBzZWxlY3Rpb24sIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMsIEdlb0pTT04gSS9PLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVnaW9uU3RvcmUge1xuICBzZXRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdLCBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLCBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgICAgICAgICAgZmlsbENvbG9yPzogc3RyaW5nLCBhcHBlbmQ/OiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEZyYW1ld29yay1uZXV0cmFsIGFjY2Vzc29yIOKAlCB0aGUgY2Fub25pY2FsIHdheSB0byByZWFkIGN1cnJlbnQgcmVnaW9ucy4gKi9cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXTtcbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W107XG4gIGdldFJlZ2lvblVwZGF0ZUV2ZW50KCk6IE9ic2VydmFibGU8YW55W10+O1xuXG4gIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXM6IG51bWJlcltdKTogdm9pZDtcbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICAvKiogU2VsZWN0IGEgc3BlY2lmaWMgcmVnaW9uIChieSBpZGVudGl0eSksIGhpZ2hsaWdodGluZyBpdCBvbiB3aGljaGV2ZXJcbiAgICogIGJhY2tlbmQgaXMgcmVuZGVyaW5nIOKAlCBQbG90bHkgc2V0cyBpdHMgYWN0aXZlLXNoYXBlIGhhbmRsZXMsIE9wZW5TZWFkcmFnb25cbiAgICogIGhpZ2hsaWdodHMgdGhlIFNWRyBlbGVtZW50LiBOby1vcCBpZiB0aGUgcmVnaW9uIGlzbid0IGluIHRoZSBzdG9yZS4gKi9cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZDtcbiAgZGVsZXRlQWN0aXZlU2hhcGUoKTogdm9pZDtcblxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuO1xuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZztcbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZztcbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZDtcblxuICBwbG90UHJldmlvdXNTaGFwZXMoKTogdm9pZDtcbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBhbnlbXSk6IHZvaWQ7XG4gIGdldFByZXZpb3VzU2hhcGVzKCk6IGFueVtdO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScpOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2xDb250cm9sbGVyIHtcbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZDtcbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZDtcbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQ7XG4gIC8qKiBCcnVzaCByZWdpb24gdG9vbC4gYHNpemVgIChtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIpIHNpemVzIHRoZSBwYWludGVkIGRpc2MuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQ7XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS4gKi9cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBGaW5hbGlzZSAvIGRpc2NhcmQgdGhlIGluLXByb2dyZXNzIFNBTSBwb2ludCBvYmplY3QuICovXG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkO1xuICBjbGVhclNhbVBvaW50cygpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSBJU09TVVJGQUNFIHBsb3QgdHlwZS4gT3B0aW9uYWwgYW5kIGNhcGFiaWxpdHktZ2F0ZWRcbiAqIChgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCk6IG9ubHkgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyBpc29zdXJmYWNlcyBleHBvc2VzXG4gKiBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRJc29zdXJmYWNlQ29udHJvbHMoKWAuIEtlcHQgb2ZmIHRoZSBhbHdheXMtb25cbiAqIGNvbnRyYWN0IHNvIGNvbnN1bWVycyBuZXZlciBjYWxsIGEgY29udHJvbCB0aGF0J3MgbWVhbmluZ2xlc3MgZm9yIHRoZSBjdXJyZW50XG4gKiBwbG90IHR5cGUgLyBiYWNrZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJc29zdXJmYWNlQ29udHJvbHMge1xuICAvKiogTGl2ZS11cGRhdGUgdGhlIGlzb3N1cmZhY2UgaW50ZW5zaXR5IGJhbmQgW2lzb21pbiwgaXNvbWF4XSBvdmVyIDDigJMyNTUuICovXG4gIHNldElzb1JhbmdlKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIDNEIHBsb3QgdHlwZXMgKFNVUkZBQ0UgLyBTQ0FUVEVSM0QgLyBJU09TVVJGQUNFXG4gKiBzY2VuZXMpLiBDYXBhYmlsaXR5LWdhdGVkIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZFxuICogdGhhdCByZW5kZXJzIDNEIHNjZW5lcyBleHBvc2VzIGl0LCB2aWEgYElWaXN1YWxpemVyLmdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlFxuICogdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsIGBzZXRTdXJmYWNlRHJhZ01vZGVgL2ByZXNldFN1cmZhY2VDYW1lcmFgIHNpbGVudGx5XG4gKiBuby1vcCBvbiAyRC1vbmx5IGJhY2tlbmRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdXJmYWNlM2RDb250cm9scyB7XG4gIC8qKiBTd2l0Y2ggdGhlIDNEIHNjZW5lIGludGVyYWN0aW9uIG1vZGUgKG9yYml0IC8gdHVybnRhYmxlIC8gcGFuIC8gem9vbSkuICovXG4gIHNldFN1cmZhY2VEcmFnTW9kZShtb2RlOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogUmVzZXQgdGhlIDNEIHNjZW5lIGNhbWVyYSB0byBpdHMgZGVmYXVsdCBleWUgcG9zaXRpb24uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuICAvKiogVG9nZ2xlIHRoZSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyBvbi9vZmYuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZSBuYXBhcmktanMgV2ViR1BVXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZSBiYWNrZW5kIHJlbmRlcnMgb25lIChqaXQtdWkjMTAyKS4gKi9cbiAgc2V0QXhlc1Zpc2libGU/KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgYXhlcyBnaXptbyBpcyBjdXJyZW50bHkgc2hvd24gKGZvciBpbml0aWFsaXppbmcgdGhlIHRvZ2dsZSBVSSkuIE9wdGlvbmFsLiAqL1xuICBheGVzVmlzaWJsZT8oKTogYm9vbGVhbjtcbiAgLyoqIFJlbmRlciB0aGUgc3VyZmFjZSBhcyBhIHdpcmVmcmFtZSAoZWRnZXMpIGluc3RlYWQgb2YgYSBmaWxsZWQgc3VyZmFjZS4gT3B0aW9uYWwg4oCUIG9ubHkgdGhlXG4gICAqICBuYXBhcmktanMgV2ViR1BVIHN1cmZhY2UgYmFja2VuZCBzdXBwb3J0cyBpdCAoaml0LXVpIzEwMikuICovXG4gIHNldFdpcmVmcmFtZT8ob246IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgc3VyZmFjZSBpcyBjdXJyZW50bHkgZHJhd24gYXMgYSB3aXJlZnJhbWUgKGZvciBpbml0aWFsaXppbmcgdGhlIHRvZ2dsZSBVSSkuICovXG4gIHdpcmVmcmFtZT8oKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgTElORSAoaW50ZW5zaXR5LXByb2ZpbGUpIHBsb3QgdHlwZS4gQ2FwYWJpbGl0eS1nYXRlZFxuICogbGlrZSB7QGxpbmsgSUlzb3N1cmZhY2VDb250cm9sc306IG9ubHkgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyB0aGUgbGluZS1ST0kgL1xuICogaW5zZXQgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlDb250cm9scygpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Q29udHJvbHMge1xuICAvKiogQWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IHBhbGV0dGUgY29sb3VyKSBhbmQgaXRzIGluc2V0IHRyYWNlLlxuICAgKiAgUmV0dXJucyB0aGUgY3JlYXRlZCByZWdpb24gc28gdGhlIGNhbGxlciBjYW4gc2VsZWN0IGl0IG9uIHRoZSBhY3RpdmVcbiAgICogIGJhY2tlbmQsIG9yIG51bGwgaWYgbm8gaW1hZ2UgZXh0ZW50IGlzIGtub3duIHlldC4gKi9cbiAgYWRkUHJvZmlsZUxpbmUoKTogUmVnaW9uIHwgbnVsbDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZTogYW55KTogdm9pZDtcbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IHZvaWQ7XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+O1xufVxuXG4vKipcbiAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nIChQbG90VHlwZS5MSU5FKS4gVGhlIHNhbXBsaW5nICpzb3VyY2UqIGxpdmVzIGluIHRoZVxuICogUGxvdGx5IGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spOyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dGVzIG9ubHkgdGhlXG4gKiB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIHRoYXQgZHJpdmVzIHJlLXNhbXBsaW5nIGF0IHRoZSBjdXJyZW50IHpvb20uIEVhY2hcbiAqIGJhY2tlbmQgaW1wbGVtZW50cyB0aGUgcGFydCBpdCBvd25zIGFuZCBuby1vcHMgdGhlIHJlc3Qg4oCUIG1pcnJvcmluZyB0aGVcbiAqIGRlcHJlY2F0ZWQgbm8tb3AgcGF0dGVybiBvbiB7QGxpbmsgSURhdGFSZW5kZXJlcn0g4oCUIHNvIHRoZSBjb250cmFjdCBpcyB1bmlmb3JtXG4gKiBhbmQgYSBjb25zdW1lciBjYW4gZGVwZW5kIG9uIGBJVmlzdWFsaXplcmAgYWxvbmUgKG5vIGNvbmNyZXRlLXR5cGUgcmVhY2gtaW4pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyB7XG4gIC8qKiBQb3B1bGF0ZSB0aGUgaW50ZW5zaXR5LXNhbXBsaW5nIGNhY2hlIGZvciB0aGUgY3VycmVudCBpbWFnZS9zbGljZSBzbyB0aGVcbiAgICogIGxpbmUtUk9JIHByb2ZpbGVzIGhhdmUgcGl4ZWwgZGF0YS4gUmVhbCBvbiBQbG90bHk7IG5vLW9wIG9uIE9TRC4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gUmVhbCBvbiBQbG90bHk7IG5vLW9wIG9uIE9TRC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIFZpc2libGUtcmVnaW9uIGNoYW5nZXMgKGltYWdlLXBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlldyBzZXR0bGVzLFxuICAgKiAgc28gdGhlIGluc2V0IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbS4gUmVhbCBvbiBPU0Q7IGVtcHR5IG9uIFBsb3RseVxuICAgKiAgKGl0cyBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSBpbnN0ZWFkKS4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT47XG59XG5cbi8qKiBDb21wb3NpdGUgY29udHJhY3QgYSB2aXN1YWxpemF0aW9uIGJhY2tlbmQgaW1wbGVtZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXIgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLFxuICBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogSXNvc3VyZmFjZSBjb250cm9scyB3aGVuIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIGBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2VgLFxuICAgKiAgZWxzZSBudWxsIOKAlCBzbyBjb25zdW1lcnMgZ2F0ZSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBub3QgYSBuby1vcCBtZXRob2QuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzIHdoZW4gdGhlIGJhY2tlbmQgcmVuZGVycyB0aGUgTElORSBwbG90IHR5cGUsXG4gICAqICBlbHNlIG51bGwuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGw7XG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyB3aGVuIHRoaXMgYmFja2VuZCByZW5kZXJzIDNEIHBsb3QgdHlwZXMsIGVsc2UgbnVsbCDigJRcbiAgICogIHRoZSBjYXBhYmlsaXR5LWdhdGVkIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZCB0b3AtbGV2ZWxcbiAgICogIGBzZXRTdXJmYWNlRHJhZ01vZGVgL2ByZXNldFN1cmZhY2VDYW1lcmFgLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICAvKiogQmlubmVkIGludGVuc2l0eSBoaXN0b2dyYW0gZm9yIGEgY2hhbm5lbCBmcm9tIHRoZSBjdXJyZW50bHktZGlzcGxheWVkXG4gICAqICBwaXhlbHMsIG9yIG51bGwgd2hlbiBub25lIGFyZSBhdmFpbGFibGUuIEZlZWRzIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbVxuICAgKiAgcGFuZS4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbDtcbiAgLyoqIEFzeW5jIGhpc3RvZ3JhbSBzdHJlYW0g4oCUIG5hdGl2ZSBiaXQgZGVwdGggZm9yID44LWJpdCBpbWFnZXMgKHNlcnZlciksIGVsc2VcbiAgICogIHRoZSA4LWJpdCBjbGllbnQgaGlzdG9ncmFtLiAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPjtcbiAgLyoqIEV4cG9ydCB0aGUgZGlzcGxheWVkIGltYWdlLCBjb21wb3NpdGVkIHdpdGggdGhlIGN1cnJlbnQgZGlzcGxheSBzZXR0aW5ncyxcbiAgICogIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGRvd25sb2FkLiAqL1xuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZDtcbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRlxuICAgKiAgKG5hdGl2ZSBiaXQgZGVwdGgpLiBOby1vcCBvbiBiYWNrZW5kcyB0aGF0IGNhbid0IHByb3ZpZGUgaXQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZDtcbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBESSB0b2tlbiBmb3IgdGhlIGFjdGl2ZSB2aXN1YWxpemF0aW9uIGJhY2tlbmQuIEJpbmQgaXQgKGB1c2VFeGlzdGluZ2ApIHRvIHRoZVxuICogYFJvdXRpbmdWaXN1YWxpemVyU2VydmljZWAsIHdoaWNoIHNlbGVjdHMgUGxvdGx5IHZzIE9wZW5TZWFkcmFnb24gcGVyIHBsb3RcbiAqIHR5cGUuIENvbnN1bWVycyDigJQgaW5jbHVkaW5nIHRoaXMgbGlicmFyeSdzIG93biBgVmlzdWFsaXplckNvbXBvbmVudGAg4oCUXG4gKiBpbmplY3QgYElWaXN1YWxpemVyYCB0aHJvdWdoIHRoaXMgdG9rZW4gcmF0aGVyIHRoYW4gdGhlIGNvbmNyZXRlIHJvdXRlciwgc29cbiAqIHRoZSByb3V0aW5nL2ZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGNhbiBjaGFuZ2Ugd2l0aG91dCB0b3VjaGluZyBjb25zdHJ1Y3RvcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBWSVNVQUxJWkVSID0gbmV3IEluamVjdGlvblRva2VuPElWaXN1YWxpemVyPignVklTVUFMSVpFUicpO1xuIl19
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const VIZ_CONFIG = new InjectionToken('VIZ_CONFIG');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml6LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpei1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBCL0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBTdGF0aWMgY29uZmlndXJhdGlvbiB0aGUgdmlzdWFsaXphdGlvbiBsaWJyYXJ5IG5lZWRzIGZyb20gdGhlIGhvc3QsIHN1cHBsaWVkXG4gKiB2aWEgREkgc28gdGhlIGxpYnJhcnkgbmV2ZXIgaW1wb3J0cyB0aGUgYXBwJ3MgYGVudmlyb25tZW50YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpDb25maWcge1xuICAvKiogQmFzZSBVUkwgb2YgdGhlIHRpbGUvY3JvcCBzZXJ2ZXIgKGAvdGlsZWAsIGAvdGlsZXMvaW5mb2AsIHpvb20pLiAqL1xuICBzbGlkZUNyb3BTZXJ2ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIENTUyBzZWxlY3RvciBmb3IgYSBob3N0IGVsZW1lbnQgd2hvc2UgY3VycmVudCB3aWR0aCB0aGUgUmVnaW9uXG4gICAqIEVkaXRvciBkaWFsb2cgc2hvdWxkIG1hdGNoIHdoZW4gaXQgZmlyc3Qgb3BlbnMgKGUuZy4gdGhlIGFwcCdzIHJpZ2h0XG4gICAqIHBhbmVsKS4gTWVhc3VyZWQgb25jZSBwZXIgb3BlbiDigJQgaXQgZG9lcyBub3QgdHJhY2sgbGF0ZXIgcmVzaXplcy4gV2hlblxuICAgKiBhYnNlbnQgb3IgdGhlIGVsZW1lbnQgaXNuJ3QgZm91bmQsIHRoZSBkaWFsb2cgZmFsbHMgYmFjayB0byBhIHF1YXJ0ZXIgb2ZcbiAgICogdGhlIHBhZ2Ugd2lkdGggKDI1dncpLlxuICAgKi9cbiAgcmVnaW9uRWRpdG9yV2lkdGhTZWxlY3Rvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdCBpbiB0byB0aGUgZXhwZXJpbWVudGFsIFdlYkdQVSAqKm5hcGFyaS1qcyoqIGJhY2tlbmQgZm9yIHRoZSBJTUFHRSBwbG90IHR5cGVcbiAgICogKGppdC11aSMxMDIpLiBXaGVuIGB0cnVlYCwgdGhlIHJvdXRlciByZW5kZXJzIGltYWdlcyB0aHJvdWdoIG5hcGFyaS1qcyB3aXRoIE9wZW5TZWFkcmFnb25cbiAgICogYXMgdGhlIGZhbGxiYWNrOyB3aGVuIGFic2VudC9mYWxzZSwgT3BlblNlYWRyYWdvbiByZW1haW5zIHRoZSBkZWZhdWx0LiBPdGhlciBwbG90IHR5cGVzXG4gICAqIGFyZSB1bmFmZmVjdGVkLlxuICAgKi9cbiAgdXNlTmFwYXJpUmVuZGVyZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVklaX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWaXpDb25maWc+KCdWSVpfQ09ORklHJyk7XG4iXX0=
@@ -0,0 +1,260 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, Output, Renderer2, ViewChild, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@angular/forms";
5
+ export class HexColorPickerComponent {
6
+ static { this.DROPDOWN_WIDTH = 280; }
7
+ normalizeHexColor(val) {
8
+ return val ? val.toUpperCase() : val;
9
+ }
10
+ get color() {
11
+ return this._color;
12
+ }
13
+ set color(val) {
14
+ const normalizedColor = this.normalizeHexColor(val);
15
+ this._color = normalizedColor;
16
+ this.syncFromHex(normalizedColor);
17
+ }
18
+ constructor(elRef, renderer, cdr) {
19
+ this.elRef = elRef;
20
+ this.renderer = renderer;
21
+ this.cdr = cdr;
22
+ this._color = '#000000';
23
+ this.colorChange = new EventEmitter();
24
+ this.open = false;
25
+ // HSL values
26
+ this.hue = 0;
27
+ this.saturation = 100;
28
+ this.lightness = 50;
29
+ // RGB values
30
+ this.red = 0;
31
+ this.green = 0;
32
+ this.blue = 0;
33
+ // Honeycomb color palette
34
+ // Honeycomb color palette from w3schools — 7 per side, 13 rows (7→13→7)
35
+ this.colorRows = [
36
+ // Row 1: 7
37
+ ['#003366', '#336699', '#3366CC', '#003399', '#000099', '#0000CC', '#000066'],
38
+ // Row 2: 8
39
+ ['#006666', '#006699', '#0099CC', '#0066CC', '#0033CC', '#0000FF', '#3333FF', '#333399'],
40
+ // Row 3: 9
41
+ ['#669999', '#009999', '#33CCCC', '#00CCFF', '#0099FF', '#0066FF', '#3366FF', '#3333CC', '#666699'],
42
+ // Row 4: 10
43
+ ['#339966', '#00CC99', '#00FFCC', '#00FFFF', '#33CCFF', '#3399FF', '#6699FF', '#6666FF', '#6600FF', '#6600CC'],
44
+ // Row 5: 11
45
+ ['#339933', '#00CC66', '#00FF99', '#66FFCC', '#66FFFF', '#66CCFF', '#99CCFF', '#9999FF', '#9966FF', '#9933FF', '#9900FF'],
46
+ // Row 6: 12
47
+ ['#006600', '#00CC00', '#00FF00', '#66FF99', '#99FFCC', '#CCFFFF', '#CCCCFF', '#CC99FF', '#CC66FF', '#CC33FF', '#CC00FF', '#9900CC'],
48
+ // Row 7: 13 (center)
49
+ ['#003300', '#009933', '#33CC33', '#66FF66', '#99FF99', '#CCFFCC', '#FFFFFF', '#FFCCFF', '#FF99FF', '#FF66FF', '#FF00FF', '#CC00CC', '#660066'],
50
+ // Row 8: 12
51
+ ['#336600', '#009900', '#66FF33', '#99FF66', '#CCFF99', '#FFFFCC', '#FFCCCC', '#FF99CC', '#FF66CC', '#FF33CC', '#CC0099', '#993399'],
52
+ // Row 9: 11
53
+ ['#333300', '#669900', '#99FF33', '#CCFF66', '#FFFF99', '#FFCC99', '#FF9999', '#FF6699', '#FF3399', '#CC3399', '#990099'],
54
+ // Row 10: 10
55
+ ['#666633', '#99CC00', '#CCFF33', '#FFFF66', '#FFCC66', '#FF9966', '#FF6666', '#FF0066', '#CC6699', '#993366'],
56
+ // Row 11: 9
57
+ ['#999966', '#CCCC00', '#FFFF00', '#FFCC00', '#FF9933', '#FF6600', '#FF5050', '#CC0066', '#660033'],
58
+ // Row 12: 8
59
+ ['#996633', '#CC9900', '#FF9900', '#CC6600', '#FF3300', '#FF0000', '#CC0000', '#990033'],
60
+ // Row 13: 7
61
+ ['#663300', '#996600', '#CC3300', '#993300', '#990000', '#800000', '#993333'],
62
+ ];
63
+ }
64
+ ngOnDestroy() {
65
+ this.removeDropdownFromBody();
66
+ }
67
+ toggle() {
68
+ this.open = !this.open;
69
+ if (this.open) {
70
+ // Let Angular render the dropdown, then move it to body
71
+ this.cdr.detectChanges();
72
+ this.appendDropdownToBody();
73
+ }
74
+ else {
75
+ this.removeDropdownFromBody();
76
+ }
77
+ }
78
+ appendDropdownToBody() {
79
+ const dropdown = this.dropdownRef?.nativeElement;
80
+ if (!dropdown)
81
+ return;
82
+ const rect = this.swatchBtn.nativeElement.getBoundingClientRect();
83
+ this.renderer.appendChild(document.body, dropdown);
84
+ const vw = window.innerWidth;
85
+ const vh = window.innerHeight;
86
+ const w = HexColorPickerComponent.DROPDOWN_WIDTH;
87
+ // Horizontal: open toward the side with room. When the swatch is on the left
88
+ // half of the viewport, anchor the panel's LEFT edge to it (extend right) so
89
+ // it isn't truncated by the left edge; otherwise anchor its RIGHT edge
90
+ // (extend left). Clamp within the viewport either way.
91
+ let left = rect.left <= vw / 2 ? rect.left : rect.right - w;
92
+ left = Math.max(4, Math.min(left, vw - w - 4));
93
+ // Vertical: below the swatch, flipping above if it would overflow the bottom.
94
+ const h = dropdown.offsetHeight || 0;
95
+ let top = rect.bottom + 4;
96
+ if (h && top + h > vh - 4)
97
+ top = Math.max(4, rect.top - 4 - h);
98
+ this.renderer.setStyle(dropdown, 'left', left + 'px');
99
+ this.renderer.setStyle(dropdown, 'top', top + 'px');
100
+ }
101
+ removeDropdownFromBody() {
102
+ const dropdown = this.dropdownRef?.nativeElement;
103
+ if (dropdown && dropdown.parentElement === document.body) {
104
+ this.renderer.removeChild(document.body, dropdown);
105
+ }
106
+ }
107
+ selectColor(hex) {
108
+ this._color = hex;
109
+ this.syncFromHex(hex);
110
+ this.colorChange.emit(hex);
111
+ }
112
+ selectAndClose(hex) {
113
+ this.selectColor(hex);
114
+ this.close();
115
+ }
116
+ close() {
117
+ this.open = false;
118
+ this.removeDropdownFromBody();
119
+ }
120
+ onHexInput(value) {
121
+ if (/^#[0-9A-Fa-f]{6}$/.test(value)) {
122
+ this.selectColor(value);
123
+ }
124
+ }
125
+ onHslChange() {
126
+ const hex = this.hslToHex(this.hue, this.saturation, this.lightness);
127
+ this._color = hex;
128
+ this.syncRgbFromHex(hex);
129
+ this.colorChange.emit(hex);
130
+ }
131
+ onRgbChange() {
132
+ const red = Math.max(0, Math.min(255, this.red));
133
+ const green = Math.max(0, Math.min(255, this.green));
134
+ const blue = Math.max(0, Math.min(255, this.blue));
135
+ this.red = red;
136
+ this.green = green;
137
+ this.blue = blue;
138
+ const hex = this.rgbToHex(red, green, blue);
139
+ this._color = hex;
140
+ this.syncHslFromRgb(red, green, blue);
141
+ this.colorChange.emit(hex);
142
+ }
143
+ get hueGradient() {
144
+ const stops = [];
145
+ for (let h = 0; h <= 360; h += 30) {
146
+ stops.push(`hsl(${h}, 100%, 50%)`);
147
+ }
148
+ return `linear-gradient(to right, ${stops.join(', ')})`;
149
+ }
150
+ get satGradient() {
151
+ return `linear-gradient(to right, hsl(${this.hue}, 0%, ${this.lightness}%), hsl(${this.hue}, 100%, ${this.lightness}%))`;
152
+ }
153
+ get lightGradient() {
154
+ return `linear-gradient(to right, hsl(${this.hue}, ${this.saturation}%, 0%), hsl(${this.hue}, ${this.saturation}%, 50%), hsl(${this.hue}, ${this.saturation}%, 100%))`;
155
+ }
156
+ onDocumentClick(event) {
157
+ if (!this.open)
158
+ return;
159
+ const target = event.target;
160
+ const clickedInside = this.elRef.nativeElement.contains(target) || this.dropdownRef?.nativeElement.contains(target);
161
+ if (!clickedInside) {
162
+ this.close();
163
+ }
164
+ }
165
+ // --- Color conversion utilities ---
166
+ syncFromHex(hex) {
167
+ const rgb = this.hexToRgb(hex);
168
+ if (rgb) {
169
+ this.red = rgb.r;
170
+ this.green = rgb.g;
171
+ this.blue = rgb.b;
172
+ this.syncHslFromRgb(rgb.r, rgb.g, rgb.b);
173
+ }
174
+ }
175
+ syncRgbFromHex(hex) {
176
+ const rgb = this.hexToRgb(hex);
177
+ if (rgb) {
178
+ this.red = rgb.r;
179
+ this.green = rgb.g;
180
+ this.blue = rgb.b;
181
+ }
182
+ }
183
+ syncHslFromRgb(r, g, b) {
184
+ const hsl = this.rgbToHsl(r, g, b);
185
+ this.hue = hsl.h;
186
+ this.saturation = hsl.s;
187
+ this.lightness = hsl.l;
188
+ }
189
+ hexToRgb(hex) {
190
+ const match = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
191
+ return match
192
+ ? {
193
+ r: parseInt(match[1], 16),
194
+ g: parseInt(match[2], 16),
195
+ b: parseInt(match[3], 16),
196
+ }
197
+ : null;
198
+ }
199
+ rgbToHex(r, g, b) {
200
+ const toHex = (n) => Math.max(0, Math.min(255, Math.round(n)))
201
+ .toString(16)
202
+ .padStart(2, '0');
203
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();
204
+ }
205
+ rgbToHsl(r, g, b) {
206
+ r /= 255;
207
+ g /= 255;
208
+ b /= 255;
209
+ const max = Math.max(r, g, b), min = Math.min(r, g, b);
210
+ const l = (max + min) / 2;
211
+ let h = 0, s = 0;
212
+ if (max !== min) {
213
+ const d = max - min;
214
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
215
+ switch (max) {
216
+ case r:
217
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
218
+ break;
219
+ case g:
220
+ h = ((b - r) / d + 2) / 6;
221
+ break;
222
+ case b:
223
+ h = ((r - g) / d + 4) / 6;
224
+ break;
225
+ }
226
+ }
227
+ return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };
228
+ }
229
+ hslToHex(h, s, l) {
230
+ s /= 100;
231
+ l /= 100;
232
+ const a = s * Math.min(l, 1 - l);
233
+ const f = (n) => {
234
+ const k = (n + h / 30) % 12;
235
+ const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
236
+ return Math.round(255 * color);
237
+ };
238
+ return this.rgbToHex(f(0), f(8), f(4));
239
+ }
240
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: HexColorPickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
241
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: { color: "color" }, outputs: { colorChange: "colorChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "swatchBtn", first: true, predicate: ["swatchBtn"], descendants: true }, { propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"hex-picker-wrapper\">\n <button #swatchBtn type=\"button\" class=\"hex-picker-swatch\" [style.background]=\"color\"\n (click)=\"toggle()\" [title]=\"color\">\n </button>\n <div #dropdown class=\"hex-picker-dropdown\" [hidden]=\"!open\">\n <!-- Hexagon grid -->\n <div class=\"hex-grid\">\n <div *ngFor=\"let row of colorRows;\"\n class=\"hex-row\">\n <button *ngFor=\"let c of row\"\n type=\"button\"\n class=\"hex-cell\"\n [style.background]=\"c\"\n [class.hex-selected]=\"c === color\"\n [title]=\"c\"\n [attr.aria-label]=\"'Select color ' + c\"\n (click)=\"selectAndClose(c)\">\n </button>\n </div>\n </div>\n\n <!-- Hex input + native picker -->\n <div class=\"hex-picker-footer\">\n <input type=\"text\" class=\"hex-input\" [value]=\"color\"\n (change)=\"onHexInput($any($event.target).value)\"\n maxlength=\"7\" spellcheck=\"false\">\n <input type=\"color\" class=\"native-picker\" [value]=\"color\"\n (input)=\"selectColor($any($event.target).value)\"\n title=\"Open system color picker\">\n </div>\n\n <!-- HSL sliders -->\n <div class=\"slider-section\">\n <div class=\"slider-row\">\n <label>H</label>\n <input type=\"range\" min=\"0\" max=\"360\" [ngModel]=\"hue\"\n (ngModelChange)=\"hue=$event; onHslChange()\"\n class=\"slider slider-hue\" [style.background]=\"hueGradient\">\n <span class=\"slider-value\">{{hue}}</span>\n </div>\n <div class=\"slider-row\">\n <label>S</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"saturation\"\n (ngModelChange)=\"saturation=$event; onHslChange()\"\n class=\"slider slider-sat\" [style.background]=\"satGradient\">\n <span class=\"slider-value\">{{saturation}}</span>\n </div>\n <div class=\"slider-row\">\n <label>L</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"lightness\"\n (ngModelChange)=\"lightness=$event; onHslChange()\"\n class=\"slider slider-light\" [style.background]=\"lightGradient\">\n <span class=\"slider-value\">{{lightness}}</span>\n </div>\n </div>\n\n <!-- RGB inputs -->\n <div class=\"rgb-section\">\n <div class=\"rgb-field\">\n <label>R</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"red\"\n (ngModelChange)=\"red=$event; onRgbChange()\">\n </div>\n <div class=\"rgb-field\">\n <label>G</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"green\"\n (ngModelChange)=\"green=$event; onRgbChange()\">\n </div>\n <div class=\"rgb-field\">\n <label>B</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"blue\"\n (ngModelChange)=\"blue=$event; onRgbChange()\">\n </div>\n </div>\n </div>\n</div>\n", styles: [".hex-picker-wrapper{position:relative;display:inline-block}.hex-picker-swatch{width:2rem;height:2rem;border:2px solid #ccc;border-radius:4px;cursor:pointer;padding:0}.hex-picker-swatch:hover{border-color:#888}.hex-picker-dropdown{position:fixed;z-index:100000;background:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 4px 16px #0000002e;padding:12px;width:280px}.hex-grid{display:flex;flex-direction:column;align-items:center}.hex-row{display:flex;margin-top:-5.75px}.hex-row:first-child{margin-top:0}.hex-cell{width:20px;height:23px;clip-path:polygon(50% 0%,100% 25%,100% 75%,50% 100%,0% 75%,0% 25%);cursor:pointer;transition:transform .1s ease;border:none;flex-shrink:0}.hex-cell:hover,.hex-cell.hex-selected{transform:scale(1.3);z-index:2;position:relative}.hex-picker-footer{margin-top:10px;display:flex;align-items:center;justify-content:center;gap:8px}.native-picker{width:28px;height:28px;border:1px solid #ccc;border-radius:4px;cursor:pointer;padding:1px;flex-shrink:0;background:none}.native-picker::-webkit-color-swatch-wrapper{padding:0}.native-picker::-webkit-color-swatch{border:none;border-radius:3px}.native-picker::-moz-color-swatch{border:none;border-radius:3px}.hex-input{width:80px;text-align:center;font-family:monospace;font-size:.85rem;border:1px solid #ccc;border-radius:4px;padding:4px 6px}.hex-input:focus{outline:2px solid #1976D2;border-color:transparent}.slider-section{margin-top:10px;border-top:1px solid #eee;padding-top:8px}.slider-row{display:flex;align-items:center;gap:6px;margin-bottom:4px}.slider-row label{width:14px;font-size:.75rem;font-weight:600;color:#555;text-align:center}.slider-row .slider-value{width:28px;font-size:.75rem;font-family:monospace;color:#555;text-align:right}.slider{flex:1;-webkit-appearance:none;appearance:none;height:10px;border-radius:5px;outline:none;cursor:pointer}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid #555;cursor:pointer;box-shadow:0 1px 3px #0000004d}.slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid #555;cursor:pointer;box-shadow:0 1px 3px #0000004d}.rgb-section{margin-top:8px;border-top:1px solid #eee;padding-top:8px;display:flex;justify-content:center;gap:8px}.rgb-field{display:flex;align-items:center;gap:4px}.rgb-field label{font-size:.75rem;font-weight:600;color:#555}.rgb-field input[type=number]{width:48px;text-align:center;font-family:monospace;font-size:.8rem;border:1px solid #ccc;border-radius:4px;padding:3px 2px;-moz-appearance:textfield}.rgb-field input[type=number]:focus{outline:2px solid #1976D2;border-color:transparent}.rgb-field input[type=number]::-webkit-inner-spin-button,.rgb-field input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
242
+ }
243
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: HexColorPickerComponent, decorators: [{
244
+ type: Component,
245
+ args: [{ selector: 'hex-color-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"hex-picker-wrapper\">\n <button #swatchBtn type=\"button\" class=\"hex-picker-swatch\" [style.background]=\"color\"\n (click)=\"toggle()\" [title]=\"color\">\n </button>\n <div #dropdown class=\"hex-picker-dropdown\" [hidden]=\"!open\">\n <!-- Hexagon grid -->\n <div class=\"hex-grid\">\n <div *ngFor=\"let row of colorRows;\"\n class=\"hex-row\">\n <button *ngFor=\"let c of row\"\n type=\"button\"\n class=\"hex-cell\"\n [style.background]=\"c\"\n [class.hex-selected]=\"c === color\"\n [title]=\"c\"\n [attr.aria-label]=\"'Select color ' + c\"\n (click)=\"selectAndClose(c)\">\n </button>\n </div>\n </div>\n\n <!-- Hex input + native picker -->\n <div class=\"hex-picker-footer\">\n <input type=\"text\" class=\"hex-input\" [value]=\"color\"\n (change)=\"onHexInput($any($event.target).value)\"\n maxlength=\"7\" spellcheck=\"false\">\n <input type=\"color\" class=\"native-picker\" [value]=\"color\"\n (input)=\"selectColor($any($event.target).value)\"\n title=\"Open system color picker\">\n </div>\n\n <!-- HSL sliders -->\n <div class=\"slider-section\">\n <div class=\"slider-row\">\n <label>H</label>\n <input type=\"range\" min=\"0\" max=\"360\" [ngModel]=\"hue\"\n (ngModelChange)=\"hue=$event; onHslChange()\"\n class=\"slider slider-hue\" [style.background]=\"hueGradient\">\n <span class=\"slider-value\">{{hue}}</span>\n </div>\n <div class=\"slider-row\">\n <label>S</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"saturation\"\n (ngModelChange)=\"saturation=$event; onHslChange()\"\n class=\"slider slider-sat\" [style.background]=\"satGradient\">\n <span class=\"slider-value\">{{saturation}}</span>\n </div>\n <div class=\"slider-row\">\n <label>L</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"lightness\"\n (ngModelChange)=\"lightness=$event; onHslChange()\"\n class=\"slider slider-light\" [style.background]=\"lightGradient\">\n <span class=\"slider-value\">{{lightness}}</span>\n </div>\n </div>\n\n <!-- RGB inputs -->\n <div class=\"rgb-section\">\n <div class=\"rgb-field\">\n <label>R</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"red\"\n (ngModelChange)=\"red=$event; onRgbChange()\">\n </div>\n <div class=\"rgb-field\">\n <label>G</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"green\"\n (ngModelChange)=\"green=$event; onRgbChange()\">\n </div>\n <div class=\"rgb-field\">\n <label>B</label>\n <input type=\"number\" min=\"0\" max=\"255\" [ngModel]=\"blue\"\n (ngModelChange)=\"blue=$event; onRgbChange()\">\n </div>\n </div>\n </div>\n</div>\n", styles: [".hex-picker-wrapper{position:relative;display:inline-block}.hex-picker-swatch{width:2rem;height:2rem;border:2px solid #ccc;border-radius:4px;cursor:pointer;padding:0}.hex-picker-swatch:hover{border-color:#888}.hex-picker-dropdown{position:fixed;z-index:100000;background:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 4px 16px #0000002e;padding:12px;width:280px}.hex-grid{display:flex;flex-direction:column;align-items:center}.hex-row{display:flex;margin-top:-5.75px}.hex-row:first-child{margin-top:0}.hex-cell{width:20px;height:23px;clip-path:polygon(50% 0%,100% 25%,100% 75%,50% 100%,0% 75%,0% 25%);cursor:pointer;transition:transform .1s ease;border:none;flex-shrink:0}.hex-cell:hover,.hex-cell.hex-selected{transform:scale(1.3);z-index:2;position:relative}.hex-picker-footer{margin-top:10px;display:flex;align-items:center;justify-content:center;gap:8px}.native-picker{width:28px;height:28px;border:1px solid #ccc;border-radius:4px;cursor:pointer;padding:1px;flex-shrink:0;background:none}.native-picker::-webkit-color-swatch-wrapper{padding:0}.native-picker::-webkit-color-swatch{border:none;border-radius:3px}.native-picker::-moz-color-swatch{border:none;border-radius:3px}.hex-input{width:80px;text-align:center;font-family:monospace;font-size:.85rem;border:1px solid #ccc;border-radius:4px;padding:4px 6px}.hex-input:focus{outline:2px solid #1976D2;border-color:transparent}.slider-section{margin-top:10px;border-top:1px solid #eee;padding-top:8px}.slider-row{display:flex;align-items:center;gap:6px;margin-bottom:4px}.slider-row label{width:14px;font-size:.75rem;font-weight:600;color:#555;text-align:center}.slider-row .slider-value{width:28px;font-size:.75rem;font-family:monospace;color:#555;text-align:right}.slider{flex:1;-webkit-appearance:none;appearance:none;height:10px;border-radius:5px;outline:none;cursor:pointer}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid #555;cursor:pointer;box-shadow:0 1px 3px #0000004d}.slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid #555;cursor:pointer;box-shadow:0 1px 3px #0000004d}.rgb-section{margin-top:8px;border-top:1px solid #eee;padding-top:8px;display:flex;justify-content:center;gap:8px}.rgb-field{display:flex;align-items:center;gap:4px}.rgb-field label{font-size:.75rem;font-weight:600;color:#555}.rgb-field input[type=number]{width:48px;text-align:center;font-family:monospace;font-size:.8rem;border:1px solid #ccc;border-radius:4px;padding:3px 2px;-moz-appearance:textfield}.rgb-field input[type=number]:focus{outline:2px solid #1976D2;border-color:transparent}.rgb-field input[type=number]::-webkit-inner-spin-button,.rgb-field input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}\n"] }]
246
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { colorChange: [{
247
+ type: Output
248
+ }], swatchBtn: [{
249
+ type: ViewChild,
250
+ args: ['swatchBtn']
251
+ }], dropdownRef: [{
252
+ type: ViewChild,
253
+ args: ['dropdown']
254
+ }], color: [{
255
+ type: Input
256
+ }], onDocumentClick: [{
257
+ type: HostListener,
258
+ args: ['document:click', ['$event']]
259
+ }] } });
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDakUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQzNFLE1BQU0sZUFBZSxDQUFDOzs7O0FBYXZCLE1BQU0sT0FBTyx1QkFBdUI7YUFFVixtQkFBYyxHQUFHLEdBQUcsQUFBTixDQUFPO0lBb0RyQyxpQkFBaUIsQ0FBQyxHQUFXO1FBQ25DLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFXO1FBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxZQUFvQixLQUFpQixFQUFVLFFBQW1CLEVBQVUsR0FBc0I7UUFBOUUsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWhFMUYsV0FB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QUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDOzhHQTdRVSx1QkFBdUI7a0dBQXZCLHVCQUF1QixxWUNoQnBDLG9pR0E0RUE7OzJGRDVEYSx1QkFBdUI7a0JBWG5DLFNBQVM7K0JBR0Usa0JBQWtCLG1CQU1YLHVCQUF1QixDQUFDLE1BQU07dUlBUXJDLFdBQVc7c0JBQXBCLE1BQU07Z0JBSWlCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDQyxXQUFXO3NCQUFqQyxTQUFTO3VCQUFDLFVBQVU7Z0JBZ0RqQixLQUFLO3NCQURSLEtBQUs7Z0JBcUhOLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBDYW5vbmljYWwgcHJlZml4ZWQgc2VsZWN0b3IgZmlyc3Q7IHRoZSB1bnByZWZpeGVkIG9yaWdpbmFsIGlzIGtlcHQgYXMgYW5cbiAgLy8gYWxpYXMgZm9yIG9uZSByZWxlYXNlIChwcmUtcHVibGljYXRpb24gYmFjay1jb21wYXQpLlxuICBzZWxlY3RvcjogJ2hleC1jb2xvci1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gT25QdXNoIHNvIHRoZSBhbHdheXMtaW4tRE9NIChidXQgaGlkZGVuKSBwaWNrZXIgcGFuZWwg4oCUIGEgfjEzMC1jZWxsIGhvbmV5Y29tYlxuICAvLyBncmlkICsgc2xpZGVycyDigJQgaXNuJ3QgcmUtY2hlY2tlZCBvbiBldmVyeSBzY3JvbGwtdHJpZ2dlcmVkIGNoYW5nZSBkZXRlY3Rpb24uXG4gIC8vIElucHV0cyAoYGNvbG9yYCkgYW5kIHRoZSBwaWNrZXIncyBvd24gZXZlbnRzIHN0aWxsIG1hcmsgaXQgZm9yIGNoZWNrLiAoaml0LXVpIzcwKVxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERST1BET1dOX1dJRFRIID0gMjgwO1xuXG4gIHByaXZhdGUgX2NvbG9yID0gJyMwMDAwMDAnO1xuXG4gIEBPdXRwdXQoKSBjb2xvckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIG9wZW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdzd2F0Y2hCdG4nKSBzd2F0Y2hCdG4hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nKSBkcm9wZG93blJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIC8vIEhTTCB2YWx1ZXNcbiAgaHVlID0gMDtcbiAgc2F0dXJhdGlvbiA9IDEwMDtcbiAgbGlnaHRuZXNzID0gNTA7XG5cbiAgLy8gUkdCIHZhbHVlc1xuICByZWQgPSAwO1xuICBncmVlbiA9IDA7XG4gIGJsdWUgPSAwO1xuXG4gIC8vIEhvbmV5Y29tYiBjb2xvciBwYWxldHRlXG4gIC8vIEhvbmV5Y29tYiBjb2xvciBwYWxldHRlIGZyb20gdzNzY2hvb2xzIOKAlCA3IHBlciBzaWRlLCAxMyByb3dzICg34oaSMTPihpI3KVxuICByZWFkb25seSBjb2xvclJvd3M6IHN0cmluZ1tdW10gPSBbXG4gICAgLy8gUm93IDE6IDdcbiAgICBbJyMwMDMzNjYnLCAnIzMzNjY5OScsICcjMzM2NkNDJywgJyMwMDMzOTknLCAnIzAwMDA5OScsICcjMDAwMENDJywgJyMwMDAwNjYnXSxcbiAgICAvLyBSb3cgMjogOFxuICAgIFsnIzAwNjY2NicsICcjMDA2Njk5JywgJyMwMDk5Q0MnLCAnIzAwNjZDQycsICcjMDAzM0NDJywgJyMwMDAwRkYnLCAnIzMzMzNGRicsICcjMzMzMzk5J10sXG4gICAgLy8gUm93IDM6IDlcbiAgICBbJyM2Njk5OTknLCAnIzAwOTk5OScsICcjMzNDQ0NDJywgJyMwMENDRkYnLCAnIzAwOTlGRicsICcjMDA2NkZGJywgJyMzMzY2RkYnLCAnIzMzMzNDQycsICcjNjY2Njk5J10sXG4gICAgLy8gUm93IDQ6IDEwXG4gICAgWycjMzM5OTY2JywgJyMwMENDOTknLCAnIzAwRkZDQycsICcjMDBGRkZGJywgJyMzM0NDRkYnLCAnIzMzOTlGRicsICcjNjY5OUZGJywgJyM2NjY2RkYnLCAnIzY2MDBGRicsICcjNjYwMENDJ10sXG4gICAgLy8gUm93IDU6IDExXG4gICAgWycjMzM5OTMzJywgJyMwMENDNjYnLCAnIzAwRkY5OScsICcjNjZGRkNDJywgJyM2NkZGRkYnLCAnIzY2Q0NGRicsICcjOTlDQ0ZGJywgJyM5OTk5RkYnLCAnIzk5NjZGRicsICcjOTkzM0ZGJywgJyM5OTAwRkYnXSxcbiAgICAvLyBSb3cgNjogMTJcbiAgICBbJyMwMDY2MDAnLCAnIzAwQ0MwMCcsICcjMDBGRjAwJywgJyM2NkZGOTknLCAnIzk5RkZDQycsICcjQ0NGRkZGJywgJyNDQ0NDRkYnLCAnI0NDOTlGRicsICcjQ0M2NkZGJywgJyNDQzMzRkYnLCAnI0NDMDBGRicsICcjOTkwMENDJ10sXG4gICAgLy8gUm93IDc6IDEzIChjZW50ZXIpXG4gICAgWycjMDAzMzAwJywgJyMwMDk5MzMnLCAnIzMzQ0MzMycsICcjNjZGRjY2JywgJyM5OUZGOTknLCAnI0NDRkZDQycsICcjRkZGRkZGJywgJyNGRkNDRkYnLCAnI0ZGOTlGRicsICcjRkY2NkZGJywgJyNGRjAwRkYnLCAnI0NDMDBDQycsICcjNjYwMDY2J10sXG4gICAgLy8gUm93IDg6IDEyXG4gICAgWycjMzM2NjAwJywgJyMwMDk5MDAnLCAnIzY2RkYzMycsICcjOTlGRjY2JywgJyNDQ0ZGOTknLCAnI0ZGRkZDQycsICcjRkZDQ0NDJywgJyNGRjk5Q0MnLCAnI0ZGNjZDQycsICcjRkYzM0NDJywgJyNDQzAwOTknLCAnIzk5MzM5OSddLFxuICAgIC8vIFJvdyA5OiAxMVxuICAgIFsnIzMzMzMwMCcsICcjNjY5OTAwJywgJyM5OUZGMzMnLCAnI0NDRkY2NicsICcjRkZGRjk5JywgJyNGRkNDOTknLCAnI0ZGOTk5OScsICcjRkY2Njk5JywgJyNGRjMzOTknLCAnI0NDMzM5OScsICcjOTkwMDk5J10sXG4gICAgLy8gUm93IDEwOiAxMFxuICAgIFsnIzY2NjYzMycsICcjOTlDQzAwJywgJyNDQ0ZGMzMnLCAnI0ZGRkY2NicsICcjRkZDQzY2JywgJyNGRjk5NjYnLCAnI0ZGNjY2NicsICcjRkYwMDY2JywgJyNDQzY2OTknLCAnIzk5MzM2NiddLFxuICAgIC8vIFJvdyAxMTogOVxuICAgIFsnIzk5OTk2NicsICcjQ0NDQzAwJywgJyNGRkZGMDAnLCAnI0ZGQ0MwMCcsICcjRkY5OTMzJywgJyNGRjY2MDAnLCAnI0ZGNTA1MCcsICcjQ0MwMDY2JywgJyM2NjAwMzMnXSxcbiAgICAvLyBSb3cgMTI6IDhcbiAgICBbJyM5OTY2MzMnLCAnI0NDOTkwMCcsICcjRkY5OTAwJywgJyNDQzY2MDAnLCAnI0ZGMzMwMCcsICcjRkYwMDAwJywgJyNDQzAwMDAnLCAnIzk5MDAzMyddLFxuICAgIC8vIFJvdyAxMzogN1xuICAgIFsnIzY2MzMwMCcsICcjOTk2NjAwJywgJyNDQzMzMDAnLCAnIzk5MzMwMCcsICcjOTkwMDAwJywgJyM4MDAwMDAnLCAnIzk5MzMzMyddLFxuICBdO1xuXG4gIHByaXZhdGUgbm9ybWFsaXplSGV4Q29sb3IodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWwgPyB2YWwudG9VcHBlckNhc2UoKSA6IHZhbDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuICBzZXQgY29sb3IodmFsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29sb3IgPSB0aGlzLm5vcm1hbGl6ZUhleENvbG9yKHZhbCk7XG4gICAgdGhpcy5fY29sb3IgPSBub3JtYWxpemVkQ29sb3I7XG4gICAgdGhpcy5zeW5jRnJvbUhleChub3JtYWxpemVkQ29sb3IpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVEcm9wZG93bkZyb21Cb2R5KCk7XG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICAvLyBMZXQgQW5ndWxhciByZW5kZXIgdGhlIGRyb3Bkb3duLCB0aGVuIG1vdmUgaXQgdG8gYm9keVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5hcHBlbmREcm9wZG93blRvQm9keSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZURyb3Bkb3duRnJvbUJvZHkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZERyb3Bkb3duVG9Cb2R5KCkge1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWRyb3Bkb3duKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuc3dhdGNoQnRuLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBkcm9wZG93bik7XG4gICAgY29uc3QgdncgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBjb25zdCB2aCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB3ID0gSGV4Q29sb3JQaWNrZXJDb21wb25lbnQuRFJPUERPV05fV0lEVEg7XG4gICAgLy8gSG9yaXpvbnRhbDogb3BlbiB0b3dhcmQgdGhlIHNpZGUgd2l0aCByb29tLiBXaGVuIHRoZSBzd2F0Y2ggaXMgb24gdGhlIGxlZnRcbiAgICAvLyBoYWxmIG9mIHRoZSB2aWV3cG9ydCwgYW5jaG9yIHRoZSBwYW5lbCdzIExFRlQgZWRnZSB0byBpdCAoZXh0ZW5kIHJpZ2h0KSBzb1xuICAgIC8vIGl0IGlzbid0IHRydW5jYXRlZCBieSB0aGUgbGVmdCBlZGdlOyBvdGhlcndpc2UgYW5jaG9yIGl0cyBSSUdIVCBlZGdlXG4gICAgLy8gKGV4dGVuZCBsZWZ0KS4gQ2xhbXAgd2l0aGluIHRoZSB2aWV3cG9ydCBlaXRoZXIgd2F5LlxuICAgIGxldCBsZWZ0ID0gcmVjdC5sZWZ0IDw9IHZ3IC8gMiA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQgLSB3O1xuICAgIGxlZnQgPSBNYXRoLm1heCg0LCBNYXRoLm1pbihsZWZ0LCB2dyAtIHcgLSA0KSk7XG4gICAgLy8gVmVydGljYWw6IGJlbG93IHRoZSBzd2F0Y2gsIGZsaXBwaW5nIGFib3ZlIGlmIGl0IHdvdWxkIG92ZXJmbG93IHRoZSBib3R0b20uXG4gICAgY29uc3QgaCA9IGRyb3Bkb3duLm9mZnNldEhlaWdodCB8fCAwO1xuICAgIGxldCB0b3AgPSByZWN0LmJvdHRvbSArIDQ7XG4gICAgaWYgKGggJiYgdG9wICsgaCA+IHZoIC0gNCkgdG9wID0gTWF0aC5tYXgoNCwgcmVjdC50b3AgLSA0IC0gaCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkcm9wZG93biwgJ2xlZnQnLCBsZWZ0ICsgJ3B4Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkcm9wZG93biwgJ3RvcCcsIHRvcCArICdweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcm9wZG93bkZyb21Cb2R5KCkge1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZHJvcGRvd24gJiYgZHJvcGRvd24ucGFyZW50RWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCBkcm9wZG93bik7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q29sb3IoaGV4OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb2xvciA9IGhleDtcbiAgICB0aGlzLnN5bmNGcm9tSGV4KGhleCk7XG4gICAgdGhpcy5jb2xvckNoYW5nZS5lbWl0KGhleCk7XG4gIH1cblxuICBzZWxlY3RBbmRDbG9zZShoZXg6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0Q29sb3IoaGV4KTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyb3Bkb3duRnJvbUJvZHkoKTtcbiAgfVxuXG4gIG9uSGV4SW5wdXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICgvXiNbMC05QS1GYS1mXXs2fSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLnNlbGVjdENvbG9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkhzbENoYW5nZSgpIHtcbiAgICBjb25zdCBoZXggPSB0aGlzLmhzbFRvSGV4KHRoaXMuaHVlLCB0aGlzLnNhdHVyYXRpb24sIHRoaXMubGlnaHRuZXNzKTtcbiAgICB0aGlzLl9jb2xvciA9IGhleDtcbiAgICB0aGlzLnN5bmNSZ2JGcm9tSGV4KGhleCk7XG4gICAgdGhpcy5jb2xvckNoYW5nZS5lbWl0KGhleCk7XG4gIH1cblxuICBvblJnYkNoYW5nZSgpIHtcbiAgICBjb25zdCByZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHRoaXMucmVkKSk7XG4gICAgY29uc3QgZ3JlZW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHRoaXMuZ3JlZW4pKTtcbiAgICBjb25zdCBibHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCB0aGlzLmJsdWUpKTtcblxuICAgIHRoaXMucmVkID0gcmVkO1xuICAgIHRoaXMuZ3JlZW4gPSBncmVlbjtcbiAgICB0aGlzLmJsdWUgPSBibHVlO1xuXG4gICAgY29uc3QgaGV4ID0gdGhpcy5yZ2JUb0hleChyZWQsIGdyZWVuLCBibHVlKTtcbiAgICB0aGlzLl9jb2xvciA9IGhleDtcbiAgICB0aGlzLnN5bmNIc2xGcm9tUmdiKHJlZCwgZ3JlZW4sIGJsdWUpO1xuICAgIHRoaXMuY29sb3JDaGFuZ2UuZW1pdChoZXgpO1xuICB9XG5cbiAgZ2V0IGh1ZUdyYWRpZW50KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RvcHMgPSBbXTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8PSAzNjA7IGggKz0gMzApIHtcbiAgICAgIHN0b3BzLnB1c2goYGhzbCgke2h9LCAxMDAlLCA1MCUpYCk7XG4gICAgfVxuICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAke3N0b3BzLmpvaW4oJywgJyl9KWA7XG4gIH1cblxuICBnZXQgc2F0R3JhZGllbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgaHNsKCR7dGhpcy5odWV9LCAwJSwgJHt0aGlzLmxpZ2h0bmVzc30lKSwgaHNsKCR7dGhpcy5odWV9LCAxMDAlLCAke3RoaXMubGlnaHRuZXNzfSUpKWA7XG4gIH1cblxuICBnZXQgbGlnaHRHcmFkaWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCBoc2woJHt0aGlzLmh1ZX0sICR7dGhpcy5zYXR1cmF0aW9ufSUsIDAlKSwgaHNsKCR7dGhpcy5odWV9LCAke3RoaXMuc2F0dXJhdGlvbn0lLCA1MCUpLCBoc2woJHt0aGlzLmh1ZX0sICR7dGhpcy5zYXR1cmF0aW9ufSUsIDEwMCUpKWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPVxuICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgfHwgdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xuICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBDb2xvciBjb252ZXJzaW9uIHV0aWxpdGllcyAtLS1cblxuICBwcml2YXRlIHN5bmNGcm9tSGV4KGhleDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXgpO1xuICAgIGlmIChyZ2IpIHtcbiAgICAgIHRoaXMucmVkID0gcmdiLnI7XG4gICAgICB0aGlzLmdyZWVuID0gcmdiLmc7XG4gICAgICB0aGlzLmJsdWUgPSByZ2IuYjtcbiAgICAgIHRoaXMuc3luY0hzbEZyb21SZ2IocmdiLnIsIHJnYi5nLCByZ2IuYik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUmdiRnJvbUhleChoZXg6IHN0cmluZykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoaGV4KTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnJlZCA9IHJnYi5yO1xuICAgICAgdGhpcy5ncmVlbiA9IHJnYi5nO1xuICAgICAgdGhpcy5ibHVlID0gcmdiLmI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jSHNsRnJvbVJnYihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgY29uc3QgaHNsID0gdGhpcy5yZ2JUb0hzbChyLCBnLCBiKTtcbiAgICB0aGlzLmh1ZSA9IGhzbC5oO1xuICAgIHRoaXMuc2F0dXJhdGlvbiA9IGhzbC5zO1xuICAgIHRoaXMubGlnaHRuZXNzID0gaHNsLmw7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKTogeyByOiBudW1iZXI7IGc6IG51bWJlcjsgYjogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgIHJldHVybiBtYXRjaFxuICAgICAgPyB7XG4gICAgICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSxcbiAgICAgICAgICBnOiBwYXJzZUludChtYXRjaFsyXSwgMTYpLFxuICAgICAgICAgIGI6IHBhcnNlSW50KG1hdGNoWzNdLCAxNiksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmdiVG9IZXgocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG9IZXggPSAobjogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKG4pKSlcbiAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCMke3RvSGV4KHIpfSR7dG9IZXgoZyl9JHt0b0hleChiKX1gLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBwcml2YXRlIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiB7IGg6IG51bWJlcjsgczogbnVtYmVyOyBsOiBudW1iZXIgfSB7XG4gICAgciAvPSAyNTU7XG4gICAgZyAvPSAyNTU7XG4gICAgYiAvPSAyNTU7XG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIGxldCBoID0gMCxcbiAgICAgIHMgPSAwO1xuICAgIGlmIChtYXggIT09IG1pbikge1xuICAgICAgY29uc3QgZCA9IG1heCAtIG1pbjtcbiAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcbiAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgIGNhc2UgcjpcbiAgICAgICAgICBoID0gKChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApKSAvIDY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZzpcbiAgICAgICAgICBoID0gKChiIC0gcikgLyBkICsgMikgLyA2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgaCA9ICgociAtIGcpIC8gZCArIDQpIC8gNjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgaDogTWF0aC5yb3VuZChoICogMzYwKSwgczogTWF0aC5yb3VuZChzICogMTAwKSwgbDogTWF0aC5yb3VuZChsICogMTAwKSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoc2xUb0hleChoOiBudW1iZXIsIHM6IG51bWJlciwgbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBzIC89IDEwMDtcbiAgICBsIC89IDEwMDtcbiAgICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgICBjb25zdCBmID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgayA9IChuICsgaCAvIDMwKSAlIDEyO1xuICAgICAgY29uc3QgY29sb3IgPSBsIC0gYSAqIE1hdGgubWF4KE1hdGgubWluKGsgLSAzLCA5IC0gaywgMSksIC0xKTtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKDI1NSAqIGNvbG9yKTtcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnJnYlRvSGV4KGYoMCksIGYoOCksIGYoNCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaGV4LXBpY2tlci13cmFwcGVyXCI+XG4gIDxidXR0b24gI3N3YXRjaEJ0biB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoZXgtcGlja2VyLXN3YXRjaFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIiBbdGl0bGVdPVwiY29sb3JcIj5cbiAgPC9idXR0b24+XG4gIDxkaXYgI2Ryb3Bkb3duIGNsYXNzPVwiaGV4LXBpY2tlci1kcm9wZG93blwiIFtoaWRkZW5dPVwiIW9wZW5cIj5cbiAgICA8IS0tIEhleGFnb24gZ3JpZCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaGV4LWdyaWRcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjb2xvclJvd3M7XCJcbiAgICAgICAgICAgY2xhc3M9XCJoZXgtcm93XCI+XG4gICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IGMgb2Ygcm93XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhleC1jZWxsXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJjXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaGV4LXNlbGVjdGVkXT1cImMgPT09IGNvbG9yXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0IGNvbG9yICcgKyBjXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QW5kQ2xvc2UoYylcIj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSGV4IGlucHV0ICsgbmF0aXZlIHBpY2tlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaGV4LXBpY2tlci1mb290ZXJcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiaGV4LWlucHV0XCIgW3ZhbHVlXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSGV4SW5wdXQoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgIG1heGxlbmd0aD1cIjdcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cIm5hdGl2ZS1waWNrZXJcIiBbdmFsdWVdPVwiY29sb3JcIlxuICAgICAgICAgICAgIChpbnB1dCk9XCJzZWxlY3RDb2xvcigkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgdGl0bGU9XCJPcGVuIHN5c3RlbSBjb2xvciBwaWNrZXJcIj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSFNMIHNsaWRlcnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNsaWRlci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLXJvd1wiPlxuICAgICAgICA8bGFiZWw+SDwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMzYwXCIgW25nTW9kZWxdPVwiaHVlXCJcbiAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImh1ZT0kZXZlbnQ7IG9uSHNsQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXIgc2xpZGVyLWh1ZVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImh1ZUdyYWRpZW50XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyLXZhbHVlXCI+e3todWV9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1yb3dcIj5cbiAgICAgICAgPGxhYmVsPlM8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIFtuZ01vZGVsXT1cInNhdHVyYXRpb25cIlxuICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2F0dXJhdGlvbj0kZXZlbnQ7IG9uSHNsQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXIgc2xpZGVyLXNhdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNhdEdyYWRpZW50XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyLXZhbHVlXCI+e3tzYXR1cmF0aW9ufX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItcm93XCI+XG4gICAgICAgIDxsYWJlbD5MPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBbbmdNb2RlbF09XCJsaWdodG5lc3NcIlxuICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibGlnaHRuZXNzPSRldmVudDsgb25Ic2xDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICBjbGFzcz1cInNsaWRlciBzbGlkZXItbGlnaHRcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJsaWdodEdyYWRpZW50XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyLXZhbHVlXCI+e3tsaWdodG5lc3N9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSR0IgaW5wdXRzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJyZ2Itc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJnYi1maWVsZFwiPlxuICAgICAgICA8bGFiZWw+UjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjI1NVwiIFtuZ01vZGVsXT1cInJlZFwiXG4gICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJyZWQ9JGV2ZW50OyBvblJnYkNoYW5nZSgpXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZ2ItZmllbGRcIj5cbiAgICAgICAgPGxhYmVsPkc8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIyNTVcIiBbbmdNb2RlbF09XCJncmVlblwiXG4gICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJncmVlbj0kZXZlbnQ7IG9uUmdiQ2hhbmdlKClcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJnYi1maWVsZFwiPlxuICAgICAgICA8bGFiZWw+QjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjI1NVwiIFtuZ01vZGVsXT1cImJsdWVcIlxuICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiYmx1ZT0kZXZlbnQ7IG9uUmdiQ2hhbmdlKClcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Shared store-delegation base for the OpenSeadragon and napari-js
3
+ * `IVisualizer` backends. The entire `IRegionStore` and `IDisplayOptions`
4
+ * surfaces (plus the two classification-colour members) are pure forwarders to
5
+ * the shared `RegionStore` / `VisualizerStore` in BOTH backends — so they live
6
+ * here once, as a single source of truth, rather than being copied per backend.
7
+ * (This is the "cross-backend behaviour that isn't rendering belongs in a
8
+ * shared abstraction" convention from CLAUDE.md; the extraction closes
9
+ * SHARED-BACKEND-REFACTOR.md.)
10
+ *
11
+ * Backend-specific members — `load`/`plot`/`reset`/zoom/`setZIndex`/readback,
12
+ * the region OVERLAY, tool wiring, histograms, scale bar, tiling, colormap LUT
13
+ * application — deliberately stay in each subclass.
14
+ *
15
+ * NOT `@Injectable`: an abstract base doesn't participate in Angular DI. Each
16
+ * subclass stays `@Injectable`, declares its own injected dependencies
17
+ * (including the two stores), and passes them to `super(...)`. Plotly is
18
+ * intentionally not a subclass — it has its own region model.
19
+ */
20
+ export class BaseStoreVisualizer {
21
+ constructor(regionStore, store) {
22
+ this.regionStore = regionStore;
23
+ this.store = store;
24
+ }
25
+ // ── IRegionStore → shared RegionStore ────────────────────────────────────
26
+ setRegions(regions, showRegionLabel, isRegionSaveOn, fillColor, append) {
27
+ this.regionStore.setRegions(regions, showRegionLabel, isRegionSaveOn, fillColor, append);
28
+ }
29
+ getRegions() { return this.regionStore.getRegions(); }
30
+ getRegionPolygons() { return this.regionStore.getRegionPolygons(); }
31
+ getRegionUpdateEvent() { return this.regionStore.getRegionUpdateEvent(); }
32
+ setSelectedShapeIndices(indices) { this.regionStore.setSelectedShapeIndices(indices); }
33
+ getSelectedShapeIndices$() { return this.regionStore.getSelectedShapeIndices$(); }
34
+ selectRegion(region) { this.regionStore.selectRegion(region); }
35
+ deleteActiveShape() { this.regionStore.deleteActiveShape(); }
36
+ getShowShapeLabel() { return this.regionStore.getShowShapeLabel(); }
37
+ getShapeColor() { return this.regionStore.getShapeColor(); }
38
+ getFillColor() { return this.regionStore.getFillColor(); }
39
+ plotPreviousShapes() { this.regionStore.plotPreviousShapes(); }
40
+ setPreviousShapes(shapes) { this.regionStore.setPreviousShapes(shapes); }
41
+ getPreviousShapes() { return this.regionStore.getPreviousShapes(); }
42
+ undo() { this.regionStore.undo(); }
43
+ redo() { this.regionStore.redo(); }
44
+ canUndo() { return this.regionStore.canUndo(); }
45
+ canRedo() { return this.regionStore.canRedo(); }
46
+ getCanUndo$() { return this.regionStore.getCanUndo$(); }
47
+ getCanRedo$() { return this.regionStore.getCanRedo$(); }
48
+ resetUndoHistory() { this.regionStore.resetUndoHistory(); }
49
+ importRegions(geoJsonStr) { return this.regionStore.importRegions(geoJsonStr); }
50
+ exportRegions(regions) { this.regionStore.exportRegions(regions); }
51
+ getGeoJsonString(regions) { return this.regionStore.getGeoJsonString(regions); }
52
+ // ── Per-slice z-stack regions → RegionStore (jit-ui#93) ──────────────────
53
+ enterStackMode(slices, initialZ, saveLayout) {
54
+ this.regionStore.enterStackMode(slices, initialZ, saveLayout);
55
+ }
56
+ exitStackMode() { this.regionStore.exitStackMode(); }
57
+ isStackMode() { return this.regionStore.isStackMode(); }
58
+ getStackSaveLayout() { return this.regionStore.getStackSaveLayout(); }
59
+ setDisplaySlice(z) { this.regionStore.setDisplaySlice(z); }
60
+ getSliceRegions() { return this.regionStore.getSliceRegions(); }
61
+ getStackSaveSlices() { return this.regionStore.getStackSaveSlices(); }
62
+ // ── Classification colours → shared VisualizerStore ──────────────────────
63
+ getClassificationColors() { return this.store.getClassificationColors(); }
64
+ setClassificationColor(label, color) {
65
+ this.store.setClassificationColor(label, color);
66
+ }
67
+ // ── IDisplayOptions → shared VisualizerStore ─────────────────────────────
68
+ getColormap() { return this.store.getColormap(); }
69
+ setColormap(colormap) { this.store.setColormap(colormap); }
70
+ getColormapOptions() { return this.store.getColormapOptions(); }
71
+ getReverseScale() { return this.store.getReverseScale(); }
72
+ setReverseScale(reverscale) { this.store.setReverseScale(reverscale); }
73
+ setImageMeta(imageMeta) { this.store.setImageMeta(imageMeta); }
74
+ getImageMeta() { return this.store.getImageMeta(); }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zdG9yZS12aXN1YWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvYmFzZS1zdG9yZS12aXN1YWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLE9BQWdCLG1CQUFtQjtJQUN2QyxZQUNxQixXQUF3QixFQUN4QixLQUFzQjtRQUR0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixVQUFLLEdBQUwsS0FBSyxDQUFpQjtJQUN4QyxDQUFDO0lBRUosNEVBQTRFO0lBQzVFLFVBQVUsQ0FBQyxPQUFpQixFQUFFLGVBQXlCLEVBQUUsY0FBd0IsRUFDdEUsU0FBa0IsRUFBRSxNQUFnQjtRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELFVBQVUsS0FBZSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLGlCQUFpQixLQUFZLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRSxvQkFBb0IsS0FBd0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdGLHVCQUF1QixDQUFDLE9BQWlCLElBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsd0JBQXdCLEtBQTJCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RyxZQUFZLENBQUMsTUFBYyxJQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsWUFB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SUFDNUUsdUJBQXVCLEtBQTBCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRixzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLFdBQVcsS0FBc0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRixXQUFXLENBQUMsUUFBc0IsSUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0Usa0JBQWtCLEtBQXFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixlQUFlLEtBQTBCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0UsZUFBZSxDQUFDLFVBQWUsSUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsWUFBWSxDQUFDLFNBQTJCLElBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLFlBQVksS0FBbUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNuRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSURpc3BsYXlPcHRpb25zLCBJUmVnaW9uU3RvcmUgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBTaGFyZWQgc3RvcmUtZGVsZWdhdGlvbiBiYXNlIGZvciB0aGUgT3BlblNlYWRyYWdvbiBhbmQgbmFwYXJpLWpzXG4gKiBgSVZpc3VhbGl6ZXJgIGJhY2tlbmRzLiBUaGUgZW50aXJlIGBJUmVnaW9uU3RvcmVgIGFuZCBgSURpc3BsYXlPcHRpb25zYFxuICogc3VyZmFjZXMgKHBsdXMgdGhlIHR3byBjbGFzc2lmaWNhdGlvbi1jb2xvdXIgbWVtYmVycykgYXJlIHB1cmUgZm9yd2FyZGVycyB0b1xuICogdGhlIHNoYXJlZCBgUmVnaW9uU3RvcmVgIC8gYFZpc3VhbGl6ZXJTdG9yZWAgaW4gQk9USCBiYWNrZW5kcyDigJQgc28gdGhleSBsaXZlXG4gKiBoZXJlIG9uY2UsIGFzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCwgcmF0aGVyIHRoYW4gYmVpbmcgY29waWVkIHBlciBiYWNrZW5kLlxuICogKFRoaXMgaXMgdGhlIFwiY3Jvc3MtYmFja2VuZCBiZWhhdmlvdXIgdGhhdCBpc24ndCByZW5kZXJpbmcgYmVsb25ncyBpbiBhXG4gKiBzaGFyZWQgYWJzdHJhY3Rpb25cIiBjb252ZW50aW9uIGZyb20gQ0xBVURFLm1kOyB0aGUgZXh0cmFjdGlvbiBjbG9zZXNcbiAqIFNIQVJFRC1CQUNLRU5ELVJFRkFDVE9SLm1kLilcbiAqXG4gKiBCYWNrZW5kLXNwZWNpZmljIG1lbWJlcnMg4oCUIGBsb2FkYC9gcGxvdGAvYHJlc2V0YC96b29tL2BzZXRaSW5kZXhgL3JlYWRiYWNrLFxuICogdGhlIHJlZ2lvbiBPVkVSTEFZLCB0b29sIHdpcmluZywgaGlzdG9ncmFtcywgc2NhbGUgYmFyLCB0aWxpbmcsIGNvbG9ybWFwIExVVFxuICogYXBwbGljYXRpb24g4oCUIGRlbGliZXJhdGVseSBzdGF5IGluIGVhY2ggc3ViY2xhc3MuXG4gKlxuICogTk9UIGBASW5qZWN0YWJsZWA6IGFuIGFic3RyYWN0IGJhc2UgZG9lc24ndCBwYXJ0aWNpcGF0ZSBpbiBBbmd1bGFyIERJLiBFYWNoXG4gKiBzdWJjbGFzcyBzdGF5cyBgQEluamVjdGFibGVgLCBkZWNsYXJlcyBpdHMgb3duIGluamVjdGVkIGRlcGVuZGVuY2llc1xuICogKGluY2x1ZGluZyB0aGUgdHdvIHN0b3JlcyksIGFuZCBwYXNzZXMgdGhlbSB0byBgc3VwZXIoLi4uKWAuIFBsb3RseSBpc1xuICogaW50ZW50aW9uYWxseSBub3QgYSBzdWJjbGFzcyDigJQgaXQgaGFzIGl0cyBvd24gcmVnaW9uIG1vZGVsLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElSZWdpb25TdG9yZSwgSURpc3BsYXlPcHRpb25zIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICkge31cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlIOKGkiBzaGFyZWQgUmVnaW9uU3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10sIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICAgICAgICAgICBmaWxsQ29sb3I/OiBzdHJpbmcsIGFwcGVuZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7IH1cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W10geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Qb2x5Z29ucygpOyB9XG4gIGdldFJlZ2lvblVwZGF0ZUV2ZW50KCk6IE9ic2VydmFibGU8YW55W10+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTsgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpOyB9XG4gIGdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpOiBPYnNlcnZhYmxlPG51bWJlcltdPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpOyB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFJlZ2lvbihyZWdpb24pOyB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7IH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7IH1cbiAgZ2V0U2hhcGVDb2xvcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7IH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpOyB9XG4gIHBsb3RQcmV2aW91c1NoYXBlcygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5wbG90UHJldmlvdXNTaGFwZXMoKTsgfVxuICBzZXRQcmV2aW91c1NoYXBlcyhzaGFwZXM6IGFueVtdKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTsgfVxuICBnZXRQcmV2aW91c1NoYXBlcygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFByZXZpb3VzU2hhcGVzKCk7IH1cbiAgdW5kbygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7IH1cbiAgcmVkbygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5yZWRvKCk7IH1cbiAgY2FuVW5kbygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpOyB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTsgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuVW5kbyQoKTsgfVxuICBnZXRDYW5SZWRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTsgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTsgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyKTsgfVxuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zKTsgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTsgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIOKGkiBSZWdpb25TdG9yZSAoaml0LXVpIzkzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuZXhpdFN0YWNrTW9kZSgpOyB9XG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpOyB9XG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpOyB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5zZXREaXNwbGF5U2xpY2Uoeik7IH1cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7IH1cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpOyB9XG5cbiAgLy8g4pSA4pSAIENsYXNzaWZpY2F0aW9uIGNvbG91cnMg4oaSIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4geyByZXR1cm4gdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOyB9XG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbCwgY29sb3IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEaXNwbGF5T3B0aW9ucyDihpIgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7IHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7IH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IENvbG9ybWFwTm9kZSk6IHZvaWQgeyB0aGlzLnN0b3JlLnNldENvbG9ybWFwKGNvbG9ybWFwKTsgfVxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW10geyByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTsgfVxuICBnZXRSZXZlcnNlU2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpOyB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNjYWxlOiBhbnkpOiB2b2lkIHsgdGhpcy5zdG9yZS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZSk7IH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IHZvaWQgeyB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEpOyB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7IH1cbn1cbiJdfQ==