@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.
- package/LICENSE +21 -0
- package/README.md +404 -0
- package/esm2022/index.mjs +52 -0
- package/esm2022/jax-data-science-sci-image-visualizer.mjs +5 -0
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +398 -0
- package/esm2022/lib/contracts/capabilities.contract.mjs +32 -0
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +12 -0
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +14 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +95 -0
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +2 -0
- package/esm2022/lib/contracts/display-types.mjs +8 -0
- package/esm2022/lib/contracts/image.contract.mjs +11 -0
- package/esm2022/lib/contracts/intensity.mjs +28 -0
- package/esm2022/lib/contracts/plot-type.mjs +112 -0
- package/esm2022/lib/contracts/ports/image-state.port.mjs +3 -0
- package/esm2022/lib/contracts/ports/preferences.port.mjs +3 -0
- package/esm2022/lib/contracts/ports/region-io.port.mjs +3 -0
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +3 -0
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +4 -0
- package/esm2022/lib/contracts/region-overlay.contract.mjs +2 -0
- package/esm2022/lib/contracts/region-store.contract.mjs +2 -0
- package/esm2022/lib/contracts/sam.contract.mjs +12 -0
- package/esm2022/lib/contracts/toolbar-config.mjs +8 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +10 -0
- package/esm2022/lib/contracts/viz-config.mjs +3 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +260 -0
- package/esm2022/lib/implementations/base-store-visualizer.mjs +76 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +106 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +847 -0
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +92 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2283 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +126 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +143 -0
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +217 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +1780 -0
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +25 -0
- package/esm2022/lib/implementations/osd/osd-coords.mjs +53 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +20 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +1237 -0
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +88 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +488 -0
- package/esm2022/lib/implementations/osd/tile-client.mjs +29 -0
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +37 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +31 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +183 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +2137 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +99 -0
- package/esm2022/lib/models/bezier.mjs +120 -0
- package/esm2022/lib/models/class-preset.mjs +46 -0
- package/esm2022/lib/models/geometry.mjs +198 -0
- package/esm2022/lib/models/region.mjs +166 -0
- package/esm2022/lib/models/shape.mjs +53 -0
- package/esm2022/lib/plot.utilities.mjs +693 -0
- package/esm2022/lib/processing/image-converter.service.mjs +90 -0
- package/esm2022/lib/processing/image-crop.mjs +62 -0
- package/esm2022/lib/processing/processing-image.mjs +50 -0
- package/esm2022/lib/provide-visualization.mjs +63 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +95 -0
- package/esm2022/lib/region-editor/mask-worker.mjs +10 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +1190 -0
- package/esm2022/lib/region-ops.service.mjs +301 -0
- package/esm2022/lib/render-orchestrator.mjs +87 -0
- package/esm2022/lib/routing-visualizer.service.mjs +533 -0
- package/esm2022/lib/store/class-color.util.mjs +52 -0
- package/esm2022/lib/store/region-store.service.mjs +1029 -0
- package/esm2022/lib/store/visualizer-store.service.mjs +352 -0
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +546 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +57 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +115 -0
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +84 -0
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +133 -0
- package/esm2022/lib/toolbar/segmentation/ort-runtime-config.mjs +31 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +159 -0
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +255 -0
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +94 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +188 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +311 -0
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +234 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +499 -0
- package/esm2022/lib/toolbar/wand/wand.service.mjs +921 -0
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +157 -0
- package/esm2022/lib/visualization.module.mjs +162 -0
- package/esm2022/lib/visualizer.component.mjs +1597 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs +327 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +21314 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -0
- package/fesm2022/mask.worker.js +989 -0
- package/fesm2022/onnx-sam.worker.js +202 -0
- package/index.d.ts +39 -0
- package/lib/channel-histogram/channel-histogram.component.d.ts +112 -0
- package/lib/contracts/capabilities.contract.d.ts +30 -0
- package/lib/contracts/cell-segmenter.contract.d.ts +40 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +98 -0
- package/lib/contracts/colormap-lut.d.ts +21 -0
- package/lib/contracts/coordinate-transform.contract.d.ts +43 -0
- package/lib/contracts/display-types.d.ts +41 -0
- package/lib/contracts/image.contract.d.ts +72 -0
- package/lib/contracts/intensity.d.ts +18 -0
- package/lib/contracts/plot-type.d.ts +108 -0
- package/lib/contracts/ports/image-state.port.d.ts +29 -0
- package/lib/contracts/ports/preferences.port.d.ts +19 -0
- package/lib/contracts/ports/region-io.port.d.ts +29 -0
- package/lib/contracts/ports/tile-access.port.d.ts +27 -0
- package/lib/contracts/region-editor-api.contract.d.ts +83 -0
- package/lib/contracts/region-overlay.contract.d.ts +47 -0
- package/lib/contracts/region-store.contract.d.ts +74 -0
- package/lib/contracts/sam.contract.d.ts +98 -0
- package/lib/contracts/toolbar-config.d.ts +24 -0
- package/lib/contracts/visualizer.contract.d.ts +346 -0
- package/lib/contracts/viz-config.d.ts +25 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +47 -0
- package/lib/implementations/base-store-visualizer.d.ts +71 -0
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +47 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +115 -0
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +31 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +455 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +46 -0
- package/lib/implementations/osd/display-pipeline.d.ts +47 -0
- package/lib/implementations/osd/histogram-sampler.d.ts +85 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +476 -0
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +17 -0
- package/lib/implementations/osd/osd-coords.d.ts +16 -0
- package/lib/implementations/osd/osd-lib.d.ts +19 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +191 -0
- package/lib/implementations/osd/osd-scale-bar.d.ts +17 -0
- package/lib/implementations/osd/slice-cache.d.ts +161 -0
- package/lib/implementations/osd/tile-client.d.ts +32 -0
- package/lib/implementations/plotly/plotly-coordinate-transform.d.ts +19 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +23 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +60 -0
- package/lib/implementations/plotly/plotly.service.d.ts +594 -0
- package/lib/implementations/simple-slice-access.service.d.ts +64 -0
- package/lib/models/bezier.d.ts +59 -0
- package/lib/models/class-preset.d.ts +39 -0
- package/lib/models/geometry.d.ts +66 -0
- package/lib/models/region.d.ts +132 -0
- package/lib/models/shape.d.ts +44 -0
- package/lib/plot.utilities.d.ts +107 -0
- package/lib/processing/image-converter.service.d.ts +28 -0
- package/lib/processing/image-crop.d.ts +18 -0
- package/lib/processing/processing-image.d.ts +17 -0
- package/lib/provide-visualization.d.ts +34 -0
- package/lib/region-editor/mask-raster.d.ts +61 -0
- package/lib/region-editor/mask-worker.d.ts +7 -0
- package/lib/region-editor/region-editor.component.d.ts +305 -0
- package/lib/region-ops.service.d.ts +92 -0
- package/lib/render-orchestrator.d.ts +59 -0
- package/lib/routing-visualizer.service.d.ts +227 -0
- package/lib/store/class-color.util.d.ts +26 -0
- package/lib/store/region-store.service.d.ts +315 -0
- package/lib/store/visualizer-store.service.d.ts +123 -0
- package/lib/toolbar/brush/brush-tool.service.d.ts +143 -0
- package/lib/toolbar/crop/slide-crop.d.ts +30 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +32 -0
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +39 -0
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +25 -0
- package/lib/toolbar/segmentation/ort-runtime-config.d.ts +4 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +36 -0
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +48 -0
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +59 -0
- package/lib/toolbar/segmentation/sam-prompt.d.ts +34 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +50 -0
- package/lib/toolbar/toolbar.component.d.ts +167 -0
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +64 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +149 -0
- package/lib/toolbar/wand/wand.service.d.ts +133 -0
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +49 -0
- package/lib/visualization.module.d.ts +45 -0
- package/lib/visualizer.component.d.ts +378 -0
- package/package.json +73 -0
- package/src/lib/assets/3d-coordinates.svg +49 -0
- package/src/lib/assets/cells.svg +1 -0
- package/src/lib/assets/click.svg +1 -0
- package/src/lib/assets/colormap-luts.json +1 -0
- package/src/lib/assets/contour.svg +48 -0
- package/src/lib/assets/cube-3d.svg +1 -0
- package/src/lib/assets/edit-selection-white.svg +47 -0
- package/src/lib/assets/heatmap.svg +1 -0
- package/src/lib/assets/icons/colormap-Pastel1.png +0 -0
- package/src/lib/assets/icons/colormap-accent.png +0 -0
- package/src/lib/assets/icons/colormap-afmhot.png +0 -0
- package/src/lib/assets/icons/colormap-autumn.png +0 -0
- package/src/lib/assets/icons/colormap-berlin.png +0 -0
- package/src/lib/assets/icons/colormap-binary.png +0 -0
- package/src/lib/assets/icons/colormap-blackbody.png +0 -0
- package/src/lib/assets/icons/colormap-bluered.png +0 -0
- package/src/lib/assets/icons/colormap-blues.png +0 -0
- package/src/lib/assets/icons/colormap-bone.png +0 -0
- package/src/lib/assets/icons/colormap-brbg.png +0 -0
- package/src/lib/assets/icons/colormap-brg.png +0 -0
- package/src/lib/assets/icons/colormap-bugn.png +0 -0
- package/src/lib/assets/icons/colormap-bupu.png +0 -0
- package/src/lib/assets/icons/colormap-bwr.png +0 -0
- package/src/lib/assets/icons/colormap-cividis.png +0 -0
- package/src/lib/assets/icons/colormap-cmrmap.png +0 -0
- package/src/lib/assets/icons/colormap-cool.png +0 -0
- package/src/lib/assets/icons/colormap-coolwarm.png +0 -0
- package/src/lib/assets/icons/colormap-copper.png +0 -0
- package/src/lib/assets/icons/colormap-cubehelix.png +0 -0
- package/src/lib/assets/icons/colormap-dark2.png +0 -0
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-electric.png +0 -0
- package/src/lib/assets/icons/colormap-flag.png +0 -0
- package/src/lib/assets/icons/colormap-gist_earth.png +0 -0
- package/src/lib/assets/icons/colormap-gist_gray.png +0 -0
- package/src/lib/assets/icons/colormap-gist_heat.png +0 -0
- package/src/lib/assets/icons/colormap-gist_ncar.png +0 -0
- package/src/lib/assets/icons/colormap-gist_rainbow.png +0 -0
- package/src/lib/assets/icons/colormap-gist_stern.png +0 -0
- package/src/lib/assets/icons/colormap-gist_yarg.png +0 -0
- package/src/lib/assets/icons/colormap-gnbu.png +0 -0
- package/src/lib/assets/icons/colormap-gnuplot.png +0 -0
- package/src/lib/assets/icons/colormap-gnuplot2.png +0 -0
- package/src/lib/assets/icons/colormap-gray.png +0 -0
- package/src/lib/assets/icons/colormap-greens-inv.png +0 -0
- package/src/lib/assets/icons/colormap-greens.png +0 -0
- package/src/lib/assets/icons/colormap-greys-inv.png +0 -0
- package/src/lib/assets/icons/colormap-greys.png +0 -0
- package/src/lib/assets/icons/colormap-hot.png +0 -0
- package/src/lib/assets/icons/colormap-hsv.png +0 -0
- package/src/lib/assets/icons/colormap-inferno.png +0 -0
- package/src/lib/assets/icons/colormap-jet.png +0 -0
- package/src/lib/assets/icons/colormap-magma.png +0 -0
- package/src/lib/assets/icons/colormap-managua.png +0 -0
- package/src/lib/assets/icons/colormap-nipy_spectral.png +0 -0
- package/src/lib/assets/icons/colormap-ocean.png +0 -0
- package/src/lib/assets/icons/colormap-oranges.png +0 -0
- package/src/lib/assets/icons/colormap-orrd.png +0 -0
- package/src/lib/assets/icons/colormap-pastel2.png +0 -0
- package/src/lib/assets/icons/colormap-picnic.png +0 -0
- package/src/lib/assets/icons/colormap-pink.png +0 -0
- package/src/lib/assets/icons/colormap-piyg.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-plasma.png +0 -0
- package/src/lib/assets/icons/colormap-portland.png +0 -0
- package/src/lib/assets/icons/colormap-prgn.png +0 -0
- package/src/lib/assets/icons/colormap-prism.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/icons/colormap-pubugn.png +0 -0
- package/src/lib/assets/icons/colormap-puor.png +0 -0
- package/src/lib/assets/icons/colormap-purd.png +0 -0
- package/src/lib/assets/icons/colormap-purples.png +0 -0
- package/src/lib/assets/icons/colormap-rainbow.png +0 -0
- package/src/lib/assets/icons/colormap-rdbu.png +0 -0
- package/src/lib/assets/icons/colormap-rdgy.png +0 -0
- package/src/lib/assets/icons/colormap-rdpu.png +0 -0
- package/src/lib/assets/icons/colormap-rdylbu.png +0 -0
- package/src/lib/assets/icons/colormap-rdylgn.png +0 -0
- package/src/lib/assets/icons/colormap-reds.png +0 -0
- package/src/lib/assets/icons/colormap-seismic.png +0 -0
- package/src/lib/assets/icons/colormap-set1.png +0 -0
- package/src/lib/assets/icons/colormap-set2.png +0 -0
- package/src/lib/assets/icons/colormap-set3.png +0 -0
- package/src/lib/assets/icons/colormap-spectral.png +0 -0
- package/src/lib/assets/icons/colormap-spring.png +0 -0
- package/src/lib/assets/icons/colormap-summer.png +0 -0
- package/src/lib/assets/icons/colormap-tab10.png +0 -0
- package/src/lib/assets/icons/colormap-tab20.png +0 -0
- package/src/lib/assets/icons/colormap-tab20b.png +0 -0
- package/src/lib/assets/icons/colormap-tab20c.png +0 -0
- package/src/lib/assets/icons/colormap-terrain.png +0 -0
- package/src/lib/assets/icons/colormap-turbo.png +0 -0
- package/src/lib/assets/icons/colormap-twilight.png +0 -0
- package/src/lib/assets/icons/colormap-twilight_shifted.png +0 -0
- package/src/lib/assets/icons/colormap-vanimo.png +0 -0
- package/src/lib/assets/icons/colormap-viridis.png +0 -0
- package/src/lib/assets/icons/colormap-winter.png +0 -0
- package/src/lib/assets/icons/colormap-wistia.png +0 -0
- package/src/lib/assets/icons/colormap-ylgn.png +0 -0
- package/src/lib/assets/icons/colormap-ylgnbu-inv.png +0 -0
- package/src/lib/assets/icons/colormap-ylgnbu.png +0 -0
- package/src/lib/assets/icons/colormap-ylorbr.png +0 -0
- package/src/lib/assets/icons/colormap-ylorrd-inv.png +0 -0
- package/src/lib/assets/icons/colormap-ylorrd.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +1 -0
- package/src/lib/assets/invert.svg +1 -0
- package/src/lib/assets/isosurface.svg +7 -0
- package/src/lib/assets/mask.svg +1 -0
- package/src/lib/assets/paintbrush.svg +1 -0
- package/src/lib/assets/picture-segmentation.svg +43 -0
- package/src/lib/assets/polygon-vertices.svg +13 -0
- package/src/lib/assets/polyline.svg +3 -0
- package/src/lib/assets/redo.svg +39 -0
- package/src/lib/assets/region-editor.svg +37 -0
- package/src/lib/assets/region-move.svg +7 -0
- package/src/lib/assets/smooth.svg +56 -0
- package/src/lib/assets/spline-chart.svg +7 -0
- package/src/lib/assets/surface.svg +37 -0
- package/src/lib/assets/test/download-379.svg +1 -0
- package/src/lib/assets/test/download-98.svg +1 -0
- package/src/lib/assets/test/json-1.svg +1 -0
- package/src/lib/assets/test/load-53.svg +1 -0
- package/src/lib/assets/test/mask-44.svg +1 -0
- package/src/lib/assets/test/mask-download-44.svg +15 -0
- package/src/lib/assets/test/mask-save-44.svg +11 -0
- package/src/lib/assets/test/overlay-1.svg +1 -0
- package/src/lib/assets/test/overlay-4.svg +1 -0
- package/src/lib/assets/test/region-26.svg +1 -0
- package/src/lib/assets/test/save-56.svg +1 -0
- package/src/lib/assets/test/upload-43.svg +1 -0
- package/src/lib/assets/to-bezier.svg +15 -0
- package/src/lib/assets/to-polygon.svg +11 -0
- package/src/lib/assets/undo.svg +38 -0
- package/src/lib/assets/vertex-add.svg +12 -0
- package/src/lib/assets/vertex-delete.svg +12 -0
- package/src/lib/assets/wand.svg +54 -0
- 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==
|