@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -32,9 +32,11 @@
32
32
  * CategoricalColumnMeta.categories}.
33
33
  */
34
34
  export const NO_CATEGORY = 0xffff;
35
+ /** Narrow a loaded column to a categorical one. */
35
36
  export function isCategoricalColumn(c) {
36
37
  return c.meta.kind === 'categorical';
37
38
  }
39
+ /** Narrow a loaded column to a continuous one. */
38
40
  export function isContinuousColumn(c) {
39
41
  return c.meta.kind === 'continuous';
40
42
  }
@@ -44,4 +46,4 @@ export const NO_OBSERVATION = 0xffffffff;
44
46
  export function findColumnMeta(dataset, name) {
45
47
  return dataset.columns.find((c) => c.name === name);
46
48
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQThFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFtQmxDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxDQUFnQjtJQUNsRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQztBQUN2QyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQWdCO0lBQ2pELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDO0FBQ3RDLENBQUM7QUFxT0QscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUE0SHpDLDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsY0FBYyxDQUM1QixPQUF1QixFQUFFLElBQVk7SUFFckMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYWNrZW5kLW5ldXRyYWwgZGF0YSBtb2RlbCBmb3IgYSAqKnNwYXRpYWwtb21pY3MgZGF0YXNldCoqOiBOIG9ic2VydmF0aW9uc1xuICogKFZpc2l1bSBzcG90cywgc2VnbWVudGVkIGNlbGxzLCBudWNsZWksIOKApikgcG9zaXRpb25lZCBpbiB0aGUgcGl4ZWwgc3BhY2Ugb2YgYVxuICogdGlzc3VlIGltYWdlLCBlYWNoIGNhcnJ5aW5nIGNhdGVnb3JpY2FsIGFuZCBjb250aW51b3VzIGFubm90YXRpb25zLCBwbHVzIGFuXG4gKiBvcHRpb25hbCBmZWF0dXJlIChnZW5lKSBtYXRyaXggYW5kIG9wdGlvbmFsIHBlci1vYnNlcnZhdGlvbiBib3VuZGFyaWVzLlxuICpcbiAqIERFU0lHTlxuICogLS0tLS0tXG4gKiAxLiAqKlN0cnVjdC1vZi1hcnJheXMsIG5vdCBvYmplY3QtcGVyLWNlbGwuKiogUmVhbCBkYXRhc2V0cyBydW4gMTBeMyAoVmlzaXVtKVxuICogICAgdG8gMTBeNiAoWGVuaXVtL0Nvc014KSBvYnNlcnZhdGlvbnMuIGB7eCwgeX1bXWAgYXQgNTAwayBjZWxscyBpcyB+NTAwa1xuICogICAgb2JqZWN0cyB0aGUgR0MgaGFzIHRvIHdhbGs7IHR3byBgRmxvYXQzMkFycmF5YHMgYXJlIHR3byBhbGxvY2F0aW9ucyBhbmRcbiAqICAgIHVwbG9hZCB0byB0aGUgR1BVIHdpdGhvdXQgYSBjb3B5LlxuICpcbiAqIDIuICoqTWV0YWRhdGEgaXMgZWFnZXIsIHZhbHVlcyBhcmUgbGF6eS4qKiBBIGRhdGFzZXQgYWR2ZXJ0aXNlcyAqd2hpY2gqXG4gKiAgICBjb2x1bW5zIGFuZCBmZWF0dXJlcyBleGlzdCAoe0BsaW5rIFNwYXRpYWxDb2x1bW5NZXRhfSxcbiAqICAgIHtAbGluayBTcGF0aWFsRmVhdHVyZU1ldGF9KTsgdGhlIHZlY3RvcnMgdGhlbXNlbHZlcyBhcmUgZmV0Y2hlZCBvbiBkZW1hbmRcbiAqICAgIHRocm91Z2gge0BsaW5rIFNwYXRpYWxEYXRhUG9ydH0uIEEgVmlzaXVtIHRhYmxlIGlzIH4zMGsgZ2VuZXMgd2lkZSDigJQgdGhlXG4gKiAgICBkZW5zZSBtYXRyaXggaXMgfjgwMCBNQiDigJQgc28gXCJsb2FkIHRoZSBkYXRhc2V0XCIgY2FuIG5ldmVyIG1lYW4gXCJsb2FkIHRoZVxuICogICAgbWF0cml4XCIuIE9ubHkgdGhlIGhhbmRmdWwgb2YgY29sdW1ucyBhY3R1YWxseSBiZWluZyBkaXNwbGF5ZWQgaXMgcmVzaWRlbnQuXG4gKlxuICogMy4gKipEYXRhIHN0YXlzIGRhdGEuKiogTm8gSS9PLCBubyBSeEpTLCBubyBBbmd1bGFyIGluIHRoaXMgZmlsZSDigJQgdGhlIHNhbWVcbiAqICAgIHJ1bGUgYHBsb3RseS10cmFjZS1idWlsZGVycy50c2AgZm9sbG93cy4gRmV0Y2hpbmcgbGl2ZXMgb24gdGhlIHBvcnQuXG4gKlxuICogVGhlIHNoYXBlIG1pcnJvcnMgaG93IHRoZSBmaWVsZCBhbHJlYWR5IHN0b3JlcyB0aGlzIChTcGF0aWFsRGF0YS9Bbm5EYXRhOlxuICogYG9ic2AgYW5ub3RhdGlvbnMsIGB2YXJgIGZlYXR1cmVzLCBgb2JzbS9zcGF0aWFsYCBjb29yZGluYXRlcywgc2hhcGVzIHdpdGggYVxuICogY29vcmRpbmF0ZSB0cmFuc2Zvcm0pIHNvIGFuIGFkYXB0ZXIgaXMgYSBwcm9qZWN0aW9uLCBub3QgYSB0cmFuc2xhdGlvbi5cbiAqL1xuXG4vKipcbiAqIE9ic2VydmF0aW9uIHBvc2l0aW9ucy4gRXZlcnkgYXJyYXkgaXMgbGVuZ3RoIHtAbGluayBjb3VudH0gYW5kIGluZGV4LWFsaWduZWQ6XG4gKiBvYnNlcnZhdGlvbiBgaWAgaXMgYXQgYCh4W2ldLCB5W2ldKWAsIGFuZCBjb2x1bW4vZmVhdHVyZSB2ZWN0b3JzIGluZGV4IHRoZVxuICogc2FtZSB3YXkuIFRoaXMgc2hhcmVkIGluZGV4IGlzIHRoZSBqb2luIGtleSBmb3IgdGhlIHdob2xlIG1vZGVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxPYnNlcnZhdGlvbnMge1xuICAvKiogTiDigJQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucy4gKi9cbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgLyoqIFggaW4gdGhlIHJlZmVyZW5jZSBpbWFnZSdzIHBpeGVsIHNwYWNlIChzZWUge0BsaW5rIFNwYXRpYWxJbWFnZVJlZn0pLiAqL1xuICB4OiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBZIGluIHRoZSByZWZlcmVuY2UgaW1hZ2UncyBwaXhlbCBzcGFjZS4gKi9cbiAgeTogRmxvYXQzMkFycmF5O1xuICAvKiogWiwgZm9yIHNlcmlhbCBzZWN0aW9ucyBvciBnZW51aW5lbHkgM0QgYXNzYXlzLiBBYnNlbnQgZm9yIGEgc2luZ2xlIHBsYW5lLiAqL1xuICB6PzogRmxvYXQzMkFycmF5O1xuICAvKiogU3RhYmxlIHBlci1vYnNlcnZhdGlvbiBpZHMgKGJhcmNvZGVzLCBjZWxsIGlkcykgZm9yIHRvb2x0aXBzIGFuZCBleHBvcnQuXG4gICAqICBPcHRpb25hbCDigJQgb21pdCBmb3IgbGFyZ2UgZGF0YXNldHMgd2hlcmUgdGhlIHN0cmluZ3MgY29zdCBtb3JlIHRoYW4gdGhleVxuICAgKiAgYXJlIHdvcnRoLiAqL1xuICBpZHM/OiBzdHJpbmdbXTtcbiAgLyoqIE1hcmtlciBSQURJVVMgaW4gaW1hZ2UgcGl4ZWxzOiBvbmUgdmFsdWUgc2hhcmVkIGJ5IGFsbCBvYnNlcnZhdGlvbnMgKGFcbiAgICogIFZpc2l1bSBzcG90IGlzIGEgZml4ZWQgNTUgwrVtIOKHkiBgMjcuNSAvIG1wcFhgIHB4KSwgb3Igb25lIHBlciBvYnNlcnZhdGlvblxuICAgKiAgKHNlZ21lbnRlZCBjZWxscykuIEFic2VudCDih5IgdGhlIHJlbmRlcmVyIHBpY2tzIGEgZGlzcGxheSBkZWZhdWx0LiAqL1xuICByYWRpdXM/OiBGbG9hdDMyQXJyYXkgfCBudW1iZXI7XG59XG5cbi8qKiBGaWVsZHMgY29tbW9uIHRvIGV2ZXJ5IGNvbHVtbiBkZXNjcmlwdG9yLiAqL1xuaW50ZXJmYWNlIFNwYXRpYWxDb2x1bW5NZXRhQmFzZSB7XG4gIC8qKiBDb2x1bW4gbmFtZSBhcyB0aGUgdXNlciBzZWVzIGl0IChgbGVpZGVuYCwgYHRvdGFsX2NvdW50c2ApLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBMb25nZXIgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIHRvb2x0aXBzL21lbnVzLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGRpc2NyZXRlIGFubm90YXRpb24g4oCUIGNsdXN0ZXIsIGNlbGwgdHlwZSwgcmVnaW9uLCBzYW1wbGUuIFJlbmRlcmVkIGFzIGFcbiAqIHBhbGV0dGUgKyBsZWdlbmQ7IGEgbGVnZW5kIGNsaWNrIHNlbGVjdHMgdGhlIGNhdGVnb3J5J3Mgb2JzZXJ2YXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsQ29sdW1uTWV0YSBleHRlbmRzIFNwYXRpYWxDb2x1bW5NZXRhQmFzZSB7XG4gIGtpbmQ6ICdjYXRlZ29yaWNhbCc7XG4gIC8qKiBDYXRlZ29yeSBsYWJlbHM7IGEgdmFsdWUncyBsYWJlbCBpcyBgY2F0ZWdvcmllc1tjb2Rlc1tpXV1gLiAqL1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEhlYWRpbmcgdGhlIGNvbHVtbiBpcyBsaXN0ZWQgdW5kZXIgaW4gYSBncm91cCBwaWNrZXIg4oCUIGUuZy4gXCJYZW5pdW0gT25ib2FyZCBBbmFseXNpc1xuICAgKiBncm91cHNcIiBmb3IgYSBwaXBlbGluZSdzIGNsdXN0ZXJpbmdzLCBcIkltcG9ydGVkIGdyb3Vwc1wiIGZvciBvbmVzIGFkZGVkIGJ5IGEgdXNlci5cbiAgICovXG4gIHNlY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb2x1bW5zIHRoYXQgYXJlIHZhcmlhbnRzIG9mIG9uZSBjaG9pY2Ug4oCUIGstbWVhbnMgYXQgayA9IDLigKYxMCDigJQgc2hhcmUgYSBmYW1pbHk6IGFcbiAgICogcGlja2VyIGxpc3RzIHRoZSBmYW1pbHkgb25jZSBhbmQgb2ZmZXJzIHRoZSB2YXJpYW50cyBiZXNpZGUgaXQuXG4gICAqL1xuICBmYW1pbHk/OiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZhcmlhbnQ6IHN0cmluZyB9O1xuICAvKiogQXV0aG9yZWQgZGlzcGxheSBjb2xvdXJzIGFzIGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoXG4gICAqICB7QGxpbmsgY2F0ZWdvcmllc30uIFN1cHBseSB0aGVzZSB0byBrZWVwIHRoZSB2aWV3ZXIncyBwYWxldHRlIGlkZW50aWNhbCB0b1xuICAgKiAgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgaW4gUi9QeXRob247IG9taXQgdG8gbGV0IHRoZSB2aWV3ZXJcbiAgICogIGRlcml2ZSBvbmUuICovXG4gIGNvbG9ycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29udGludW91cyBtZWFzdXJlbWVudCDigJQgZXhwcmVzc2lvbiwgUUMgbWV0cmljLCBhcmVhLCBkZW5zaXR5LiBSZW5kZXJlZFxuICogdGhyb3VnaCB0aGUgc2hhcmVkIGNvbG9ybWFwL0xVVCArIGNvbnRyYXN0IHdpbmRvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51b3VzQ29sdW1uTWV0YSBleHRlbmRzIFNwYXRpYWxDb2x1bW5NZXRhQmFzZSB7XG4gIGtpbmQ6ICdjb250aW51b3VzJztcbiAgLyoqIFVuaXQgZm9yIGF4aXMvdG9vbHRpcCBsYWJlbHMgKGBjb3VudHNgLCBgwrVtwrJgKS4gKi9cbiAgdW5pdD86IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgY29sdW1uIHJlYWRzIGJlc3QgbG9nLXNjYWxlZCDigJQgY291bnQgZGF0YSBhbG1vc3QgYWx3YXlzXG4gICAqICBkb2VzLCBhbmQgYSBsaW5lYXIgc2NhbGUgY29sbGFwc2VzIGl0IGFnYWluc3QgYSBmZXcgYnJpZ2h0IG91dGxpZXJzLiAqL1xuICBsb2dTY2FsZUhpbnQ/OiBib29sZWFuO1xuICAvKiogT2JzZXJ2ZWQgZXh0cmVtZXMsIHdoZW4gdGhlIHByb2R1Y2VyIGtub3dzIHRoZW0uIExldHMgdGhlIFVJIHNlZWQgYVxuICAgKiAgY29udHJhc3Qgd2luZG93IGFuZCBheGlzIHJhbmdlIHdpdGhvdXQgZmlyc3Qgc2Nhbm5pbmcgdGhlIHZlY3Rvci4gKi9cbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNwYXRpYWxDb2x1bW5NZXRhID0gQ2F0ZWdvcmljYWxDb2x1bW5NZXRhIHwgQ29udGludW91c0NvbHVtbk1ldGE7XG5cbi8qKlxuICogQ29kZSBtZWFuaW5nIFwidGhpcyBvYnNlcnZhdGlvbiBoYXMgbm8gY2F0ZWdvcnlcIiAodW5hc3NpZ25lZCAvIGZpbHRlcmVkIG91dCAvXG4gKiBub3QgaW4gdGlzc3VlKS4gUmVuZGVyZXJzIHNob3VsZCBkcmF3IGl0IGluIHRoZSBtdXRlZCBiYWNrZ3JvdW5kIHN0eWxlIHJhdGhlclxuICogdGhhbiBhcyBhIHJlYWwgY2F0ZWdvcnksIGFuZCBpdCBtdXN0IG5ldmVyIGluZGV4IHtAbGlua1xuICogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLmNhdGVnb3JpZXN9LlxuICovXG5leHBvcnQgY29uc3QgTk9fQ0FURUdPUlkgPSAweGZmZmY7XG5cbi8qKiBBIGxvYWRlZCBjYXRlZ29yaWNhbCBjb2x1bW46IHBlci1vYnNlcnZhdGlvbiBpbmRpY2VzIGludG8gYG1ldGEuY2F0ZWdvcmllc2AsXG4gKiAgb3Ige0BsaW5rIE5PX0NBVEVHT1JZfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxDb2x1bW4ge1xuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGE7XG4gIC8qKiBMZW5ndGggPSB7QGxpbmsgU3BhdGlhbE9ic2VydmF0aW9ucy5jb3VudH0uICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqIEEgbG9hZGVkIGNvbnRpbnVvdXMgY29sdW1uLiBgTmFOYCBtYXJrcyBhIG1pc3NpbmcgdmFsdWUuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNDb2x1bW4ge1xuICBtZXRhOiBDb250aW51b3VzQ29sdW1uTWV0YTtcbiAgLyoqIExlbmd0aCA9IHtAbGluayBTcGF0aWFsT2JzZXJ2YXRpb25zLmNvdW50fS4gKi9cbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG59XG5cbmV4cG9ydCB0eXBlIFNwYXRpYWxDb2x1bW4gPSBDYXRlZ29yaWNhbENvbHVtbiB8IENvbnRpbnVvdXNDb2x1bW47XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NhdGVnb3JpY2FsQ29sdW1uKGM6IFNwYXRpYWxDb2x1bW4pOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uIHtcbiAgcmV0dXJuIGMubWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGludW91c0NvbHVtbihjOiBTcGF0aWFsQ29sdW1uKTogYyBpcyBDb250aW51b3VzQ29sdW1uIHtcbiAgcmV0dXJuIGMubWV0YS5raW5kID09PSAnY29udGludW91cyc7XG59XG5cbi8qKlxuICogVGhlIGZlYXR1cmUgKGdlbmUpIG1hdHJpeCwgZGVzY3JpYmVkIGJ1dCBuZXZlciBkZWxpdmVyZWQgd2hvbGUuIFZlY3RvcnMgY29tZVxuICogb25lIGF0IGEgdGltZSBmcm9tIHtAbGluayBTcGF0aWFsRGF0YVBvcnQuZ2V0RmVhdHVyZVZlY3Rvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbEZlYXR1cmVNZXRhIHtcbiAgLyoqIE51bWJlciBvZiBmZWF0dXJlcyBhdmFpbGFibGUuICovXG4gIGNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBbGwgZmVhdHVyZSBuYW1lcywgd2hlbiB0aGUgcHJvZHVjZXIgY2hvc2UgdG8gaW5saW5lIHRoZW0uIFByZXNlbnQgZm9yXG4gICAqIHRhcmdldGVkIHBhbmVscyAoWGVuaXVtL0Nvc014IHNoaXAgMzAw4oCTNSwwMDAgZ2VuZXMg4oeSIGEgZmV3IGRvemVuIEtCKSBhbmRcbiAgICogYWJzZW50IGZvciB3aG9sZS10cmFuc2NyaXB0b21lIGRhdGEgKFZpc2l1bSBzaGlwcyB+MzFrIOKHkiB+MzUwIEtCKSwgd2hlcmVcbiAgICogdGhlIFVJIHNob3VsZCB1c2Uge0BsaW5rIFNwYXRpYWxEYXRhUG9ydC5zZWFyY2hGZWF0dXJlc30gZm9yIHR5cGVhaGVhZFxuICAgKiBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nIHRoZSBsaXN0LiBDb25zdW1lcnMgbXVzdCBoYW5kbGUgYm90aC5cbiAgICovXG4gIG5hbWVzPzogc3RyaW5nW107XG4gIC8qKiBXaGF0IGEgZmVhdHVyZSB2YWx1ZSBtZWFucyAoYGxvZzFwIG5vcm1hbGl6ZWRgLCBgcmF3IGNvdW50c2ApLiAqL1xuICB1bml0Pzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIGZlYXR1cmUgdmVjdG9ycyByZWFkIGJlc3QgbG9nLXNjYWxlZCAocmF3IGNvdW50cykuICovXG4gIGxvZ1NjYWxlSGludD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGVyLW9ic2VydmF0aW9uIGJvdW5kYXJpZXMgKGNlbGwvbnVjbGV1cyBzZWdtZW50YXRpb24sIHNwb3Qgb3V0bGluZXMpIGFzIGZsYXRcbiAqIHJpbmdzIOKAlCBkZWxpYmVyYXRlbHkgTk9UIEdlb0pTT04gb2JqZWN0cywgd2hpY2ggY29zdCBvbmUgb2JqZWN0ICsgb25lIGFycmF5XG4gKiBwZXIgY2VsbCBhbmQgd291bGQgZG9taW5hdGUgbWVtb3J5IGF0IDEwXjUgcG9seWdvbnMuXG4gKlxuICogUmluZyBgaWAgb2NjdXBpZXMgYGNvb3Jkc1syKm9mZnNldHNbaV0gLi4gMipvZmZzZXRzW2krMV0pYCBhcyBgeDAseTAseDEseTEs4oCmYFxuICogYW5kIGlzIGltcGxpY2l0bHkgY2xvc2VkLiBgb2Zmc2V0c2AgaGFzIGxlbmd0aCBgY291bnQgKyAxYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUG9seWdvbnMge1xuICBjb29yZHM6IEZsb2F0MzJBcnJheTtcbiAgb2Zmc2V0czogVWludDMyQXJyYXk7XG4gIC8qKiBOdW1iZXIgb2YgcmluZ3Mg4oCUIGBvZmZzZXRzLmxlbmd0aCAtIDFgLiAqL1xuICByZWFkb25seSBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogUHJlc2VuY2Uvc2l6ZSBvZiB0aGUgYm91bmRhcnkgZ2VvbWV0cnksIHdpdGhvdXQgbG9hZGluZyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFBvbHlnb25zTWV0YSB7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogSG93IG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzIHJlbGF0ZSB0byB0aGUgdGlzc3VlIGltYWdlIHRoZXkgYXJlIGRyYXduIG92ZXIuXG4gKiBBcHBsaWVkIGFzIGB3b3JsZCA9IGNvb3JkICogc2NhbGUgKyB0cmFuc2xhdGVgLCBtYXRjaGluZyB0aGUgYWZmaW5lIHRoYXRcbiAqIFNwYXRpYWxEYXRhIHJlY29yZHMgcGVyIGNvb3JkaW5hdGUgc3lzdGVtIOKAlCBhbmQgdGhlIGZ1bGwtcmVzb2x1dGlvbiB3b3JsZFxuICogY29udmVudGlvbiB0aGUgbmFwYXJpLWpzIGJhY2tlbmQgYWxyZWFkeSB1c2VzIHNvIHByZS1zYXZlZCByZWdpb25zIGFsaWduIG9uXG4gKiBweXJhbWlkYWwgc2xpZGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxJbWFnZVJlZiB7XG4gIC8qKiBIb3N0LWRlZmluZWQgaWQgb2YgdGhlIGltYWdlIHRoZXNlIGNvb3JkaW5hdGVzIGxpdmUgaW4sIHNvIHRoZSBob3N0IGNhblxuICAgKiAgcmVzb2x2ZSBpdCB0byBhbiBgSUltYWdlSW5mb2AuICovXG4gIGltYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBEYXRh4oaSd29ybGQgc2NhbGUuIERlZmF1bHRzIHRvIGBbMSwgMV1gIChjb29yZGluYXRlcyBhbHJlYWR5IGluXG4gICAqICBmdWxsLXJlc29sdXRpb24gaW1hZ2UgcGl4ZWxzKS4gKi9cbiAgc2NhbGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogRGF0YeKGkndvcmxkIHRyYW5zbGF0aW9uLCBpbiB0aGUgc2FtZSB1bml0cyBhcyB7QGxpbmsgc2NhbGV9J3Mgb3V0cHV0LiAqL1xuICB0cmFuc2xhdGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0g4oCUIGRyaXZlcyB0aGUgc2NhbGUgYmFyIGFuZCBwaHlzaWNhbCBtYXJrZXJcbiAgICogIHNpemluZyAoYSA1NSDCtW0gVmlzaXVtIHNwb3QpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgc3BhdGlhbC1vbWljcyBkYXRhc2V0OiBldmVyeXRoaW5nIGNoZWFwIGVub3VnaCB0byBob2xkIHJlc2lkZW50LiBDb2x1bW4gYW5kXG4gKiBmZWF0dXJlICp2YWx1ZXMqLCBhbmQgcG9seWdvbiAqZ2VvbWV0cnkqLCBhcmUgZmV0Y2hlZCB0aHJvdWdoXG4gKiB7QGxpbmsgU3BhdGlhbERhdGFQb3J0fSBhcyB0aGV5IGFyZSBkaXNwbGF5ZWQuXG4gKi9cbi8qKlxuICogQSBwcmVjb21wdXRlZCBsb3ctZGltZW5zaW9uYWwgZW1iZWRkaW5nIG92ZXIgdGhlIFNBTUUgb2JzZXJ2YXRpb25zIOKAlCBVTUFQLCB0LVNORSwgUENBLlxuICpcbiAqIEFubm91bmNlZCBpbiB0aGUgZGF0YXNldCBhbmQgZmV0Y2hlZCBvbiBkZW1hbmQsIGV4YWN0bHkgbGlrZSBhIGNvbHVtbiBvciBhIGdlbmU6IHRoZVxuICogY29vcmRpbmF0ZXMgYXJlIGFub3RoZXIgcGVyLW9ic2VydmF0aW9uIHZlY3RvciwgYW5kIGEgZGF0YXNldCBtYXkgY2Fycnkgc2V2ZXJhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRW1iZWRkaW5nTWV0YSB7XG4gIC8qKiBLZXkgYXMgdGhlIHNvdXJjZSBuYW1lcyBpdCwgZS5nLiBgWF91bWFwYC4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2hvcnQgbGFiZWwgZm9yIG1lbnVzOyBmYWxscyBiYWNrIHRvIHtAbGluayBuYW1lfS4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiAyIGZvciBhIHBsYW5lLCAzIGZvciBhIGNsb3VkLiAqL1xuICBkaW1zOiAyIHwgMztcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgY29vcmRpbmF0ZXMgd2VyZSBDT01QVVRFRCBmb3IgdGhpcyBidW5kbGUgcmF0aGVyIHRoYW4gcHVibGlzaGVkIHdpdGggdGhlXG4gICAqIGRhdGFzZXQuIFdvcnRoIHN1cmZhY2luZzogYSBVTUFQIHJlY29tcHV0ZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyBpcyBhIGRpZmZlcmVudCBwaWN0dXJlLFxuICAgKiBhbmQgYSByZWFkZXIgY29tcGFyaW5nIGFnYWluc3QgYSBwYXBlcidzIGZpZ3VyZSBuZWVkcyB0byBrbm93IHdoaWNoIHRoZXkgYXJlIGxvb2tpbmcgYXQuXG4gICAqL1xuICBkZXJpdmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZyYWN0aW9uIG9mIHRvdGFsIHZhcmlhbmNlIGVhY2ggYXhpcyBhY2NvdW50cyBmb3IsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgZGltZW5zaW9ucy5cbiAgICpcbiAgICogT25seSBtZWFuaW5nZnVsIGZvciBhIExJTkVBUiBlbWJlZGRpbmcg4oCUIFBDQS4gSXRzIGF4ZXMgYXJlIG9yZGVyZWQsIGFuZCBlYWNoIG9uZSBleHBsYWlucyBhXG4gICAqIG1lYXN1cmFibGUgc2hhcmUgb2YgdGhlIHZhcmlhbmNlLCB3aGljaCBpcyB0aGUgd2hvbGUgcmVhc29uIHRvIGxvb2sgYXQgYSBQQ0EgcmF0aGVyIHRoYW4gYVxuICAgKiBVTUFQOiBcIlBDMSAoMjMlKVwiIHNheXMgc29tZXRoaW5nLCB3aGVyZSBcIlVNQVAgMVwiIHNheXMgbm90aGluZyBhdCBhbGwuIEEgVU1BUCdzIGNvb3JkaW5hdGVzXG4gICAqIGFyZSBhbiBhcmJpdHJhcnkgb3V0cHV0IG9mIGFuIG9wdGltaXNhdGlvbiB3aXRoIG5vIHZhcmlhbmNlIHRvIHJlcG9ydCwgc28gdGhpcyBzdGF5cyBhYnNlbnRcbiAgICogdGhlcmUgcmF0aGVyIHRoYW4gYmVpbmcgZmFrZWQuXG4gICAqL1xuICB2YXJpYW5jZVJhdGlvPzogbnVtYmVyW107XG4gIC8qKlxuICAgKiBIb3cgYSBkZXJpdmVkIGVtYmVkZGluZyB3YXMgY29tcHV0ZWQsIGluIGEgZmV3IHdvcmRzIOKAlCBlLmcuIFwiUENBKDUwKSB0aGVuIHBlcnBsZXhpdHkgMzAsXG4gICAqIHNlZWQgMFwiLlxuICAgKlxuICAgKiBOb3QgZGVjb3JhdGlvbi4gQSB0LVNORSBvciBVTUFQIGlzIHN0b2NoYXN0aWMsIGFuZCBpdHMgcGljdHVyZSBjaGFuZ2VzIG1hdGVyaWFsbHkgd2l0aFxuICAgKiBwZXJwbGV4aXR5IG9yIGBuX25laWdoYm9yc2A7IHR3byBydW5zIGF0IGRpZmZlcmVudCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50IHBpY3R1cmVzIG9mIHRoZSBzYW1lXG4gICAqIGNlbGxzLCBhbmQgbmVpdGhlciBpcyBtb3JlIGNvcnJlY3QuIFNheWluZyBcImNvbXB1dGVkIGhlcmVcIiB3aXRob3V0IHNheWluZyBIT1cgbGVhdmVzIGEgcmVhZGVyXG4gICAqIHVuYWJsZSB0byByZXByb2R1Y2Ugb3IgY29tcGFyZSBpdC4gQWJzZW50IGZvciBhIHB1Ymxpc2hlZCBlbWJlZGRpbmcsIHdob3NlIHBhcmFtZXRlcnMgYmVsb25nXG4gICAqIHRvIHdob2V2ZXIgcHVibGlzaGVkIGl0LlxuICAgKi9cbiAgcGFyYW1zPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBlbWJlZGRpbmcncyBjb29yZGluYXRlcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc2hhcGVkIGxpa2Uge0BsaW5rIFNwYXRpYWxPYnNlcnZhdGlvbnN9JyBgeGAvYHlgL2B6YCByYXRoZXIgdGhhbiBhbiAoTiwgRCkgbWF0cml4OlxuICogdGhlIHBvaW50IG9mIGFuIGVtYmVkZGluZyBoZXJlIGlzIHRvIGJlIHN3YXBwZWQgaW4gYXMgdGhlIHNjYXR0ZXIncyBjb29yZGluYXRlIHNvdXJjZSwgYW5kXG4gKiBtYXRjaGluZyB0aGF0IHNoYXBlIG1lYW5zIHRoZSByZW5kZXJlciwgdGhlIGhvdmVyIGhpdC10ZXN0IGFuZCB0aGUgc2VsZWN0aW9uIGNvZGUgbmVlZCBub1xuICogdmFyaWFudCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbEVtYmVkZGluZyB7XG4gIG1ldGE6IFNwYXRpYWxFbWJlZGRpbmdNZXRhO1xuICB4OiBGbG9hdDMyQXJyYXk7XG4gIHk6IEZsb2F0MzJBcnJheTtcbiAgej86IEZsb2F0MzJBcnJheTtcbn1cblxuLyoqXG4gKiBMZXZlbC1vZi1kZXRhaWwgZ2VvbWV0cnksIHNlcnZlZCBvbmUgZ3JpZCB0aWxlIGF0IGEgdGltZS5cbiAqXG4gKiBXaG9sZS1kYXRhc2V0IHZlY3RvcnMgc3RvcCB3b3JraW5nIHNvbWV3aGVyZSBwYXN0IDEwXjUgb2JzZXJ2YXRpb25zOiA3MTdrIFhlbml1bSBjZWxsXG4gKiBvdXRsaW5lcyBhcmUgfjE0MCBNQiwgYW5kIGEgd2hvbGUtdHJhbnNjcmlwdG9tZSBydW4gaGFzIH4xMF45IHRyYW5zY3JpcHRzLiBXaGF0IHNjYWxlc1xuICogaXMgd2hhdCBtYXAgdGlsZXMgZG8g4oCUIGEgc3F1YXJlIGdyaWQgaW4gdGhlIG9ic2VydmF0aW9ucycgY29vcmRpbmF0ZSBzcGFjZSwgb25lIGdyaWRcbiAqIHBlciBsZXZlbCwgZWFjaCBsZXZlbCdzIHRpbGVzIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBvbmUgYmVsb3cgYW5kIGNhcnJ5aW5nIGNvYXJzZXJcbiAqIGdlb21ldHJ5LiBUaGUgcmVuZGVyZXIgYXNrcyBvbmx5IGZvciB0aGUgdGlsZXMgb24gc2NyZWVuLCBhdCB0aGUgbGV2ZWwgdGhlIHpvb20gbmVlZHMuXG4gKlxuICogVGlsZSBgKGd4LCBneSlgIGF0IGxldmVsIGBsYCBjb3ZlcnMgYFtneMK3cywgKGd4KzEpwrdzKSDDlyBbZ3nCt3MsIChneSsxKcK3cylgIHdpdGhcbiAqIGBzID0gbGV2ZWxzW2xdLnRpbGVTaXplYCwgaW4gdGhlIHNhbWUgdW5pdHMgYXMge0BsaW5rIFNwYXRpYWxPYnNlcnZhdGlvbnMueH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRpbGVMZXZlbCB7XG4gIC8qKiBFZGdlIGxlbmd0aCBvZiBvbmUgdGlsZSwgaW4gb2JzZXJ2YXRpb24gY29vcmRpbmF0ZSB1bml0cy4gKi9cbiAgdGlsZVNpemU6IG51bWJlcjtcbn1cblxuLyoqIEF4aXMtYWxpZ25lZCBleHRlbnQgYFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXWAgaW4gb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMuICovXG5leHBvcnQgdHlwZSBTcGF0aWFsQm91bmRzID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBUaWxlZCBjZWxsL251Y2xldXMgYm91bmRhcmllcy4gTGV2ZWwgMCBpcyB0aGUgZmluZXN0IChldmVyeSB2ZXJ0ZXgpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUG9seWdvblRpbGVzTWV0YSB7XG4gIGJvdW5kczogU3BhdGlhbEJvdW5kcztcbiAgLyoqIEJvdW5kYXJ5IHNldHMgb24gb2ZmZXIg4oCUIHR5cGljYWxseSBgY2VsbGAgYW5kIGBudWNsZXVzYC4gKi9cbiAgc2V0czogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdO1xuICAvKiogVGhlIHNldCB0byBkcmF3IHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBjaG9zZW4uICovXG4gIGRlZmF1bHRTZXQ/OiBzdHJpbmc7XG4gIGxldmVsczogU3BhdGlhbFRpbGVMZXZlbFtdO1xufVxuXG4vKiogVGlsZWQgdHJhbnNjcmlwdHMuIExldmVsIDAgaXMgb25lIGVudHJ5IHBlciB0cmFuc2NyaXB0OyBjb2Fyc2VyIGxldmVscyBhZ2dyZWdhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUcmFuc2NyaXB0VGlsZXNNZXRhIHtcbiAgYm91bmRzOiBTcGF0aWFsQm91bmRzO1xuICAvKiogVG90YWwgdHJhbnNjcmlwdHMsIGZvciBkaXNwbGF5LiAqL1xuICBjb3VudD86IG51bWJlcjtcbiAgLyoqIFJlYWwgZ2VuZXMgKGNvbnRyb2wgcHJvYmVzIGV4Y2x1ZGVkKS4gTmFtZXMgY29tZSBmcm9tIHRoZSBmZWF0dXJlIHNlYXJjaC4gKi9cbiAgZ2VuZUNvdW50OiBudW1iZXI7XG4gIGhhc1o6IGJvb2xlYW47XG4gIGxldmVsczogKFNwYXRpYWxUaWxlTGV2ZWwgJiB7XG4gICAgLyoqIFRydWUgd2hlbiBhbiBlbnRyeSBzdGFuZHMgZm9yIHNldmVyYWwgdHJhbnNjcmlwdHMgKHNlZSB7QGxpbmsgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLndlaWdodH0pLiAqL1xuICAgIGFnZ3JlZ2F0ZWQ6IGJvb2xlYW47XG4gIH0pW107XG4gIC8qKlxuICAgKiBMZXZlbHMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBhc3NpZ24gZWFjaCBlbnRyeSB0byB0aGUgY2VsbCBpdCBsaWVzIGluXG4gICAqIGV4YWN0bHk7IGFib3ZlIGl0IHRoZSBhc3NpZ25tZW50IG5hbWVzIHRoZSBjZWxsIG5lYXJlc3QgYW4gYWdncmVnYXRlJ3MgY2VudHJvaWQuXG4gICAqL1xuICBleGFjdENlbGxMZXZlbD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWxsLWdlbmUgdHJhbnNjcmlwdCBncm91cGluZyBweXJhbWlkOiBzcXVhcmUgYmlucywgZm91ciB0aW1lcyBjb2Fyc2VyIHBlciBsZXZlbCxcbiAqIGVhY2ggaG9sZGluZyBhIGNvdW50LCBhIGNlbnRyb2lkIGFuZCB0aGUgY2VsbCB0aGF0IGNvbnRyaWJ1dGVkIG1vc3Qgb2YgaXRzIHRyYW5zY3JpcHRzLlxuICogU2VydmVkIHBlciB0aWxlLCBpbiB0aGUge0BsaW5rIFNwYXRpYWxUcmFuc2NyaXB0VGlsZX0gbGF5b3V0IChvbmUgZW50cnkgcGVyIGJpbikuXG4gKlxuICogVGlsZSBgKHR4LCB0eSlgIG9mIGxldmVsIGBsYCBjb3ZlcnMgYG9yaWdpbiArIFt0eMK3cywgKHR4KzEpwrdzKSDDlyBbdHnCt3MsICh0eSsxKcK3cylgIHdpdGhcbiAqIGBzID0gbGV2ZWxzW2xdLnRpbGVTaXplYCDigJQgbm90ZSB0aGUgb3JpZ2luLCB3aGljaCB0aGUgcGVyLWdlbmUgdGlsZXMgZG8gbm90IGhhdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YSB7XG4gIGJvdW5kczogU3BhdGlhbEJvdW5kcztcbiAgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVHJhbnNjcmlwdHMgdGhlIHB5cmFtaWQgd2FzIGJ1aWx0IGZyb20uICovXG4gIGNvdW50OiBudW1iZXI7XG4gIGxldmVsczogeyBiaW5TaXplOiBudW1iZXI7IHRpbGVTaXplOiBudW1iZXIgfVtdO1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgcHlyYW1pZCB0aGUgc2VydmVyIGlzIHN0aWxsIGJ1aWxkaW5nIChpdCBidWlsZHMgb25lIGl0c2VsZiB3aGVuIGEgZGF0YXNldFxuICogYXJyaXZlcyB3aXRob3V0IGl0KS4gXCJBbGwgZ2VuZXNcIiBiZWNvbWVzIGF2YWlsYWJsZSBvbmNlIGl0IGlzIGRvbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRyYW5zY3JpcHRCaW5zU3RhdHVzIHtcbiAgc3RhdGU6ICdxdWV1ZWQnIHwgJ2J1aWxkaW5nJyB8ICdmYWlsZWQnO1xuICAvKiogU291cmNlIHRpbGVzIHByb2Nlc3NlZCBzbyBmYXIsIG9mIGB0b3RhbGAuICovXG4gIGRvbmU/OiBudW1iZXI7XG4gIHRvdGFsPzogbnVtYmVyO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKiogV2hhdCBpcyBpbiBhbiBhcmVhIOKAlCB0aGUgaG92ZXIgZGV0YWlscyBvZiBhIHRyYW5zY3JpcHQgbWFya2VyIG9yIGdyb3VwZWQgYmluLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnkge1xuICAvKiogQWJzZW50IGZvciBhIHB1cmUgY2VsbC1pZCBsb29rdXAuICovXG4gIHRyYW5zY3JpcHRzPzogbnVtYmVyO1xuICAvKiogRGlzdGluY3QgZ2VuZXMgYW1vbmcgdGhlbS4gKi9cbiAgZ2VuZXM/OiBudW1iZXI7XG4gIHRvcEdlbmVzPzogeyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfVtdO1xuICAvKiogRGlzdGluY3QgY2VsbHMgdGhleSBmYWxsIGluLCBhbmQgaG93IG1hbnkgZmFsbCBpbiBub25lLiAqL1xuICBjZWxscz86IG51bWJlcjtcbiAgdW5hc3NpZ25lZD86IG51bWJlcjtcbiAgdG9wQ2VsbHM/OiB7IGluZGV4OiBudW1iZXI7IGlkPzogc3RyaW5nOyBjb3VudDogbnVtYmVyIH1bXTtcbiAgLyoqIERpc3BsYXkgaWRzIG9mIHRoZSBjZWxscyBhc2tlZCBmb3IsIGJ5IG9ic2VydmF0aW9uIGluZGV4LiAqL1xuICBjZWxsSWRzPzogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcbn1cblxuLyoqIEEgcGVyLWdlbmUgdHJhbnNjcmlwdC1jb3VudCByYXN0ZXIgY292ZXJpbmcgdGhlIHNlY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEZW5zaXR5TWV0YSB7XG4gIC8qKiBTaXplIG9mIG9uZSByYXN0ZXIgY2VsbCwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsIGBbeCwgeV1gLiAqL1xuICBncmlkU2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIE9ic2VydmF0aW9uLXNwYWNlIHBvc2l0aW9uIG9mIHJhc3RlciBjZWxsICgwLCAwKSdzIG5lYXIgY29ybmVyLiAqL1xuICBvcmlnaW46IFtudW1iZXIsIG51bWJlcl07XG4gIHJvd3M6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xufVxuXG4vKiogXCJObyBvYnNlcnZhdGlvblwiIGluIHtAbGluayBTcGF0aWFsVHJhbnNjcmlwdFRpbGUub2JzZXJ2YXRpb259LiAqL1xuZXhwb3J0IGNvbnN0IE5PX09CU0VSVkFUSU9OID0gMHhmZmZmZmZmZjtcblxuLyoqIE9uZSB0aWxlIG9mIGJvdW5kYXJpZXM6IHJpbmdzIGFzIGluIHtAbGluayBTcGF0aWFsUG9seWdvbnN9LCBwbHVzIHdobyBvd25zIGVhY2ggcmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFBvbHlnb25UaWxlIGV4dGVuZHMgU3BhdGlhbFBvbHlnb25zIHtcbiAgLyoqIE9ic2VydmF0aW9uIGluZGV4IG9mIHJpbmcgYGlgIOKAlCB0aGUgam9pbiBrZXkgdG8gY29sdW1ucyBhbmQgZmVhdHVyZXMuICovXG4gIG9ic2VydmF0aW9uOiBVaW50MzJBcnJheTtcbn1cblxuLyoqIE9uZSB0aWxlIG9mIHRyYW5zY3JpcHRzIChvciBhZ2dyZWdhdGVzIG9mIHRoZW0pLiBFdmVyeSBhcnJheSBoYXMgbGVuZ3RoIHtAbGluayBjb3VudH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gIGFnZ3JlZ2F0ZWQ6IGJvb2xlYW47XG4gIHg6IEZsb2F0MzJBcnJheTtcbiAgeTogRmxvYXQzMkFycmF5O1xuICB6OiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBUcmFuc2NyaXB0cyBlYWNoIGVudHJ5IHN0YW5kcyBmb3Ig4oCUIDEgYXQgYW4gdW5hZ2dyZWdhdGVkIGxldmVsLiAqL1xuICB3ZWlnaHQ6IFVpbnQzMkFycmF5O1xuICAvKiogT2JzZXJ2YXRpb24gKGNlbGwpIHRoZSBlbnRyeSBmYWxscyBpbiwgb3Ige0BsaW5rIE5PX09CU0VSVkFUSU9OfS4gKi9cbiAgb2JzZXJ2YXRpb246IFVpbnQzMkFycmF5O1xuICAvKiogSW5kZXggaW50byB0aGUgYGdlbmVzYCBsaXN0IHRoZSB0aWxlIHdhcyByZXF1ZXN0ZWQgd2l0aC4gKi9cbiAgZ2VuZTogVWludDE2QXJyYXk7XG59XG5cbi8qKiBUcmFuc2NyaXB0IHRvdGFscyBmb3IgYW4gZXN0aW1hdGUgb2YgaG93IG1hbnkgbWFya2VycyBhIHNlbGVjdGlvbiB3b3VsZCBkcmF3LiAqL1xuLyoqIFRoZSBwZXItZ2VuZSBsZXZlbHM6IGVhY2ggbGV2ZWwncyBiaW4gYW5kIHRpbGUgc2l6ZSwgb24gdGhlIGFsbC1nZW5lIHB5cmFtaWQncyBncmlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVHJhbnNjcmlwdEdlbmVCaW5zTWV0YSB7XG4gIG9yaWdpbjogW251bWJlciwgbnVtYmVyXTtcbiAgbGV2ZWxzOiB7IGJpblNpemU6IG51bWJlcjsgdGlsZVNpemU6IG51bWJlciB9W107XG59XG5cbi8qKlxuICogTWFya2VyIGdlbmVzIG9mIGVhY2ggZ3JvdXAgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW46IHBlciBncm91cCwgdGhlIHJlYWwgZ2VuZXMgbW9zdFxuICogc3BlY2lmaWMgdG8gaXQsIGJlc3QgZmlyc3QuIEEgZ2VuZSdzIHNjb3JlIGlzIGl0cyBtZWFuIGBsb2cxcChjb3VudClgIGluIHRoZSBncm91cCBtaW51c1xuICogdGhhdCBpbiBldmVyeSBvdGhlciBjZWxsOyBpdCBtdXN0IGJlIGRldGVjdGVkIGluIGF0IGxlYXN0IDEwJSBvZiB0aGUgZ3JvdXAncyBjZWxscywgYW5kXG4gKiBpbiBtb3JlIG9mIHRoZW0gdGhhbiBlbHNld2hlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbE1hcmtlckdlbmVzIHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIGdyb3Vwczoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogQ2VsbHMgaW4gdGhlIGdyb3VwLiAqL1xuICAgIGNlbGxzOiBudW1iZXI7XG4gICAgZ2VuZXM6IHsgbmFtZTogc3RyaW5nOyBzY29yZTogbnVtYmVyOyBwY3RJbjogbnVtYmVyOyBwY3RPdXQ6IG51bWJlciB9W107XG4gIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVHJhbnNjcmlwdENvdW50cyB7XG4gIC8qKiBUb3RhbCB0cmFuc2NyaXB0cyBwZXIgcmVxdWVzdGVkIGdlbmUsIG92ZXIgdGhlIHdob2xlIGRhdGFzZXQuICovXG4gIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqIFRvdGFsIG92ZXIgZXZlcnkgZ2VuZS4gKi9cbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIEV4dGVudCB0aGUgdG90YWxzIGFyZSBzcHJlYWQgb3ZlciAob2JzZXJ2YXRpb24gdW5pdHMpLiAqL1xuICBib3VuZHM6IFNwYXRpYWxCb3VuZHM7XG59XG5cbi8qKiBBIHN1bW1lZCBkZW5zaXR5IHJhc3RlciBmb3IgYSBsaXN0IG9mIGdlbmVzOyBgdmFsdWVzYCBpcyByb3ctbWFqb3IgYHJvd3Mgw5cgY29sc2AuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEZW5zaXR5UmFzdGVyIHtcbiAgbWV0YTogU3BhdGlhbERlbnNpdHlNZXRhO1xuICBnZW5lczogc3RyaW5nW107XG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEYXRhc2V0IHtcbiAgLyoqIFN0YWJsZSBpZCDigJQgdGhlIGtleSB0aGUgcG9ydCdzIGxhenkgYWNjZXNzb3JzIGFyZSBzY29wZWQgdG8uICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciBtZW51cy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnM7XG4gIC8qKiBFdmVyeSBjb2x1bW4gYXZhaWxhYmxlLCB3aGV0aGVyIG9yIG5vdCBpdHMgdmFsdWVzIGFyZSBsb2FkZWQuICovXG4gIGNvbHVtbnM6IFNwYXRpYWxDb2x1bW5NZXRhW107XG4gIGZlYXR1cmVzPzogU3BhdGlhbEZlYXR1cmVNZXRhO1xuICBwb2x5Z29ucz86IFNwYXRpYWxQb2x5Z29uc01ldGE7XG4gIGltYWdlUmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICAvKiogUHJlc2VuY2UgKyBnZW9tZXRyeSBvZiBhIHJlZmVyZW5jZSB2b2x1bWUgdGhlIG9ic2VydmF0aW9ucyBzaXQgaW5zaWRlLiAqL1xuICB2b2x1bWU/OiBTcGF0aWFsVm9sdW1lTWV0YTtcbiAgLyoqIEVtYmVkZGluZ3MgYXZhaWxhYmxlIGZvciB0aGVzZSBvYnNlcnZhdGlvbnMsIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBmZXRjaGVkIG9uIGRlbWFuZC4gKi9cbiAgZW1iZWRkaW5ncz86IFNwYXRpYWxFbWJlZGRpbmdNZXRhW107XG4gIC8qKiBMZXZlbC1vZi1kZXRhaWwgYm91bmRhcmllcywgZmV0Y2hlZCBwZXIgdGlsZSDigJQgc2VlIHtAbGluayBTcGF0aWFsUG9seWdvblRpbGVzTWV0YX0uICovXG4gIHBvbHlnb25UaWxlcz86IFNwYXRpYWxQb2x5Z29uVGlsZXNNZXRhO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIHRyYW5zY3JpcHRzLCBmZXRjaGVkIHBlciB0aWxlIOKAlCBzZWUge0BsaW5rIFNwYXRpYWxUcmFuc2NyaXB0VGlsZXNNZXRhfS4gKi9cbiAgdHJhbnNjcmlwdFRpbGVzPzogU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGE7XG4gIC8qKiBBIHNlcnZlZCBwZXItZ2VuZSB0cmFuc2NyaXB0IGRlbnNpdHkgcmFzdGVyLiAqL1xuICBkZW5zaXR5PzogU3BhdGlhbERlbnNpdHlNZXRhO1xuICAvKiogVGhlIGFsbC1nZW5lIHRyYW5zY3JpcHQgZ3JvdXBpbmcgcHlyYW1pZCwgd2hlbiBpdCBoYXMgYmVlbiBidWlsdC4gKi9cbiAgdHJhbnNjcmlwdEJpbnM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNNZXRhO1xuICAvKiogUGVyLWdlbmUgbGV2ZWxzIG9mIHRoZSB0cmFuc2NyaXB0IHB5cmFtaWQgKHNhbWUgYmlucyk6IGEgZ2VuZSBzZWxlY3Rpb24gYXQgYW55IHpvb20uICovXG4gIHRyYW5zY3JpcHRHZW5lQmlucz86IFNwYXRpYWxUcmFuc2NyaXB0R2VuZUJpbnNNZXRhO1xuICAvKiogUHJlc2VudCB3aGlsZSB0aGUgc2VydmVyIGlzIHN0aWxsIGJ1aWxkaW5nIHtAbGluayB0cmFuc2NyaXB0Qmluc30uICovXG4gIHRyYW5zY3JpcHRCaW5zU3RhdHVzPzogU3BhdGlhbFRyYW5zY3JpcHRCaW5zU3RhdHVzO1xuICAvKipcbiAgICogTWljcm9ucyBwZXIgb2JzZXJ2YXRpb24gY29vcmRpbmF0ZSB1bml0IOKAlCB3aGF0IG1ha2VzIGEgc2NhbGUgYmFyIHBvc3NpYmxlLlxuICAgKlxuICAgKiBUaGUgMkQgcGF0aCBnZXRzIHRoaXMgZnJvbSBgaW1hZ2VSZWYubXBwWGAsIGJlY2F1c2UgdGhlcmUgdGhlIGNvb3JkaW5hdGVzIGFyZVxuICAgKiBpbWFnZSBwaXhlbHMuIEEgM0QgY2xvdWQgaGFzIG5vIGltYWdlLCBzbyBpdCBoYXMgdG8gc2F5IGZvciBpdHNlbGY6IGAxYCBtZWFuc1xuICAgKiB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgbWljcm9ucy5cbiAgICpcbiAgICogQWJzZW50IG1lYW5zIHRoZSB1bml0IGlzIFVOS05PV04sIGFuZCBhIHJlbmRlcmVyIG11c3QgdGhlbiBkcmF3IG5vIHNjYWxlIGJhclxuICAgKiByYXRoZXIgdGhhbiBhc3N1bWUgb25lLiBBIGJhciBsYWJlbGxlZCBpbiBtaWNyb25zIG92ZXIgcGl4ZWwtc3BhY2VcbiAgICogY29vcmRpbmF0ZXMgaXMgd29yc2UgdGhhbiBubyBiYXI6IGl0IGxvb2tzIGxpa2UgYSBtZWFzdXJlbWVudC5cbiAgICovXG4gIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgM0Qgc2NhbGFyIHJlZmVyZW5jZSB2b2x1bWUgcmVnaXN0ZXJlZCB0byB0aGUgb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMg4oCUIHRoZVxuICogYW5hdG9taWNhbCBiYWNrZHJvcCBmb3IgYSBwb2ludCBjbG91ZCAoYW4gYXRsYXMgdGVtcGxhdGUsIG9yIGFuIGltYWdlIHotc3RhY2spLlxuICpcbiAqIEdlb21ldHJ5IG9ubHk7IHRoZSB2b3hlbHMgYXJlIGZldGNoZWQgdGhyb3VnaFxuICoge0BsaW5rIFNwYXRpYWxEYXRhUG9ydC5nZXRWb2x1bWV9IHdoZW4gc29tZXRoaW5nIGlzIGdvaW5nIHRvIGRyYXcgdGhlbS4gQSBjbG91ZFxuICogd2l0aG91dCBvbmUgc3RpbGwgcmVuZGVycywganVzdCBpbiBlbXB0eSBzcGFjZS5cbiAqXG4gKiBUaGUgb2JzZXJ2YXRpb25zJyBjb29yZGluYXRlIGZyYW1lIG11c3QgYmUgdGhlIHZvbHVtZSdzIG93bjogdm94ZWwgYChpLCBqLCBrKWBcbiAqIGNvdmVycyBgW2kgKiB2b3hlbFNpemVbMF0sIChpICsgMSkgKiB2b3hlbFNpemVbMF0pYCBvbiB4LCBhbmQgc28gb24uIFRoYXQgbWVhbnNcbiAqIHRoZSB2b2x1bWUncyBuZWFyIGNvcm5lciBzaXRzIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbiwgc28gYSByZW5kZXJlciBjYW4gcGxhY2VcbiAqIHRoZSB0d28gdG9nZXRoZXIga25vd2luZyBub3RoaW5nIGVsc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFZvbHVtZU1ldGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqIFdvcmxkIHNpemUgb2Ygb25lIHZveGVsIHBlciBheGlzLCBpbiB0aGUgb2JzZXJ2YXRpb25zJyB1bml0cy4gKi9cbiAgdm94ZWxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKiBMb29rIGEgY29sdW1uJ3MgZGVzY3JpcHRvciB1cCBieSBuYW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb2x1bW5NZXRhKFxuICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgbmFtZTogc3RyaW5nLFxuKTogU3BhdGlhbENvbHVtbk1ldGEgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZGF0YXNldC5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG59XG4iXX0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQStFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFvQmxDLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsQ0FBZ0I7SUFDbEQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUM7QUFDdkMsQ0FBQztBQUNELGtEQUFrRDtBQUNsRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBZ0I7SUFDakQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7QUFDdEMsQ0FBQztBQWdPRCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQTJJekMsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBdUIsRUFBRSxJQUFZO0lBQ2xFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFja2VuZC1uZXV0cmFsIGRhdGEgbW9kZWwgZm9yIGEgKipzcGF0aWFsLW9taWNzIGRhdGFzZXQqKjogTiBvYnNlcnZhdGlvbnNcbiAqIChWaXNpdW0gc3BvdHMsIHNlZ21lbnRlZCBjZWxscywgbnVjbGVpLCDigKYpIHBvc2l0aW9uZWQgaW4gdGhlIHBpeGVsIHNwYWNlIG9mIGFcbiAqIHRpc3N1ZSBpbWFnZSwgZWFjaCBjYXJyeWluZyBjYXRlZ29yaWNhbCBhbmQgY29udGludW91cyBhbm5vdGF0aW9ucywgcGx1cyBhblxuICogb3B0aW9uYWwgZmVhdHVyZSAoZ2VuZSkgbWF0cml4IGFuZCBvcHRpb25hbCBwZXItb2JzZXJ2YXRpb24gYm91bmRhcmllcy5cbiAqXG4gKiBERVNJR05cbiAqIC0tLS0tLVxuICogMS4gKipTdHJ1Y3Qtb2YtYXJyYXlzLCBub3Qgb2JqZWN0LXBlci1jZWxsLioqIFJlYWwgZGF0YXNldHMgcnVuIDEwXjMgKFZpc2l1bSlcbiAqICAgIHRvIDEwXjYgKFhlbml1bS9Db3NNeCkgb2JzZXJ2YXRpb25zLiBge3gsIHl9W11gIGF0IDUwMGsgY2VsbHMgaXMgfjUwMGtcbiAqICAgIG9iamVjdHMgdGhlIEdDIGhhcyB0byB3YWxrOyB0d28gYEZsb2F0MzJBcnJheWBzIGFyZSB0d28gYWxsb2NhdGlvbnMgYW5kXG4gKiAgICB1cGxvYWQgdG8gdGhlIEdQVSB3aXRob3V0IGEgY29weS5cbiAqXG4gKiAyLiAqKk1ldGFkYXRhIGlzIGVhZ2VyLCB2YWx1ZXMgYXJlIGxhenkuKiogQSBkYXRhc2V0IGFkdmVydGlzZXMgKndoaWNoKlxuICogICAgY29sdW1ucyBhbmQgZmVhdHVyZXMgZXhpc3QgKHtAbGluayBTcGF0aWFsQ29sdW1uTWV0YX0sXG4gKiAgICB7QGxpbmsgU3BhdGlhbEZlYXR1cmVNZXRhfSk7IHRoZSB2ZWN0b3JzIHRoZW1zZWx2ZXMgYXJlIGZldGNoZWQgb24gZGVtYW5kXG4gKiAgICB0aHJvdWdoIHtAbGluayBTcGF0aWFsRGF0YVBvcnR9LiBBIFZpc2l1bSB0YWJsZSBpcyB+MzBrIGdlbmVzIHdpZGUg4oCUIHRoZVxuICogICAgZGVuc2UgbWF0cml4IGlzIH44MDAgTUIg4oCUIHNvIFwibG9hZCB0aGUgZGF0YXNldFwiIGNhbiBuZXZlciBtZWFuIFwibG9hZCB0aGVcbiAqICAgIG1hdHJpeFwiLiBPbmx5IHRoZSBoYW5kZnVsIG9mIGNvbHVtbnMgYWN0dWFsbHkgYmVpbmcgZGlzcGxheWVkIGlzIHJlc2lkZW50LlxuICpcbiAqIDMuICoqRGF0YSBzdGF5cyBkYXRhLioqIE5vIEkvTywgbm8gUnhKUywgbm8gQW5ndWxhciBpbiB0aGlzIGZpbGUg4oCUIHRoZSBzYW1lXG4gKiAgICBydWxlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgIGZvbGxvd3MuIEZldGNoaW5nIGxpdmVzIG9uIHRoZSBwb3J0LlxuICpcbiAqIFRoZSBzaGFwZSBtaXJyb3JzIGhvdyB0aGUgZmllbGQgYWxyZWFkeSBzdG9yZXMgdGhpcyAoU3BhdGlhbERhdGEvQW5uRGF0YTpcbiAqIGBvYnNgIGFubm90YXRpb25zLCBgdmFyYCBmZWF0dXJlcywgYG9ic20vc3BhdGlhbGAgY29vcmRpbmF0ZXMsIHNoYXBlcyB3aXRoIGFcbiAqIGNvb3JkaW5hdGUgdHJhbnNmb3JtKSBzbyBhbiBhZGFwdGVyIGlzIGEgcHJvamVjdGlvbiwgbm90IGEgdHJhbnNsYXRpb24uXG4gKi9cblxuLyoqXG4gKiBPYnNlcnZhdGlvbiBwb3NpdGlvbnMuIEV2ZXJ5IGFycmF5IGlzIGxlbmd0aCB7QGxpbmsgY291bnR9IGFuZCBpbmRleC1hbGlnbmVkOlxuICogb2JzZXJ2YXRpb24gYGlgIGlzIGF0IGAoeFtpXSwgeVtpXSlgLCBhbmQgY29sdW1uL2ZlYXR1cmUgdmVjdG9ycyBpbmRleCB0aGVcbiAqIHNhbWUgd2F5LiBUaGlzIHNoYXJlZCBpbmRleCBpcyB0aGUgam9pbiBrZXkgZm9yIHRoZSB3aG9sZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsT2JzZXJ2YXRpb25zIHtcbiAgLyoqIE4g4oCUIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gIC8qKiBYIGluIHRoZSByZWZlcmVuY2UgaW1hZ2UncyBwaXhlbCBzcGFjZSAoc2VlIHtAbGluayBTcGF0aWFsSW1hZ2VSZWZ9KS4gKi9cbiAgeDogRmxvYXQzMkFycmF5O1xuICAvKiogWSBpbiB0aGUgcmVmZXJlbmNlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuICovXG4gIHk6IEZsb2F0MzJBcnJheTtcbiAgLyoqIFosIGZvciBzZXJpYWwgc2VjdGlvbnMgb3IgZ2VudWluZWx5IDNEIGFzc2F5cy4gQWJzZW50IGZvciBhIHNpbmdsZSBwbGFuZS4gKi9cbiAgej86IEZsb2F0MzJBcnJheTtcbiAgLyoqIFN0YWJsZSBwZXItb2JzZXJ2YXRpb24gaWRzIChiYXJjb2RlcywgY2VsbCBpZHMpIGZvciB0b29sdGlwcyBhbmQgZXhwb3J0LlxuICAgKiAgT3B0aW9uYWwg4oCUIG9taXQgZm9yIGxhcmdlIGRhdGFzZXRzIHdoZXJlIHRoZSBzdHJpbmdzIGNvc3QgbW9yZSB0aGFuIHRoZXlcbiAgICogIGFyZSB3b3J0aC4gKi9cbiAgaWRzPzogc3RyaW5nW107XG4gIC8qKiBNYXJrZXIgUkFESVVTIGluIGltYWdlIHBpeGVsczogb25lIHZhbHVlIHNoYXJlZCBieSBhbGwgb2JzZXJ2YXRpb25zIChhXG4gICAqICBWaXNpdW0gc3BvdCBpcyBhIGZpeGVkIDU1IMK1bSDih5IgYDI3LjUgLyBtcHBYYCBweCksIG9yIG9uZSBwZXIgb2JzZXJ2YXRpb25cbiAgICogIChzZWdtZW50ZWQgY2VsbHMpLiBBYnNlbnQg4oeSIHRoZSByZW5kZXJlciBwaWNrcyBhIGRpc3BsYXkgZGVmYXVsdC4gKi9cbiAgcmFkaXVzPzogRmxvYXQzMkFycmF5IHwgbnVtYmVyO1xufVxuXG4vKiogRmllbGRzIGNvbW1vbiB0byBldmVyeSBjb2x1bW4gZGVzY3JpcHRvci4gKi9cbmludGVyZmFjZSBTcGF0aWFsQ29sdW1uTWV0YUJhc2Uge1xuICAvKiogQ29sdW1uIG5hbWUgYXMgdGhlIHVzZXIgc2VlcyBpdCAoYGxlaWRlbmAsIGB0b3RhbF9jb3VudHNgKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTG9uZ2VyIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciB0b29sdGlwcy9tZW51cy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBkaXNjcmV0ZSBhbm5vdGF0aW9uIOKAlCBjbHVzdGVyLCBjZWxsIHR5cGUsIHJlZ2lvbiwgc2FtcGxlLiBSZW5kZXJlZCBhcyBhXG4gKiBwYWxldHRlICsgbGVnZW5kOyBhIGxlZ2VuZCBjbGljayBzZWxlY3RzIHRoZSBjYXRlZ29yeSdzIG9ic2VydmF0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbENvbHVtbk1ldGEgZXh0ZW5kcyBTcGF0aWFsQ29sdW1uTWV0YUJhc2Uge1xuICBraW5kOiAnY2F0ZWdvcmljYWwnO1xuICAvKiogQ2F0ZWdvcnkgbGFiZWxzOyBhIHZhbHVlJ3MgbGFiZWwgaXMgYGNhdGVnb3JpZXNbY29kZXNbaV1dYC4gKi9cbiAgY2F0ZWdvcmllczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBIZWFkaW5nIHRoZSBjb2x1bW4gaXMgbGlzdGVkIHVuZGVyIGluIGEgZ3JvdXAgcGlja2VyIOKAlCBlLmcuIFwiWGVuaXVtIE9uYm9hcmQgQW5hbHlzaXNcbiAgICogZ3JvdXBzXCIgZm9yIGEgcGlwZWxpbmUncyBjbHVzdGVyaW5ncywgXCJJbXBvcnRlZCBncm91cHNcIiBmb3Igb25lcyBhZGRlZCBieSBhIHVzZXIuXG4gICAqL1xuICBzZWN0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogQ29sdW1ucyB0aGF0IGFyZSB2YXJpYW50cyBvZiBvbmUgY2hvaWNlIOKAlCBrLW1lYW5zIGF0IGsgPSAy4oCmMTAg4oCUIHNoYXJlIGEgZmFtaWx5OiBhXG4gICAqIHBpY2tlciBsaXN0cyB0aGUgZmFtaWx5IG9uY2UgYW5kIG9mZmVycyB0aGUgdmFyaWFudHMgYmVzaWRlIGl0LlxuICAgKi9cbiAgZmFtaWx5PzogeyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2YXJpYW50OiBzdHJpbmcgfTtcbiAgLyoqIEF1dGhvcmVkIGRpc3BsYXkgY29sb3VycyBhcyBgI3JyZ2diYmAsIGluZGV4LWFsaWduZWQgd2l0aFxuICAgKiAge0BsaW5rIGNhdGVnb3JpZXN9LiBTdXBwbHkgdGhlc2UgdG8ga2VlcCB0aGUgdmlld2VyJ3MgcGFsZXR0ZSBpZGVudGljYWwgdG9cbiAgICogIHRoZSBmaWd1cmVzIHRoZSBzYW1lIGFuYWx5c2lzIHByb2R1Y2VkIGluIFIvUHl0aG9uOyBvbWl0IHRvIGxldCB0aGUgdmlld2VyXG4gICAqICBkZXJpdmUgb25lLiAqL1xuICBjb2xvcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbnRpbnVvdXMgbWVhc3VyZW1lbnQg4oCUIGV4cHJlc3Npb24sIFFDIG1ldHJpYywgYXJlYSwgZGVuc2l0eS4gUmVuZGVyZWRcbiAqIHRocm91Z2ggdGhlIHNoYXJlZCBjb2xvcm1hcC9MVVQgKyBjb250cmFzdCB3aW5kb3cuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludW91c0NvbHVtbk1ldGEgZXh0ZW5kcyBTcGF0aWFsQ29sdW1uTWV0YUJhc2Uge1xuICBraW5kOiAnY29udGludW91cyc7XG4gIC8qKiBVbml0IGZvciBheGlzL3Rvb2x0aXAgbGFiZWxzIChgY291bnRzYCwgYMK1bcKyYCkuICovXG4gIHVuaXQ/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGNvbHVtbiByZWFkcyBiZXN0IGxvZy1zY2FsZWQg4oCUIGNvdW50IGRhdGEgYWxtb3N0IGFsd2F5c1xuICAgKiAgZG9lcywgYW5kIGEgbGluZWFyIHNjYWxlIGNvbGxhcHNlcyBpdCBhZ2FpbnN0IGEgZmV3IGJyaWdodCBvdXRsaWVycy4gKi9cbiAgbG9nU2NhbGVIaW50PzogYm9vbGVhbjtcbiAgLyoqIE9ic2VydmVkIGV4dHJlbWVzLCB3aGVuIHRoZSBwcm9kdWNlciBrbm93cyB0aGVtLiBMZXRzIHRoZSBVSSBzZWVkIGFcbiAgICogIGNvbnRyYXN0IHdpbmRvdyBhbmQgYXhpcyByYW5nZSB3aXRob3V0IGZpcnN0IHNjYW5uaW5nIHRoZSB2ZWN0b3IuICovXG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xufVxuXG4vKiogRGVzY3JpcHRvciBvZiBvbmUgcGVyLW9ic2VydmF0aW9uIGNvbHVtbiwgZGlzY3JpbWluYXRlZCBieSBga2luZGAuICovXG5leHBvcnQgdHlwZSBTcGF0aWFsQ29sdW1uTWV0YSA9IENhdGVnb3JpY2FsQ29sdW1uTWV0YSB8IENvbnRpbnVvdXNDb2x1bW5NZXRhO1xuXG4vKipcbiAqIENvZGUgbWVhbmluZyBcInRoaXMgb2JzZXJ2YXRpb24gaGFzIG5vIGNhdGVnb3J5XCIgKHVuYXNzaWduZWQgLyBmaWx0ZXJlZCBvdXQgL1xuICogbm90IGluIHRpc3N1ZSkuIFJlbmRlcmVycyBzaG91bGQgZHJhdyBpdCBpbiB0aGUgbXV0ZWQgYmFja2dyb3VuZCBzdHlsZSByYXRoZXJcbiAqIHRoYW4gYXMgYSByZWFsIGNhdGVnb3J5LCBhbmQgaXQgbXVzdCBuZXZlciBpbmRleCB7QGxpbmtcbiAqIENhdGVnb3JpY2FsQ29sdW1uTWV0YS5jYXRlZ29yaWVzfS5cbiAqL1xuZXhwb3J0IGNvbnN0IE5PX0NBVEVHT1JZID0gMHhmZmZmO1xuXG4vKiogQSBsb2FkZWQgY2F0ZWdvcmljYWwgY29sdW1uOiBwZXItb2JzZXJ2YXRpb24gaW5kaWNlcyBpbnRvIGBtZXRhLmNhdGVnb3JpZXNgLFxuICogIG9yIHtAbGluayBOT19DQVRFR09SWX0uICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsQ29sdW1uIHtcbiAgbWV0YTogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhO1xuICAvKiogTGVuZ3RoID0ge0BsaW5rIFNwYXRpYWxPYnNlcnZhdGlvbnMuY291bnR9LiAqL1xuICBjb2RlczogVWludDE2QXJyYXk7XG59XG5cbi8qKiBBIGxvYWRlZCBjb250aW51b3VzIGNvbHVtbi4gYE5hTmAgbWFya3MgYSBtaXNzaW5nIHZhbHVlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51b3VzQ29sdW1uIHtcbiAgbWV0YTogQ29udGludW91c0NvbHVtbk1ldGE7XG4gIC8qKiBMZW5ndGggPSB7QGxpbmsgU3BhdGlhbE9ic2VydmF0aW9ucy5jb3VudH0uICovXG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xufVxuXG4vKiogQSBsb2FkZWQgY29sdW1uIHdpdGggaXRzIHZhbHVlcywgZGlzY3JpbWluYXRlZCBieSBgbWV0YS5raW5kYC4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxDb2x1bW4gPSBDYXRlZ29yaWNhbENvbHVtbiB8IENvbnRpbnVvdXNDb2x1bW47XG5cbi8qKiBOYXJyb3cgYSBsb2FkZWQgY29sdW1uIHRvIGEgY2F0ZWdvcmljYWwgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2F0ZWdvcmljYWxDb2x1bW4oYzogU3BhdGlhbENvbHVtbik6IGMgaXMgQ2F0ZWdvcmljYWxDb2x1bW4ge1xuICByZXR1cm4gYy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCc7XG59XG4vKiogTmFycm93IGEgbG9hZGVkIGNvbHVtbiB0byBhIGNvbnRpbnVvdXMgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGludW91c0NvbHVtbihjOiBTcGF0aWFsQ29sdW1uKTogYyBpcyBDb250aW51b3VzQ29sdW1uIHtcbiAgcmV0dXJuIGMubWV0YS5raW5kID09PSAnY29udGludW91cyc7XG59XG5cbi8qKlxuICogVGhlIGZlYXR1cmUgKGdlbmUpIG1hdHJpeCwgZGVzY3JpYmVkIGJ1dCBuZXZlciBkZWxpdmVyZWQgd2hvbGUuIFZlY3RvcnMgY29tZVxuICogb25lIGF0IGEgdGltZSBmcm9tIHtAbGluayBTcGF0aWFsRGF0YVBvcnQuZ2V0RmVhdHVyZVZlY3Rvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbEZlYXR1cmVNZXRhIHtcbiAgLyoqIE51bWJlciBvZiBmZWF0dXJlcyBhdmFpbGFibGUuICovXG4gIGNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBbGwgZmVhdHVyZSBuYW1lcywgd2hlbiB0aGUgcHJvZHVjZXIgY2hvc2UgdG8gaW5saW5lIHRoZW0uIFByZXNlbnQgZm9yXG4gICAqIHRhcmdldGVkIHBhbmVscyAoWGVuaXVtL0Nvc014IHNoaXAgMzAw4oCTNSwwMDAgZ2VuZXMg4oeSIGEgZmV3IGRvemVuIEtCKSBhbmRcbiAgICogYWJzZW50IGZvciB3aG9sZS10cmFuc2NyaXB0b21lIGRhdGEgKFZpc2l1bSBzaGlwcyB+MzFrIOKHkiB+MzUwIEtCKSwgd2hlcmVcbiAgICogdGhlIFVJIHNob3VsZCB1c2Uge0BsaW5rIFNwYXRpYWxEYXRhUG9ydC5zZWFyY2hGZWF0dXJlc30gZm9yIHR5cGVhaGVhZFxuICAgKiBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nIHRoZSBsaXN0LiBDb25zdW1lcnMgbXVzdCBoYW5kbGUgYm90aC5cbiAgICovXG4gIG5hbWVzPzogc3RyaW5nW107XG4gIC8qKiBXaGF0IGEgZmVhdHVyZSB2YWx1ZSBtZWFucyAoYGxvZzFwIG5vcm1hbGl6ZWRgLCBgcmF3IGNvdW50c2ApLiAqL1xuICB1bml0Pzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIGZlYXR1cmUgdmVjdG9ycyByZWFkIGJlc3QgbG9nLXNjYWxlZCAocmF3IGNvdW50cykuICovXG4gIGxvZ1NjYWxlSGludD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGVyLW9ic2VydmF0aW9uIGJvdW5kYXJpZXMgKGNlbGwvbnVjbGV1cyBzZWdtZW50YXRpb24sIHNwb3Qgb3V0bGluZXMpIGFzIGZsYXRcbiAqIHJpbmdzIOKAlCBkZWxpYmVyYXRlbHkgTk9UIEdlb0pTT04gb2JqZWN0cywgd2hpY2ggY29zdCBvbmUgb2JqZWN0ICsgb25lIGFycmF5XG4gKiBwZXIgY2VsbCBhbmQgd291bGQgZG9taW5hdGUgbWVtb3J5IGF0IDEwXjUgcG9seWdvbnMuXG4gKlxuICogUmluZyBgaWAgb2NjdXBpZXMgYGNvb3Jkc1syKm9mZnNldHNbaV0gLi4gMipvZmZzZXRzW2krMV0pYCBhcyBgeDAseTAseDEseTEs4oCmYFxuICogYW5kIGlzIGltcGxpY2l0bHkgY2xvc2VkLiBgb2Zmc2V0c2AgaGFzIGxlbmd0aCBgY291bnQgKyAxYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUG9seWdvbnMge1xuICBjb29yZHM6IEZsb2F0MzJBcnJheTtcbiAgb2Zmc2V0czogVWludDMyQXJyYXk7XG4gIC8qKiBOdW1iZXIgb2YgcmluZ3Mg4oCUIGBvZmZzZXRzLmxlbmd0aCAtIDFgLiAqL1xuICByZWFkb25seSBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogUHJlc2VuY2Uvc2l6ZSBvZiB0aGUgYm91bmRhcnkgZ2VvbWV0cnksIHdpdGhvdXQgbG9hZGluZyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFBvbHlnb25zTWV0YSB7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogSG93IG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzIHJlbGF0ZSB0byB0aGUgdGlzc3VlIGltYWdlIHRoZXkgYXJlIGRyYXduIG92ZXIuXG4gKiBBcHBsaWVkIGFzIGB3b3JsZCA9IGNvb3JkICogc2NhbGUgKyB0cmFuc2xhdGVgLCBtYXRjaGluZyB0aGUgYWZmaW5lIHRoYXRcbiAqIFNwYXRpYWxEYXRhIHJlY29yZHMgcGVyIGNvb3JkaW5hdGUgc3lzdGVtIOKAlCBhbmQgdGhlIGZ1bGwtcmVzb2x1dGlvbiB3b3JsZFxuICogY29udmVudGlvbiB0aGUgbmFwYXJpLWpzIGJhY2tlbmQgYWxyZWFkeSB1c2VzIHNvIHByZS1zYXZlZCByZWdpb25zIGFsaWduIG9uXG4gKiBweXJhbWlkYWwgc2xpZGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxJbWFnZVJlZiB7XG4gIC8qKiBIb3N0LWRlZmluZWQgaWQgb2YgdGhlIGltYWdlIHRoZXNlIGNvb3JkaW5hdGVzIGxpdmUgaW4sIHNvIHRoZSBob3N0IGNhblxuICAgKiAgcmVzb2x2ZSBpdCB0byBhbiBgSUltYWdlSW5mb2AuICovXG4gIGltYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBEYXRh4oaSd29ybGQgc2NhbGUuIERlZmF1bHRzIHRvIGBbMSwgMV1gIChjb29yZGluYXRlcyBhbHJlYWR5IGluXG4gICAqICBmdWxsLXJlc29sdXRpb24gaW1hZ2UgcGl4ZWxzKS4gKi9cbiAgc2NhbGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogRGF0YeKGkndvcmxkIHRyYW5zbGF0aW9uLCBpbiB0aGUgc2FtZSB1bml0cyBhcyB7QGxpbmsgc2NhbGV9J3Mgb3V0cHV0LiAqL1xuICB0cmFuc2xhdGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0g4oCUIGRyaXZlcyB0aGUgc2NhbGUgYmFyIGFuZCBwaHlzaWNhbCBtYXJrZXJcbiAgICogIHNpemluZyAoYSA1NSDCtW0gVmlzaXVtIHNwb3QpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgcHJlY29tcHV0ZWQgbG93LWRpbWVuc2lvbmFsIGVtYmVkZGluZyBvdmVyIHRoZSBTQU1FIG9ic2VydmF0aW9ucyDigJQgVU1BUCwgdC1TTkUsIFBDQS5cbiAqXG4gKiBBbm5vdW5jZWQgaW4gdGhlIGRhdGFzZXQgYW5kIGZldGNoZWQgb24gZGVtYW5kLCBleGFjdGx5IGxpa2UgYSBjb2x1bW4gb3IgYSBnZW5lOiB0aGVcbiAqIGNvb3JkaW5hdGVzIGFyZSBhbm90aGVyIHBlci1vYnNlcnZhdGlvbiB2ZWN0b3IsIGFuZCBhIGRhdGFzZXQgbWF5IGNhcnJ5IHNldmVyYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbEVtYmVkZGluZ01ldGEge1xuICAvKiogS2V5IGFzIHRoZSBzb3VyY2UgbmFtZXMgaXQsIGUuZy4gYFhfdW1hcGAuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBtZW51czsgZmFsbHMgYmFjayB0byB7QGxpbmsgbmFtZX0uICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogMiBmb3IgYSBwbGFuZSwgMyBmb3IgYSBjbG91ZC4gKi9cbiAgZGltczogMiB8IDM7XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIGNvb3JkaW5hdGVzIHdlcmUgQ09NUFVURUQgZm9yIHRoaXMgYnVuZGxlIHJhdGhlciB0aGFuIHB1Ymxpc2hlZCB3aXRoIHRoZVxuICAgKiBkYXRhc2V0LiBXb3J0aCBzdXJmYWNpbmc6IGEgVU1BUCByZWNvbXB1dGVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMgaXMgYSBkaWZmZXJlbnQgcGljdHVyZSxcbiAgICogYW5kIGEgcmVhZGVyIGNvbXBhcmluZyBhZ2FpbnN0IGEgcGFwZXIncyBmaWd1cmUgbmVlZHMgdG8ga25vdyB3aGljaCB0aGV5IGFyZSBsb29raW5nIGF0LlxuICAgKi9cbiAgZGVyaXZlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGcmFjdGlvbiBvZiB0b3RhbCB2YXJpYW5jZSBlYWNoIGF4aXMgYWNjb3VudHMgZm9yLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIE9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBMSU5FQVIgZW1iZWRkaW5nIOKAlCBQQ0EuIEl0cyBheGVzIGFyZSBvcmRlcmVkLCBhbmQgZWFjaCBvbmUgZXhwbGFpbnMgYVxuICAgKiBtZWFzdXJhYmxlIHNoYXJlIG9mIHRoZSB2YXJpYW5jZSwgd2hpY2ggaXMgdGhlIHdob2xlIHJlYXNvbiB0byBsb29rIGF0IGEgUENBIHJhdGhlciB0aGFuIGFcbiAgICogVU1BUDogXCJQQzEgKDIzJSlcIiBzYXlzIHNvbWV0aGluZywgd2hlcmUgXCJVTUFQIDFcIiBzYXlzIG5vdGhpbmcgYXQgYWxsLiBBIFVNQVAncyBjb29yZGluYXRlc1xuICAgKiBhcmUgYW4gYXJiaXRyYXJ5IG91dHB1dCBvZiBhbiBvcHRpbWlzYXRpb24gd2l0aCBubyB2YXJpYW5jZSB0byByZXBvcnQsIHNvIHRoaXMgc3RheXMgYWJzZW50XG4gICAqIHRoZXJlIHJhdGhlciB0aGFuIGJlaW5nIGZha2VkLlxuICAgKi9cbiAgdmFyaWFuY2VSYXRpbz86IG51bWJlcltdO1xuICAvKipcbiAgICogSG93IGEgZGVyaXZlZCBlbWJlZGRpbmcgd2FzIGNvbXB1dGVkLCBpbiBhIGZldyB3b3JkcyDigJQgZS5nLiBcIlBDQSg1MCkgdGhlbiBwZXJwbGV4aXR5IDMwLFxuICAgKiBzZWVkIDBcIi5cbiAgICpcbiAgICogTm90IGRlY29yYXRpb24uIEEgdC1TTkUgb3IgVU1BUCBpcyBzdG9jaGFzdGljLCBhbmQgaXRzIHBpY3R1cmUgY2hhbmdlcyBtYXRlcmlhbGx5IHdpdGhcbiAgICogcGVycGxleGl0eSBvciBgbl9uZWlnaGJvcnNgOyB0d28gcnVucyBhdCBkaWZmZXJlbnQgc2V0dGluZ3MgYXJlIGRpZmZlcmVudCBwaWN0dXJlcyBvZiB0aGUgc2FtZVxuICAgKiBjZWxscywgYW5kIG5laXRoZXIgaXMgbW9yZSBjb3JyZWN0LiBTYXlpbmcgXCJjb21wdXRlZCBoZXJlXCIgd2l0aG91dCBzYXlpbmcgSE9XIGxlYXZlcyBhIHJlYWRlclxuICAgKiB1bmFibGUgdG8gcmVwcm9kdWNlIG9yIGNvbXBhcmUgaXQuIEFic2VudCBmb3IgYSBwdWJsaXNoZWQgZW1iZWRkaW5nLCB3aG9zZSBwYXJhbWV0ZXJzIGJlbG9uZ1xuICAgKiB0byB3aG9ldmVyIHB1Ymxpc2hlZCBpdC5cbiAgICovXG4gIHBhcmFtcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgZW1iZWRkaW5nJ3MgY29vcmRpbmF0ZXMuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHNoYXBlZCBsaWtlIHtAbGluayBTcGF0aWFsT2JzZXJ2YXRpb25zfScgYHhgL2B5YC9gemAgcmF0aGVyIHRoYW4gYW4gKE4sIEQpIG1hdHJpeDpcbiAqIHRoZSBwb2ludCBvZiBhbiBlbWJlZGRpbmcgaGVyZSBpcyB0byBiZSBzd2FwcGVkIGluIGFzIHRoZSBzY2F0dGVyJ3MgY29vcmRpbmF0ZSBzb3VyY2UsIGFuZFxuICogbWF0Y2hpbmcgdGhhdCBzaGFwZSBtZWFucyB0aGUgcmVuZGVyZXIsIHRoZSBob3ZlciBoaXQtdGVzdCBhbmQgdGhlIHNlbGVjdGlvbiBjb2RlIG5lZWQgbm9cbiAqIHZhcmlhbnQgZm9yIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxFbWJlZGRpbmcge1xuICBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YTtcbiAgeDogRmxvYXQzMkFycmF5O1xuICB5OiBGbG9hdDMyQXJyYXk7XG4gIHo/OiBGbG9hdDMyQXJyYXk7XG59XG5cbi8qKlxuICogTGV2ZWwtb2YtZGV0YWlsIGdlb21ldHJ5LCBzZXJ2ZWQgb25lIGdyaWQgdGlsZSBhdCBhIHRpbWUuXG4gKlxuICogV2hvbGUtZGF0YXNldCB2ZWN0b3JzIHN0b3Agd29ya2luZyBzb21ld2hlcmUgcGFzdCAxMF41IG9ic2VydmF0aW9uczogNzE3ayBYZW5pdW0gY2VsbFxuICogb3V0bGluZXMgYXJlIH4xNDAgTUIsIGFuZCBhIHdob2xlLXRyYW5zY3JpcHRvbWUgcnVuIGhhcyB+MTBeOSB0cmFuc2NyaXB0cy4gV2hhdCBzY2FsZXNcbiAqIGlzIHdoYXQgbWFwIHRpbGVzIGRvIOKAlCBhIHNxdWFyZSBncmlkIGluIHRoZSBvYnNlcnZhdGlvbnMnIGNvb3JkaW5hdGUgc3BhY2UsIG9uZSBncmlkXG4gKiBwZXIgbGV2ZWwsIGVhY2ggbGV2ZWwncyB0aWxlcyB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgb25lIGJlbG93IGFuZCBjYXJyeWluZyBjb2Fyc2VyXG4gKiBnZW9tZXRyeS4gVGhlIHJlbmRlcmVyIGFza3Mgb25seSBmb3IgdGhlIHRpbGVzIG9uIHNjcmVlbiwgYXQgdGhlIGxldmVsIHRoZSB6b29tIG5lZWRzLlxuICpcbiAqIFRpbGUgYChneCwgZ3kpYCBhdCBsZXZlbCBgbGAgY292ZXJzIGBbZ3jCt3MsIChneCsxKcK3cykgw5cgW2d5wrdzLCAoZ3krMSnCt3MpYCB3aXRoXG4gKiBgcyA9IGxldmVsc1tsXS50aWxlU2l6ZWAsIGluIHRoZSBzYW1lIHVuaXRzIGFzIHtAbGluayBTcGF0aWFsT2JzZXJ2YXRpb25zLnh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUaWxlTGV2ZWwge1xuICAvKiogRWRnZSBsZW5ndGggb2Ygb25lIHRpbGUsIGluIG9ic2VydmF0aW9uIGNvb3JkaW5hdGUgdW5pdHMuICovXG4gIHRpbGVTaXplOiBudW1iZXI7XG59XG5cbi8qKiBBeGlzLWFsaWduZWQgZXh0ZW50IGBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV1gIGluIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IHR5cGUgU3BhdGlhbEJvdW5kcyA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogVGlsZWQgY2VsbC9udWNsZXVzIGJvdW5kYXJpZXMuIExldmVsIDAgaXMgdGhlIGZpbmVzdCAoZXZlcnkgdmVydGV4KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEge1xuICBib3VuZHM6IFNwYXRpYWxCb3VuZHM7XG4gIC8qKiBCb3VuZGFyeSBzZXRzIG9uIG9mZmVyIOKAlCB0eXBpY2FsbHkgYGNlbGxgIGFuZCBgbnVjbGV1c2AuICovXG4gIHNldHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgLyoqIFRoZSBzZXQgdG8gZHJhdyB3aGVuIHRoZSB1c2VyIGhhcyBub3QgY2hvc2VuLiAqL1xuICBkZWZhdWx0U2V0Pzogc3RyaW5nO1xuICBsZXZlbHM6IFNwYXRpYWxUaWxlTGV2ZWxbXTtcbn1cblxuLyoqIFRpbGVkIHRyYW5zY3JpcHRzLiBMZXZlbCAwIGlzIG9uZSBlbnRyeSBwZXIgdHJhbnNjcmlwdDsgY29hcnNlciBsZXZlbHMgYWdncmVnYXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YSB7XG4gIGJvdW5kczogU3BhdGlhbEJvdW5kcztcbiAgLyoqIFRvdGFsIHRyYW5zY3JpcHRzLCBmb3IgZGlzcGxheS4gKi9cbiAgY291bnQ/OiBudW1iZXI7XG4gIC8qKiBSZWFsIGdlbmVzIChjb250cm9sIHByb2JlcyBleGNsdWRlZCkuIE5hbWVzIGNvbWUgZnJvbSB0aGUgZmVhdHVyZSBzZWFyY2guICovXG4gIGdlbmVDb3VudDogbnVtYmVyO1xuICBoYXNaOiBib29sZWFuO1xuICBsZXZlbHM6IChTcGF0aWFsVGlsZUxldmVsICYge1xuICAgIC8qKiBUcnVlIHdoZW4gYW4gZW50cnkgc3RhbmRzIGZvciBzZXZlcmFsIHRyYW5zY3JpcHRzIChzZWUge0BsaW5rIFNwYXRpYWxUcmFuc2NyaXB0VGlsZS53ZWlnaHR9KS4gKi9cbiAgICBhZ2dyZWdhdGVkOiBib29sZWFuO1xuICB9KVtdO1xuICAvKipcbiAgICogTGV2ZWxzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBvbmUgYXNzaWduIGVhY2ggZW50cnkgdG8gdGhlIGNlbGwgaXQgbGllcyBpblxuICAgKiBleGFjdGx5OyBhYm92ZSBpdCB0aGUgYXNzaWdubWVudCBuYW1lcyB0aGUgY2VsbCBuZWFyZXN0IGFuIGFnZ3JlZ2F0ZSdzIGNlbnRyb2lkLlxuICAgKi9cbiAgZXhhY3RDZWxsTGV2ZWw/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGFsbC1nZW5lIHRyYW5zY3JpcHQgZ3JvdXBpbmcgcHlyYW1pZDogc3F1YXJlIGJpbnMsIGZvdXIgdGltZXMgY29hcnNlciBwZXIgbGV2ZWwsXG4gKiBlYWNoIGhvbGRpbmcgYSBjb3VudCwgYSBjZW50cm9pZCBhbmQgdGhlIGNlbGwgdGhhdCBjb250cmlidXRlZCBtb3N0IG9mIGl0cyB0cmFuc2NyaXB0cy5cbiAqIFNlcnZlZCBwZXIgdGlsZSwgaW4gdGhlIHtAbGluayBTcGF0aWFsVHJhbnNjcmlwdFRpbGV9IGxheW91dCAob25lIGVudHJ5IHBlciBiaW4pLlxuICpcbiAqIFRpbGUgYCh0eCwgdHkpYCBvZiBsZXZlbCBgbGAgY292ZXJzIGBvcmlnaW4gKyBbdHjCt3MsICh0eCsxKcK3cykgw5cgW3R5wrdzLCAodHkrMSnCt3MpYCB3aXRoXG4gKiBgcyA9IGxldmVsc1tsXS50aWxlU2l6ZWAg4oCUIG5vdGUgdGhlIG9yaWdpbiwgd2hpY2ggdGhlIHBlci1nZW5lIHRpbGVzIGRvIG5vdCBoYXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUcmFuc2NyaXB0Qmluc01ldGEge1xuICBib3VuZHM6IFNwYXRpYWxCb3VuZHM7XG4gIG9yaWdpbjogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIFRyYW5zY3JpcHRzIHRoZSBweXJhbWlkIHdhcyBidWlsdCBmcm9tLiAqL1xuICBjb3VudDogbnVtYmVyO1xuICBsZXZlbHM6IHsgYmluU2l6ZTogbnVtYmVyOyB0aWxlU2l6ZTogbnVtYmVyIH1bXTtcbn1cblxuLyoqXG4gKiBBIGdyb3VwaW5nIHB5cmFtaWQgdGhlIHNlcnZlciBpcyBzdGlsbCBidWlsZGluZyAoaXQgYnVpbGRzIG9uZSBpdHNlbGYgd2hlbiBhIGRhdGFzZXRcbiAqIGFycml2ZXMgd2l0aG91dCBpdCkuIFwiQWxsIGdlbmVzXCIgYmVjb21lcyBhdmFpbGFibGUgb25jZSBpdCBpcyBkb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cyB7XG4gIHN0YXRlOiAncXVldWVkJyB8ICdidWlsZGluZycgfCAnZmFpbGVkJztcbiAgLyoqIFNvdXJjZSB0aWxlcyBwcm9jZXNzZWQgc28gZmFyLCBvZiBgdG90YWxgLiAqL1xuICBkb25lPzogbnVtYmVyO1xuICB0b3RhbD86IG51bWJlcjtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqIFdoYXQgaXMgaW4gYW4gYXJlYSDigJQgdGhlIGhvdmVyIGRldGFpbHMgb2YgYSB0cmFuc2NyaXB0IG1hcmtlciBvciBncm91cGVkIGJpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRyYW5zY3JpcHRTdW1tYXJ5IHtcbiAgLyoqIEFic2VudCBmb3IgYSBwdXJlIGNlbGwtaWQgbG9va3VwLiAqL1xuICB0cmFuc2NyaXB0cz86IG51bWJlcjtcbiAgLyoqIERpc3RpbmN0IGdlbmVzIGFtb25nIHRoZW0uICovXG4gIGdlbmVzPzogbnVtYmVyO1xuICB0b3BHZW5lcz86IHsgbmFtZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH1bXTtcbiAgLyoqIERpc3RpbmN0IGNlbGxzIHRoZXkgZmFsbCBpbiwgYW5kIGhvdyBtYW55IGZhbGwgaW4gbm9uZS4gKi9cbiAgY2VsbHM/OiBudW1iZXI7XG4gIHVuYXNzaWduZWQ/OiBudW1iZXI7XG4gIHRvcENlbGxzPzogeyBpbmRleDogbnVtYmVyOyBpZD86IHN0cmluZzsgY291bnQ6IG51bWJlciB9W107XG4gIC8qKiBEaXNwbGF5IGlkcyBvZiB0aGUgY2VsbHMgYXNrZWQgZm9yLCBieSBvYnNlcnZhdGlvbiBpbmRleC4gKi9cbiAgY2VsbElkcz86IFJlY29yZDxudW1iZXIsIHN0cmluZz47XG59XG5cbi8qKiBBIHBlci1nZW5lIHRyYW5zY3JpcHQtY291bnQgcmFzdGVyIGNvdmVyaW5nIHRoZSBzZWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGVuc2l0eU1ldGEge1xuICAvKiogU2l6ZSBvZiBvbmUgcmFzdGVyIGNlbGwsIGluIG9ic2VydmF0aW9uIHVuaXRzLCBgW3gsIHldYC4gKi9cbiAgZ3JpZFNpemU6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBPYnNlcnZhdGlvbi1zcGFjZSBwb3NpdGlvbiBvZiByYXN0ZXIgY2VsbCAoMCwgMCkncyBuZWFyIGNvcm5lci4gKi9cbiAgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdO1xuICByb3dzOiBudW1iZXI7XG4gIGNvbHM6IG51bWJlcjtcbn1cblxuLyoqIFwiTm8gb2JzZXJ2YXRpb25cIiBpbiB7QGxpbmsgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLm9ic2VydmF0aW9ufS4gKi9cbmV4cG9ydCBjb25zdCBOT19PQlNFUlZBVElPTiA9IDB4ZmZmZmZmZmY7XG5cbi8qKiBPbmUgdGlsZSBvZiBib3VuZGFyaWVzOiByaW5ncyBhcyBpbiB7QGxpbmsgU3BhdGlhbFBvbHlnb25zfSwgcGx1cyB3aG8gb3ducyBlYWNoIHJpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxQb2x5Z29uVGlsZSBleHRlbmRzIFNwYXRpYWxQb2x5Z29ucyB7XG4gIC8qKiBPYnNlcnZhdGlvbiBpbmRleCBvZiByaW5nIGBpYCDigJQgdGhlIGpvaW4ga2V5IHRvIGNvbHVtbnMgYW5kIGZlYXR1cmVzLiAqL1xuICBvYnNlcnZhdGlvbjogVWludDMyQXJyYXk7XG59XG5cbi8qKiBPbmUgdGlsZSBvZiB0cmFuc2NyaXB0cyAob3IgYWdncmVnYXRlcyBvZiB0aGVtKS4gRXZlcnkgYXJyYXkgaGFzIGxlbmd0aCB7QGxpbmsgY291bnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVHJhbnNjcmlwdFRpbGUge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICBhZ2dyZWdhdGVkOiBib29sZWFuO1xuICB4OiBGbG9hdDMyQXJyYXk7XG4gIHk6IEZsb2F0MzJBcnJheTtcbiAgejogRmxvYXQzMkFycmF5O1xuICAvKiogVHJhbnNjcmlwdHMgZWFjaCBlbnRyeSBzdGFuZHMgZm9yIOKAlCAxIGF0IGFuIHVuYWdncmVnYXRlZCBsZXZlbC4gKi9cbiAgd2VpZ2h0OiBVaW50MzJBcnJheTtcbiAgLyoqIE9ic2VydmF0aW9uIChjZWxsKSB0aGUgZW50cnkgZmFsbHMgaW4sIG9yIHtAbGluayBOT19PQlNFUlZBVElPTn0uICovXG4gIG9ic2VydmF0aW9uOiBVaW50MzJBcnJheTtcbiAgLyoqIEluZGV4IGludG8gdGhlIGBnZW5lc2AgbGlzdCB0aGUgdGlsZSB3YXMgcmVxdWVzdGVkIHdpdGguICovXG4gIGdlbmU6IFVpbnQxNkFycmF5O1xufVxuXG4vKiogVGhlIHBlci1nZW5lIGxldmVsczogZWFjaCBsZXZlbCdzIGJpbiBhbmQgdGlsZSBzaXplLCBvbiB0aGUgYWxsLWdlbmUgcHlyYW1pZCdzIGdyaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUcmFuc2NyaXB0R2VuZUJpbnNNZXRhIHtcbiAgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdO1xuICBsZXZlbHM6IHsgYmluU2l6ZTogbnVtYmVyOyB0aWxlU2l6ZTogbnVtYmVyIH1bXTtcbn1cblxuLyoqXG4gKiBNYXJrZXIgZ2VuZXMgb2YgZWFjaCBncm91cCBvZiBhIGNhdGVnb3JpY2FsIGNvbHVtbjogcGVyIGdyb3VwLCB0aGUgcmVhbCBnZW5lcyBtb3N0XG4gKiBzcGVjaWZpYyB0byBpdCwgYmVzdCBmaXJzdC4gQSBnZW5lJ3Mgc2NvcmUgaXMgaXRzIG1lYW4gYGxvZzFwKGNvdW50KWAgaW4gdGhlIGdyb3VwIG1pbnVzXG4gKiB0aGF0IGluIGV2ZXJ5IG90aGVyIGNlbGw7IGl0IG11c3QgYmUgZGV0ZWN0ZWQgaW4gYXQgbGVhc3QgMTAlIG9mIHRoZSBncm91cCdzIGNlbGxzLCBhbmRcbiAqIGluIG1vcmUgb2YgdGhlbSB0aGFuIGVsc2V3aGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsTWFya2VyR2VuZXMge1xuICBjb2x1bW46IHN0cmluZztcbiAgZ3JvdXBzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBDZWxscyBpbiB0aGUgZ3JvdXAuICovXG4gICAgY2VsbHM6IG51bWJlcjtcbiAgICBnZW5lczogeyBuYW1lOiBzdHJpbmc7IHNjb3JlOiBudW1iZXI7IHBjdEluOiBudW1iZXI7IHBjdE91dDogbnVtYmVyIH1bXTtcbiAgfVtdO1xufVxuXG4vKiogVHJhbnNjcmlwdCB0b3RhbHMgZm9yIGFuIGVzdGltYXRlIG9mIGhvdyBtYW55IG1hcmtlcnMgYSBzZWxlY3Rpb24gd291bGQgZHJhdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRyYW5zY3JpcHRDb3VudHMge1xuICAvKiogVG90YWwgdHJhbnNjcmlwdHMgcGVyIHJlcXVlc3RlZCBnZW5lLCBvdmVyIHRoZSB3aG9sZSBkYXRhc2V0LiAqL1xuICBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIC8qKiBUb3RhbCBvdmVyIGV2ZXJ5IGdlbmUuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBFeHRlbnQgdGhlIHRvdGFscyBhcmUgc3ByZWFkIG92ZXIgKG9ic2VydmF0aW9uIHVuaXRzKS4gKi9cbiAgYm91bmRzOiBTcGF0aWFsQm91bmRzO1xufVxuXG4vKiogQSBzdW1tZWQgZGVuc2l0eSByYXN0ZXIgZm9yIGEgbGlzdCBvZiBnZW5lczsgYHZhbHVlc2AgaXMgcm93LW1ham9yIGByb3dzIMOXIGNvbHNgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGVuc2l0eVJhc3RlciB7XG4gIG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YTtcbiAgZ2VuZXM6IHN0cmluZ1tdO1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbn1cblxuLyoqXG4gKiBBIHNwYXRpYWwtb21pY3MgZGF0YXNldDogZXZlcnl0aGluZyBjaGVhcCBlbm91Z2ggdG8gaG9sZCByZXNpZGVudC4gQ29sdW1uIGFuZFxuICogZmVhdHVyZSAqdmFsdWVzKiwgYW5kIHBvbHlnb24gKmdlb21ldHJ5KiwgYXJlIGZldGNoZWQgdGhyb3VnaFxuICoge0BsaW5rIFNwYXRpYWxEYXRhUG9ydH0gYXMgdGhleSBhcmUgZGlzcGxheWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEYXRhc2V0IHtcbiAgLyoqIFN0YWJsZSBpZCDigJQgdGhlIGtleSB0aGUgcG9ydCdzIGxhenkgYWNjZXNzb3JzIGFyZSBzY29wZWQgdG8uICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciBtZW51cy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnM7XG4gIC8qKiBFdmVyeSBjb2x1bW4gYXZhaWxhYmxlLCB3aGV0aGVyIG9yIG5vdCBpdHMgdmFsdWVzIGFyZSBsb2FkZWQuICovXG4gIGNvbHVtbnM6IFNwYXRpYWxDb2x1bW5NZXRhW107XG4gIGZlYXR1cmVzPzogU3BhdGlhbEZlYXR1cmVNZXRhO1xuICBwb2x5Z29ucz86IFNwYXRpYWxQb2x5Z29uc01ldGE7XG4gIGltYWdlUmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICAvKiogUHJlc2VuY2UgKyBnZW9tZXRyeSBvZiBhIHJlZmVyZW5jZSB2b2x1bWUgdGhlIG9ic2VydmF0aW9ucyBzaXQgaW5zaWRlLiAqL1xuICB2b2x1bWU/OiBTcGF0aWFsVm9sdW1lTWV0YTtcbiAgLyoqIEVtYmVkZGluZ3MgYXZhaWxhYmxlIGZvciB0aGVzZSBvYnNlcnZhdGlvbnMsIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBmZXRjaGVkIG9uIGRlbWFuZC4gKi9cbiAgZW1iZWRkaW5ncz86IFNwYXRpYWxFbWJlZGRpbmdNZXRhW107XG4gIC8qKiBMZXZlbC1vZi1kZXRhaWwgYm91bmRhcmllcywgZmV0Y2hlZCBwZXIgdGlsZSDigJQgc2VlIHtAbGluayBTcGF0aWFsUG9seWdvblRpbGVzTWV0YX0uICovXG4gIHBvbHlnb25UaWxlcz86IFNwYXRpYWxQb2x5Z29uVGlsZXNNZXRhO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIHRyYW5zY3JpcHRzLCBmZXRjaGVkIHBlciB0aWxlIOKAlCBzZWUge0BsaW5rIFNwYXRpYWxUcmFuc2NyaXB0VGlsZXNNZXRhfS4gKi9cbiAgdHJhbnNjcmlwdFRpbGVzPzogU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGE7XG4gIC8qKiBBIHNlcnZlZCBwZXItZ2VuZSB0cmFuc2NyaXB0IGRlbnNpdHkgcmFzdGVyLiAqL1xuICBkZW5zaXR5PzogU3BhdGlhbERlbnNpdHlNZXRhO1xuICAvKiogVGhlIGFsbC1nZW5lIHRyYW5zY3JpcHQgZ3JvdXBpbmcgcHlyYW1pZCwgd2hlbiBpdCBoYXMgYmVlbiBidWlsdC4gKi9cbiAgdHJhbnNjcmlwdEJpbnM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNNZXRhO1xuICAvKiogUGVyLWdlbmUgbGV2ZWxzIG9mIHRoZSB0cmFuc2NyaXB0IHB5cmFtaWQgKHNhbWUgYmlucyk6IGEgZ2VuZSBzZWxlY3Rpb24gYXQgYW55IHpvb20uICovXG4gIHRyYW5zY3JpcHRHZW5lQmlucz86IFNwYXRpYWxUcmFuc2NyaXB0R2VuZUJpbnNNZXRhO1xuICAvKiogUHJlc2VudCB3aGlsZSB0aGUgc2VydmVyIGlzIHN0aWxsIGJ1aWxkaW5nIHtAbGluayB0cmFuc2NyaXB0Qmluc30uICovXG4gIHRyYW5zY3JpcHRCaW5zU3RhdHVzPzogU3BhdGlhbFRyYW5zY3JpcHRCaW5zU3RhdHVzO1xuICAvKipcbiAgICogTWljcm9ucyBwZXIgb2JzZXJ2YXRpb24gY29vcmRpbmF0ZSB1bml0IOKAlCB3aGF0IG1ha2VzIGEgc2NhbGUgYmFyIHBvc3NpYmxlLlxuICAgKlxuICAgKiBUaGUgMkQgcGF0aCBnZXRzIHRoaXMgZnJvbSBgaW1hZ2VSZWYubXBwWGAsIGJlY2F1c2UgdGhlcmUgdGhlIGNvb3JkaW5hdGVzIGFyZVxuICAgKiBpbWFnZSBwaXhlbHMuIEEgM0QgY2xvdWQgaGFzIG5vIGltYWdlLCBzbyBpdCBoYXMgdG8gc2F5IGZvciBpdHNlbGY6IGAxYCBtZWFuc1xuICAgKiB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgbWljcm9ucy5cbiAgICpcbiAgICogQWJzZW50IG1lYW5zIHRoZSB1bml0IGlzIFVOS05PV04sIGFuZCBhIHJlbmRlcmVyIG11c3QgdGhlbiBkcmF3IG5vIHNjYWxlIGJhclxuICAgKiByYXRoZXIgdGhhbiBhc3N1bWUgb25lLiBBIGJhciBsYWJlbGxlZCBpbiBtaWNyb25zIG92ZXIgcGl4ZWwtc3BhY2VcbiAgICogY29vcmRpbmF0ZXMgaXMgd29yc2UgdGhhbiBubyBiYXI6IGl0IGxvb2tzIGxpa2UgYSBtZWFzdXJlbWVudC5cbiAgICovXG4gIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgM0Qgc2NhbGFyIHJlZmVyZW5jZSB2b2x1bWUgcmVnaXN0ZXJlZCB0byB0aGUgb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMg4oCUIHRoZVxuICogYW5hdG9taWNhbCBiYWNrZHJvcCBmb3IgYSBwb2ludCBjbG91ZCAoYW4gYXRsYXMgdGVtcGxhdGUsIG9yIGFuIGltYWdlIHotc3RhY2spLlxuICpcbiAqIEdlb21ldHJ5IG9ubHk7IHRoZSB2b3hlbHMgYXJlIGZldGNoZWQgdGhyb3VnaFxuICoge0BsaW5rIFNwYXRpYWxEYXRhUG9ydC5nZXRWb2x1bWV9IHdoZW4gc29tZXRoaW5nIGlzIGdvaW5nIHRvIGRyYXcgdGhlbS4gQSBjbG91ZFxuICogd2l0aG91dCBvbmUgc3RpbGwgcmVuZGVycywganVzdCBpbiBlbXB0eSBzcGFjZS5cbiAqXG4gKiBUaGUgb2JzZXJ2YXRpb25zJyBjb29yZGluYXRlIGZyYW1lIG11c3QgYmUgdGhlIHZvbHVtZSdzIG93bjogdm94ZWwgYChpLCBqLCBrKWBcbiAqIGNvdmVycyBgW2kgKiB2b3hlbFNpemVbMF0sIChpICsgMSkgKiB2b3hlbFNpemVbMF0pYCBvbiB4LCBhbmQgc28gb24uIFRoYXQgbWVhbnNcbiAqIHRoZSB2b2x1bWUncyBuZWFyIGNvcm5lciBzaXRzIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbiwgc28gYSByZW5kZXJlciBjYW4gcGxhY2VcbiAqIHRoZSB0d28gdG9nZXRoZXIga25vd2luZyBub3RoaW5nIGVsc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFZvbHVtZU1ldGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqIFdvcmxkIHNpemUgb2Ygb25lIHZveGVsIHBlciBheGlzLCBpbiB0aGUgb2JzZXJ2YXRpb25zJyB1bml0cy4gKi9cbiAgdm94ZWxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gb3ZlciBhIGRhdGFzZXQncyBOIG9ic2VydmF0aW9uczogYG1hc2tbaV0gPT09IDFgIHdoZW4gb2JzZXJ2YXRpb24gYGlgIGlzXG4gKiBzZWxlY3RlZCwgYW5kIGBjb3VudGAgdGhlIG51bWJlciBzZWxlY3RlZC4gUHVyZSBkYXRhLCBzbyBpdCBsaXZlcyB3aXRoIHRoZSBkYXRhc2V0XG4gKiBjb250cmFjdDsgdGhlIHNlbGVjdGlvbiBsb2dpYyB0aGF0IGJ1aWxkcyBvbmUgaXMgaW4gYHNwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgbWFzazogVWludDhBcnJheTtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqIExvb2sgYSBjb2x1bW4ncyBkZXNjcmlwdG9yIHVwIGJ5IG5hbWUuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbk1ldGEoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIG5hbWU6IHN0cmluZyk6IFNwYXRpYWxDb2x1bW5NZXRhIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGRhdGFzZXQuY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xufVxuIl19
@@ -72,7 +72,10 @@ export const TOOLBAR_TOOLS = new InjectionToken('TOOLBAR_TOOLS');
72
72
  export function sortToolContributions(tools) {
73
73
  // Stable: equal `order` keeps registration order, so a host controls ties by
74
74
  // provider order without having to invent numbers.
75
- return tools.map((t, i) => ({ t, i })).sort((a, b) => (a.t.order ?? 100) - (b.t.order ?? 100) || a.i - b.i).map(({ t }) => t);
75
+ return tools
76
+ .map((t, i) => ({ t, i }))
77
+ .sort((a, b) => (a.t.order ?? 100) - (b.t.order ?? 100) || a.i - b.i)
78
+ .map(({ t }) => t);
76
79
  }
77
80
  /** The run tools a toolbar should actually show: those with at least one model.
78
81
  * Dialog tools are left out (see {@link dialogToolContributions}). */
@@ -89,8 +92,7 @@ export function dialogToolContributions(tools, log = console) {
89
92
  const seen = new Set();
90
93
  const out = [];
91
94
  for (const t of (tools ?? []).filter(isDialogToolContribution)) {
92
- if (typeof t.id !== 'string' || !t.id || typeof t.activate !== 'function'
93
- || typeof t.mount !== 'function') {
95
+ if (typeof t.id !== 'string' || !t.id || typeof t.activate !== 'function' || typeof t.mount !== 'function') {
94
96
  log.warn('[visualizer] dialog tool ignored: it needs a string `id` and `activate` and `mount` functions.', t);
95
97
  continue;
96
98
  }
@@ -103,4 +105,4 @@ export function dialogToolContributions(tools, log = console) {
103
105
  }
104
106
  return sortToolContributions(out);
105
107
  }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci10b29sLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvdG9vbGJhci10b29sLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBaU0vQyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHdCQUF3QixDQUFDLENBQVU7SUFDakQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQXdCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQWlDLGVBQWUsQ0FBQyxDQUFDO0FBRWpHLGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEtBQW1CO0lBRW5CLDZFQUE2RTtJQUM3RSxtREFBbUQ7SUFDbkQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ25ELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ3JELENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUVEO3VFQUN1RTtBQUN2RSxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLEtBQXdEO0lBRXhELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDOUIsQ0FBQyxDQUFDLEVBQWdDLEVBQUUsQ0FDbEMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFRLENBQTZCLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FDL0YsQ0FBQztJQUNGLE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxLQUF3RCxFQUN4RCxNQUEwQyxPQUFPO0lBRWpELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQW9DLEVBQUUsQ0FBQztJQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVTtlQUNsRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxnR0FBZ0csRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RyxTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ2xHLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSG93IGEgdG9vbCBnZXRzIGludG8gdGhlIHRvb2xiYXIgd2l0aG91dCB0aGlzIGxpYnJhcnkga25vd2luZyB3aGF0IGl0IGlzLlxuICpcbiAqIFdIWSBUSElTIEVYSVNUU1xuICogVGhlIFlPTE8gZGV0ZWN0b3IgYW5kIHRoZSByZXRpbmFsLWxheWVyIHNlZ21lbnRlciB1c2VkIHRvIGJlIGJ1aWx0IGluOiB0aGVpclxuICogYnV0dG9ucyB3ZXJlIGhhcmRjb2RlZCBpbiB0aGUgdG9vbGJhciB0ZW1wbGF0ZSwgdGhlaXIgbW9kZWwgcmVnaXN0cmllcyBuYW1lZFxuICogSkFYIGNoZWNrcG9pbnRzLCBhbmQgdGhlIGBJTlNUQU5DRV9TRUdNRU5URVJgIC8gYFNFTUFOVElDX1NFR01FTlRFUmAgdG9rZW5zXG4gKiBkZWZhdWx0ZWQgdG8gaW4tbGlicmFyeSBzZXJ2aWNlcyB0aGF0IGltcG9ydGVkIGB5b2xvLXNlZ2RldGVjdC1qc2AgYW5kXG4gKiBgamF4LWFpLWpzYC4gVGhvc2UgZGVmYXVsdCBmYWN0b3JpZXMgd2VyZSB0aGUgb25seSB0aGluZyBwdWxsaW5nIGVpdGhlclxuICogcGFja2FnZSBpbnRvIHRoZSBidW5kbGUg4oCUIHRoZSBjb250cmFjdHMgdGhlbXNlbHZlcyB3ZXJlIGFscmVhZHkgY2xlYW4uXG4gKlxuICogVGhhdCBhcnJhbmdlbWVudCBjYW5ub3Qgc2hpcCBpbiBhbiBvcGVuIGxpYnJhcnkgd2hpbGUgdGhlIG1vZGVscyBhcmUgY2xvc2VkLlxuICogU28gdGhlIHRvb2xzIG1vdmUgb3V0LCBpbnRvIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gdGhpcyBvbmUsIGFuZCBhcnJpdmVcbiAqIGJhY2sgdGhyb3VnaCB7QGxpbmsgVE9PTEJBUl9UT09MU30uIFRoaXMgbGlicmFyeSBrZWVwcyB0aGUgY29udHJhY3RzLCB0aGVcbiAqIGNocm9tZSBhbmQgdGhlIHJlZ2lvbiBwbHVtYmluZzsgaXQgbm8gbG9uZ2VyIGtub3dzIHRoYXQgWU9MTyBleGlzdHMuXG4gKlxuICogQSBob3N0IHJlZ2lzdGVycyB0b29scyB3aXRoIGEgbXVsdGktcHJvdmlkZXI6XG4gKlxuICogICAgIHsgcHJvdmlkZTogVE9PTEJBUl9UT09MUywgdXNlRXhpc3Rpbmc6IFlvbG9Ub29sQ29udHJpYnV0aW9uLCBtdWx0aTogdHJ1ZSB9XG4gKlxuICogUmVnaXN0ZXIgbm90aGluZyBhbmQgdGhlIHRvb2xiYXIgaGFzIG5vIHNlZ21lbnRhdGlvbiB0b29scywgdGhlIGhlbHAgZGlhbG9nXG4gKiBsaXN0cyBub25lLCBhbmQgbmVpdGhlciBtb2RlbCBwYWNrYWdlIGlzIGluIHRoZSBncmFwaC5cbiAqXG4gKiBXSFkgUEFSQU1TIEFSRSBERUNMQVJFRCwgTk9UIFJFTkRFUkVEXG4gKiBBIGNvbnRyaWJ1dGlvbiBkZXNjcmliZXMgaXRzIHBhcmFtZXRlcnMgKHtAbGluayBUb29sUGFyYW1TcGVjfSkgaW5zdGVhZCBvZlxuICogc3VwcGx5aW5nIGEgY29tcG9uZW50IHRvIGRyYXcgdGhlbS4gVGhlIHRvb2xiYXIgcmVuZGVycyBvbmUgZ2VuZXJpYyBkaWFsb2dcbiAqIGZyb20gdGhhdCBkZXNjcmlwdGlvbi4gVGhlIGFsdGVybmF0aXZlIOKAlCBlYWNoIHBsdWdpbiBzaGlwcGluZyBpdHMgb3duIGRpYWxvZ1xuICogY29tcG9uZW50IOKAlCB3b3VsZCBtYWtlIGV2ZXJ5IHBsdWdpbiBkZXBlbmQgb24gdGhpcyBsaWJyYXJ5J3MgZXhhY3QgUHJpbWVOR1xuICogdmVyc2lvbiBhbmQgc3R5bGluZyBpbnRlcm5hbHMgdG8gbG9vayBsaWtlIHRoZSByZXN0IG9mIHRoZSB0b29sYmFyLCBhbmQgdGhlXG4gKiB0d28gZGlhbG9ncyB0aGF0IGV4aXN0IHRvZGF5IGFyZSBlbnRpcmVseSBudW1iZXJzIGFuZCBvbmUgY2hlY2tib3guIEEgc2NoZW1hXG4gKiBjb3ZlcnMgdGhlbSwgYW5kIGl0IGlzIHRoZSBzYW1lIHNoYXBlIGppdC11aSBhbHJlYWR5IHVzZXMgZm9yIGl0cyBwaXBlbGluZVxuICogc3RlcCBwYXJhbWV0ZXJzLCBzbyB0aGUgdm9jYWJ1bGFyeSBpcyBmYW1pbGlhci5cbiAqXG4gKiBJZiBhIHRvb2wgZXZlciBuZWVkcyBhIGNvbnRyb2wgdGhpcyBjYW5ub3QgZXhwcmVzcywgYWRkIGEgdmFyaWFudCBoZXJlIHJhdGhlclxuICogdGhhbiBhbiBlc2NhcGUgaGF0Y2ggdGhhdCByZXR1cm5zIGEgY29tcG9uZW50IOKAlCB0aGUgbW9tZW50IG9uZSB0b29sIGRyYXdzXG4gKiBpdHNlbGYsIHRoZSB0b29sYmFyIHN0b3BzIGJlaW5nIGFibGUgdG8gbGF5IHRvb2xzIG91dCBjb25zaXN0ZW50bHkuXG4gKlxuICogRElBTE9HIFRPT0xTXG4gKiBTb21lIHRvb2xzIGFyZSBub3QgXCJzZXQgcGFyYW1ldGVycywgcnVuIG9uY2VcIiBidXQgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbjogdGhlXG4gKiB1c2VyIHBhaW50cywgdGhlIHRvb2wgcmV0cmFpbnMgYW5kIHJlZHJhd3MsIG92ZXIgYW5kIG92ZXIgKERJQU5ORSkuIEEgc2NoZW1hXG4gKiBjYW5ub3QgZGVzY3JpYmUgdGhhdCwgc28ge0BsaW5rIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9ufSBpcyB0aGUgb25lXG4gKiB2YXJpYW50IHRoYXQgcmVuZGVycyBpdHMgb3duIGJvZHkuIFRoZSB0b29sYmFyIHN0aWxsIG93bnMgdGhlIGJ1dHRvbiwgaXRzXG4gKiBwbGFjZW1lbnQgYW5kIHRoZSBkaWFsb2cgY2hyb21lOyB0aGUgdG9vbCBvbmx5IGZpbGxzIHRoZSBkaWFsb2csIHdpdGggcGxhaW5cbiAqIERPTSAoYG1vdW50YCksIHNvIGl0IG5lZWRzIG5laXRoZXIgQW5ndWxhciBub3IgdGhpcyBsaWJyYXJ5J3MgUHJpbWVORyB2ZXJzaW9uLlxuICogSXRzIGJ1dHRvbiBzaXRzIHdpdGggdGhlIGhvc3QncyBvd24gYWN0aW9ucyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRvb2xiYXIsIGFuZFxuICogc2hvd3Mgb25seSBpbiB0aGUgSW1hZ2UgdmlldywgdGhlIHZpZXcgaXRzIGNvbnRleHQgKHtAbGluayBUb29sRGlhbG9nQ29udGV4dH0pXG4gKiBkcmF3cyBvdmVyLlxuICpcbiAqIFdIWSBBTiBFTVBUWSBNT0RFTCBMSVNUIEhJREVTIFRIRSBUT09MXG4gKiB7QGxpbmsgVG9vbGJhclRvb2xDb250cmlidXRpb24ubW9kZWxzfSByZXR1cm5pbmcgYFtdYCByZW1vdmVzIHRoZSB0b29sIGZyb21cbiAqIHRoZSB0b29sYmFyIGVudGlyZWx5LiBUaGlzIHByZXNlcnZlcyB0aGUgYmVoYXZpb3VyIHRoZSBidWlsdC1pbiB0b29scyBhbHJlYWR5XG4gKiBoYWQgKHRoZWlyIGJ1dHRvbnMgd2VyZSBgKm5nSWZgJ2Qgb24gYSBmaWx0ZXJlZCByZWdpc3RyeSksIGFuZCBpdCBnaXZlcyBhIGhvc3RcbiAqIG9uZSBzd2l0Y2ggZm9yIFwidGhlIHdlaWdodHMgYXJlIG5vdCBjb25maWd1cmVkIGluIHRoaXMgZGVwbG95bWVudFwiIHRoYXQgZG9lc1xuICogbm90IHJlcXVpcmUgdW5yZWdpc3RlcmluZyB0aGUgcHJvdmlkZXIuXG4gKi9cbmltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUgeyBJVmlzdWFsaXplciB9IGZyb20gJy4vdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlQ29udGV4dCwgUGxvdE1vZGVTZXNzaW9uLCBQbG90TW9kZVRvb2xzIH0gZnJvbSAnLi9wbG90LXR5cGUtY29udHJpYnV0aW9uLmNvbnRyYWN0JztcblxuLyoqIEEgbnVtYmVyIGZpZWxkLiBSZW5kZXJlZCBhcyBhIHN0ZXBwZXIsIG1hdGNoaW5nIHRoZSBidWlsdC1pbiBkaWFsb2dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJQYXJhbVNwZWMge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB0eXBlOiAnbnVtYmVyJztcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8qKiBEZWNpbWFsIHBsYWNlcyB0byBzaG93LiBPbWl0IGZvciBpbnRlZ2Vycy4gKi9cbiAgZnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gIC8qKiBIb3ZlciBoZWxwLiBQbGFpbiB0ZXh0OyBpdCBpcyBub3QgcmVuZGVyZWQgYXMgSFRNTC4gKi9cbiAgdG9vbHRpcD86IHN0cmluZztcbn1cblxuLyoqIEEgY2hlY2tib3guIGBsYWJlbGAgc2l0cyBiZXNpZGUgaXQgYW5kIG1heSBydW4gdG8gYSBzZW50ZW5jZSBvciB0d28uICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb2xlYW5QYXJhbVNwZWMge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB0eXBlOiAnYm9vbGVhbic7XG4gIHRvb2x0aXA/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGZpeGVkIHNldCBvZiBjaG9pY2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RQYXJhbVNwZWMge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB0eXBlOiAnc2VsZWN0JztcbiAgb3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgdG9vbHRpcD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVG9vbFBhcmFtU3BlYyA9IE51bWJlclBhcmFtU3BlYyB8IEJvb2xlYW5QYXJhbVNwZWMgfCBTZWxlY3RQYXJhbVNwZWM7XG5cbi8qKiBPbmUgc2VsZWN0YWJsZSBjaGVja3BvaW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sTW9kZWxPcHRpb24ge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICAvKipcbiAgICogRGVzY3JpYmVzIHRoZSBjaGVja3BvaW50IGluIHRoZSBwaWNrZXIncyBob3ZlciB0b29sdGlwIOKAlCBzaXplLCBzcGVlZCxcbiAgICogdHJhaW5pbmcgZG9tYWluLCBhY2N1cmFjeS4gKipSZW5kZXJlZCBhcyBIVE1MKiosIHNvIGl0IGlzIHRydXN0ZWQgY29udGVudFxuICAgKiBmcm9tIHRoZSBjb250cmlidXRpbmcgcGFja2FnZSwgbmV2ZXIgYW55dGhpbmcgdXNlci1zdXBwbGllZC5cbiAgICovXG4gIGluZm8/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgdmFsdWVzIHRoaXMgY2hlY2twb2ludCB3YW50cywgbWVyZ2VkIG92ZXJcbiAgICoge0BsaW5rIFRvb2xiYXJUb29sQ29udHJpYnV0aW9uLmRlZmF1bHRQYXJhbXN9IHdoZW4gaXQgaXMgc2VsZWN0ZWQuIERlZmF1bHRzXG4gICAqIGJlbG9uZyB0byB0aGUgbW9kZWwgcmF0aGVyIHRoYW4gdGhlIHRvb2wg4oCUIGEgZGV0ZWN0b3IgdHJhaW5lZCBvbiBuYXRpdmUgNDB4XG4gICAqIHBhdGNoZXMgd2FudHMgZGlmZmVyZW50IHRpbGluZyBmcm9tIG9uZSB0cmFpbmVkIG9uIHRodW1ibmFpbHMuXG4gICAqL1xuICBkZWZhdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIFRoZSBgc3RhdHVzJGAgLyBgYnVzeSRgIC8gYHByb2dyZXNzJGAgc3VyZmFjZSB0aGUgdG9vbGJhciBkcml2ZXMgaXRzIHN0aWNreVxuICogdG9hc3QgYW5kIHByb2dyZXNzIGJhciBmcm9tLiBgcHJvZ3Jlc3MkYCBpcyBhIDAuLjEgZnJhY3Rpb24sIG9yIC0xIGZvclxuICogaW5kZXRlcm1pbmF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sUHJvZ3Jlc3Mge1xuICBzdGF0dXMkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGJ1c3kkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBwcm9ncmVzcyQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbn1cblxuLyoqIFRvb2xiYXIgaWNvbjogYSBwdWJsaXNoZWQgYXNzZXQsIG9yIGEgUHJpbWVJY29uIGNsYXNzIG5hbWUuICovXG5leHBvcnQgdHlwZSBUb29sSWNvbiA9IHsgc3JjOiBzdHJpbmc7IHBpPzogbmV2ZXIgfSB8IHsgcGk6IHN0cmluZzsgc3JjPzogbmV2ZXIgfTtcblxuLyoqXG4gKiBBIHRvb2wgY29udHJpYnV0ZWQgdG8gdGhlIHRvb2xiYXIuXG4gKlxuICogSW1wbGVtZW50IGl0IG9uIGFuIGBASW5qZWN0YWJsZSgpYCBzZXJ2aWNlIGluIHRoZSBjb250cmlidXRpbmcgcGFja2FnZSwgc28gaXRcbiAqIGNhbiBpbmplY3QgaXRzIG93biBzZWdtZW50ZXIgYW5kIG1vZGVsIHJlZ2lzdHJ5IOKAlCB0aGlzIGxpYnJhcnkgcHJvdmlkZXNcbiAqIG5laXRoZXIgYW5kIG11c3Qgbm90IGxlYXJuIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJUb29sQ29udHJpYnV0aW9uIHtcbiAgLyoqIFN0YWJsZSBpZGVudGl0eSwgdXNlZCBmb3IgdHJhY2tpbmcgYW5kIHBlcnNpc3RlZCBwcmVmZXJlbmNlcy4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFNob3J0IG5hbWUsIHVzZWQgaW4gdGhlIHRvYXN0IGFuZCB0aGUgaGVscCBkaWFsb2cgaGVhZGluZy4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbjogVG9vbEljb247XG5cbiAgLyoqIFRvb2x0aXAgb24gdGhlIHJ1biBidXR0b24g4oCUIHNheSB3aGF0IGl0IGRvZXMgdG8gdGhlIGN1cnJlbnQgdmlldy4gKi9cbiAgcnVuVG9vbHRpcDogc3RyaW5nO1xuICAvKiogVG9vbHRpcCBvbiB0aGUgY2hlY2twb2ludCBwaWNrZXIuIERlZmF1bHRzIHRvIFwiUGljayB0aGUgbW9kZWxcIi4gKi9cbiAgbW9kZWxUb29sdGlwPzogc3RyaW5nO1xuICAvKiogVG9vbHRpcCBvbiB0aGUgcGFyYW1ldGVycyBidXR0b24uIERlZmF1bHRzIHRvIFwiUGFyYW1ldGVyc1wiLiAqL1xuICBwYXJhbXNUb29sdGlwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBpdCBzaXRzIGFtb25nIHRoZSBzZWdtZW50YXRpb24gdG9vbHMuIExvd2VyIHNvcnRzIGZpcnN0OyB0aWVzIGZhbGxcbiAgICogYmFjayB0byByZWdpc3RyYXRpb24gb3JkZXIuIFRoZSBidWlsdC1pbiBwcm9tcHRlZCB0b29scyBvY2N1cHkgMC05OSwgc29cbiAgICogY29udHJpYnV0ZWQgdG9vbHMgc2hvdWxkIHN0YXJ0IGF0IDEwMCB0byBsYW5kIGFmdGVyIHRoZW0uXG4gICAqL1xuICBvcmRlcj86IG51bWJlcjtcblxuICAvKiogU2VsZWN0YWJsZSBjaGVja3BvaW50cy4gKipFbXB0eSBoaWRlcyB0aGUgdG9vbC4qKiAqL1xuICBtb2RlbHMoKTogVG9vbE1vZGVsT3B0aW9uW107XG4gIC8qKiBXaGljaCBjaGVja3BvaW50IHJ1bnMgd2hlbiB0aGUgdXNlciBoYXMgbm90IGNob3Nlbi4gKi9cbiAgZGVmYXVsdE1vZGVsSWQoKTogc3RyaW5nO1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcGlja3MgYSBjaGVja3BvaW50LCBiZWZvcmUgcGFyYW1ldGVycyBhcmUgcmUtc2VlZGVkLlxuICAgKiBVc2UgaXQgdG8gcmVjb3JkIHRoZSBjaG9pY2UgaW4gdGhlIGNvbnRyaWJ1dGluZyBwYWNrYWdlJ3Mgb3duIHJlZ2lzdHJ5LlxuICAgKi9cbiAgb25Nb2RlbENoYW5nZT8obW9kZWxJZDogc3RyaW5nKTogdm9pZDtcblxuICAvKiogUGFyYW1ldGVyIGZpZWxkcywgaW4gZGlhbG9nIG9yZGVyLiBFbXB0eSBoaWRlcyB0aGUgcGFyYW1ldGVycyBidXR0b24uICovXG4gIHBhcmFtczogVG9vbFBhcmFtU3BlY1tdO1xuICAvKipcbiAgICogQmFzZWxpbmUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgYSBjaGVja3BvaW50LiBDYWxsZWQgb24gZmlyc3QgdXNlIGFuZCBhZ2FpblxuICAgKiBvbiBcIlJlc2V0IHRvIG1vZGVsIGRlZmF1bHRzXCIsIHNvIGl0IG11c3QgYmUgcHVyZSBhbmQgbXVzdCByZXR1cm4gZXZlcnkga2V5XG4gICAqIHRoZSB0b29sIHJlYWRzIOKAlCBhIHBhcmFtZXRlciB0aGUgZGlhbG9nIHNob3dzIGJ1dCB0aGlzIG9taXRzIHJlbmRlcnMgYXNcbiAgICogZW1wdHkgYW5kIHJlYWNoZXMgYHJ1bmAgYXMgdW5kZWZpbmVkLlxuICAgKi9cbiAgZGVmYXVsdFBhcmFtcyhtb2RlbElkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogRW50cnkgZm9yIHRoZSBoZWxwIGRpYWxvZydzIHRvb2wgbGlzdC4gYGJvZHlgIGlzIHJlbmRlcmVkIGFzIEhUTUwgYW5kIG1heVxuICAgKiByZWZlcmVuY2UgcHVibGlzaGVkIGFzc2V0cyAoZS5nLiB0aGUgdG9vbCdzIG93biBpY29uKS5cbiAgICovXG4gIGhlbHA/OiB7IGJvZHk6IHN0cmluZyB9O1xuXG4gIC8qKiBQcm9ncmVzcyBzdXJmYWNlIGZvciB0aGUgdG9hc3QuICovXG4gIHByb2dyZXNzOiBUb29sUHJvZ3Jlc3M7XG5cbiAgLyoqXG4gICAqIFJ1biBvdmVyIHdoYXQgaXMgY3VycmVudGx5IGRpc3BsYXllZCwgYW5kIHdyaXRlIHdoYXRldmVyIGl0IGZpbmRzIHRocm91Z2hcbiAgICogYHZpemAuIFJlc29sdmVzIHdpdGggdGhlIG51bWJlciBvZiByZWdpb25zIGFkZGVkLlxuICAgKlxuICAgKiBFdmVyeXRoaW5nIHRoZSB0b29sIG5lZWRzIGlzIG9uIHtAbGluayBJVmlzdWFsaXplcn0sIHdoaWNoIGlzIHBhcnQgb2YgdGhpc1xuICAgKiBsaWJyYXJ5J3MgcHVibGljIHN1cmZhY2Ug4oCUIGEgY29udHJpYnV0aW9uIG5ldmVyIHJlYWNoZXMgaW50byBpbnRlcm5hbHMuXG4gICAqIFJlZ2lvbiB3cml0ZXMgZ28gdGhyb3VnaCB0aGUgc2FtZSBwYXRoIHRoZSBidWlsdC1pbiB0b29scyB1c2UsIHNvIHRoZVxuICAgKiBpbmRleC1iYXNlZCBvdmVybGF5cyBhbmQgdGhlIFJlZ2lvbnMgdGFibGUgc3RheSBjb25zaXN0ZW50LlxuICAgKi9cbiAgcnVuKHZpejogSVZpc3VhbGl6ZXIsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKlxuICogV2hhdCBhIGRpYWxvZyB0b29sIGdldHMgd2hpbGUgaXRzIGRpYWxvZyBpcyBvcGVuOiB0aGUgc2FtZSBzdXJmYWNlIGFcbiAqIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZSBnZXRzICh0aGUgcHVibGljIHZpc3VhbGl6ZXIsIHRoZSBJbWFnZSB2aWV3J3Mgdmlld3BvcnRcbiAqIGFuZCB0aGUgY3VycmVudCBpbWFnZSksIHdpdGggdGhlIHRvb2xiYXIgdG9vbHMgYWx3YXlzIHByZXNlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFRvb2xEaWFsb2dDb250ZXh0ID0gUGxvdE1vZGVDb250ZXh0ICYgeyB0b29sczogUGxvdE1vZGVUb29scyB9O1xuXG4vKiogQSBsaXZlIGRpYWxvZy10b29sIHNlc3Npb24uIGBkZWFjdGl2YXRlKClgIHJ1bnMgZXhhY3RseSBvbmNlLCBhZnRlciB0aGUgYm9keSdzIHRlYXJkb3duLiAqL1xuZXhwb3J0IHR5cGUgVG9vbERpYWxvZ1Nlc3Npb24gPSBQbG90TW9kZVNlc3Npb247XG5cbi8qKlxuICogQSB0b29sYmFyIHRvb2wgdGhhdCBvcGVucyBhIGRpYWxvZyBpbnN0ZWFkIG9mIHJ1bm5pbmcgb25jZSAoc2VlIERJQUxPRyBUT09MU1xuICogYWJvdmUpLiBDbGlja2luZyBpdHMgYnV0dG9uIG9wZW5zIHRoZSBkaWFsb2cgYW5kIHN0YXJ0cyBhIHNlc3Npb247IGNsaWNraW5nIGl0XG4gKiBhZ2Fpbiwgb3IgY2xvc2luZyB0aGUgZGlhbG9nLCBlbmRzIGl0LlxuICpcbiAqIFRoZSBzZXNzaW9uIGlzIGJvdW5kIHRvIHRoZSBJbWFnZSB2aWV3IG9uIHNjcmVlbi4gV2hlbiB0aGF0IHZpZXcgaXMgcmUtcmVuZGVyZWRcbiAqIChhbm90aGVyIGltYWdlLCBhbm90aGVyIHNsaWNlKSB0aGUgc2Vzc2lvbiBlbmRzIGFuZCwgd2l0aCB0aGUgZGlhbG9nIHN0aWxsXG4gKiBvcGVuLCBhIGZyZXNoIG9uZSBzdGFydHMgb25jZSB0aGUgbmV3IHZpZXcgaXMgcmVhZHkuIExlYXZpbmcgdGhlIEltYWdlIHZpZXdcbiAqIGNsb3NlcyB0aGUgZGlhbG9nLiBBcyB3aXRoIHBsb3QgbW9kZXMsIG5vdGhpbmcgdGhlIHRvb2wgdGhyb3dzIG9yIHJlamVjdHNcbiAqIGVzY2FwZXM6IGEgZmFpbGVkIHN0YXJ0IGNsb3NlcyB0aGUgZGlhbG9nIHdpdGggYSB3YXJuaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uIHtcbiAga2luZDogJ2RpYWxvZyc7XG4gIC8qKiBTdGFibGUgaWRlbnRpdHkuIE11c3Qgbm90IGNsYXNoIHdpdGggYW5vdGhlciB0b29sYmFyIHRvb2wuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBTaG9ydCBuYW1lOyB0aGUgZGlhbG9nIHRpdGxlIHVubGVzcyBgZGlhbG9nLnRpdGxlYCBpcyBzZXQuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IFRvb2xJY29uO1xuICAvKiogVG9vbHRpcCBvbiB0aGUgYnV0dG9uLiAqL1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIC8qKiBPcmRlciBhbW9uZyB0aGUgZGlhbG9nIHRvb2xzLiBMb3dlciBzb3J0cyBmaXJzdDsgdGllcyBrZWVwIHJlZ2lzdHJhdGlvbiBvcmRlci4gKi9cbiAgb3JkZXI/OiBudW1iZXI7XG4gIGRpYWxvZz86IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICAvKiogQ1NTIHdpZHRoIG9mIHRoZSBkaWFsb2cuIERlZmF1bHQgYCcyMnJlbSdgLiAqL1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICB9O1xuICAvKiogRW50cnkgZm9yIHRoZSBoZWxwIGRpYWxvZydzIHRvb2wgbGlzdCwgcmVuZGVyZWQgYXMgSFRNTCAodHJ1c3RlZCBjb250ZW50KS4gKi9cbiAgaGVscD86IHsgYm9keTogc3RyaW5nIH07XG4gIC8qKiBTdGFydCBhIHNlc3Npb24sIG9uY2UgdGhlIEltYWdlIHZpZXcncyB2aWV3cG9ydCBpcyByZWFkeS4gKi9cbiAgYWN0aXZhdGUoY3R4OiBUb29sRGlhbG9nQ29udGV4dCk6IFRvb2xEaWFsb2dTZXNzaW9uIHwgUHJvbWlzZTxUb29sRGlhbG9nU2Vzc2lvbj47XG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGRpYWxvZyBib2R5IGludG8gYGhvc3RgOyByZXR1cm4gaXRzIHRlYXJkb3duIChjYWxsZWQgYmVmb3JlXG4gICAqIGBkZWFjdGl2YXRlKClgKS4gQ2FsbGVkIGFmdGVyIGBhY3RpdmF0ZWAgcmVzb2x2ZXMsIG9uY2UgdGhlIGRpYWxvZyBoYXMgcmVuZGVyZWQgYW5kXG4gICAqIGBob3N0YCBpcyBpbiB0aGUgZG9jdW1lbnQsIHNvIHRoZSBib2R5IGNhbiBtZWFzdXJlIGl0c2VsZi5cbiAgICovXG4gIG1vdW50KGhvc3Q6IEhUTUxFbGVtZW50LCBjdHg6IFRvb2xEaWFsb2dDb250ZXh0LCBzZXNzaW9uOiBUb29sRGlhbG9nU2Vzc2lvbik6ICgpID0+IHZvaWQ7XG59XG5cbi8qKiBBbnl0aGluZyBwcm92aWRlZCBvbiB7QGxpbmsgVE9PTEJBUl9UT09MU30uIEEgcnVuIHRvb2wgaGFzIG5vIGBraW5kYC4gKi9cbmV4cG9ydCB0eXBlIFRvb2xiYXJDb250cmlidXRpb24gPSBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbiB8IFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uO1xuXG4vKiogV2hldGhlciBhIGNvbnRyaWJ1dGlvbiBpcyBhIHtAbGluayBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbn0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dUb29sQ29udHJpYnV0aW9uKGM6IHVua25vd24pOiBjIGlzIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uIHtcbiAgcmV0dXJuICEhYyAmJiAoYyBhcyB7IGtpbmQ/OiB1bmtub3duIH0pLmtpbmQgPT09ICdkaWFsb2cnO1xufVxuXG4vKipcbiAqIE11bHRpLXByb3ZpZGVyIHRva2VuIGZvciBjb250cmlidXRlZCB0b29sczogcnVuIHRvb2xzXG4gKiAoe0BsaW5rIFRvb2xiYXJUb29sQ29udHJpYnV0aW9ufSkgYW5kLCBzaW5jZSAwLjYuMCwgZGlhbG9nIHRvb2xzXG4gKiAoe0BsaW5rIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9ufSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGhhcyBubyBgZmFjdG9yeWA6IHVucmVnaXN0ZXJlZCBtZWFucyBubyB0b29scywgd2hpY2ggaXMgd2hhdFxuICogbWFrZXMgdGhpcyBsaWJyYXJ5IHNoaXBwYWJsZSB3aXRob3V0IHRoZSBjbG9zZWQgbW9kZWwgcGFja2FnZXMuIEluamVjdCBpdFxuICogYHsgb3B0aW9uYWw6IHRydWUgfWAgYW5kIHRyZWF0IG51bGwgYXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUT09MQkFSX1RPT0xTID0gbmV3IEluamVjdGlvblRva2VuPHJlYWRvbmx5IFRvb2xiYXJDb250cmlidXRpb25bXT4oJ1RPT0xCQVJfVE9PTFMnKTtcblxuLyoqIFNvcnQgY29udHJpYnV0ZWQgdG9vbHMgaW50byBkaXNwbGF5IG9yZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRUb29sQ29udHJpYnV0aW9uczxUIGV4dGVuZHMgeyBvcmRlcj86IG51bWJlciB9PihcbiAgdG9vbHM6IHJlYWRvbmx5IFRbXSxcbik6IFRbXSB7XG4gIC8vIFN0YWJsZTogZXF1YWwgYG9yZGVyYCBrZWVwcyByZWdpc3RyYXRpb24gb3JkZXIsIHNvIGEgaG9zdCBjb250cm9scyB0aWVzIGJ5XG4gIC8vIHByb3ZpZGVyIG9yZGVyIHdpdGhvdXQgaGF2aW5nIHRvIGludmVudCBudW1iZXJzLlxuICByZXR1cm4gdG9vbHMubWFwKCh0LCBpKSA9PiAoeyB0LCBpIH0pKS5zb3J0KChhLCBiKSA9PlxuICAgIChhLnQub3JkZXIgPz8gMTAwKSAtIChiLnQub3JkZXIgPz8gMTAwKSB8fCBhLmkgLSBiLmksXG4gICkubWFwKCh7IHQgfSkgPT4gdCk7XG59XG5cbi8qKiBUaGUgcnVuIHRvb2xzIGEgdG9vbGJhciBzaG91bGQgYWN0dWFsbHkgc2hvdzogdGhvc2Ugd2l0aCBhdCBsZWFzdCBvbmUgbW9kZWwuXG4gKiAgRGlhbG9nIHRvb2xzIGFyZSBsZWZ0IG91dCAoc2VlIHtAbGluayBkaWFsb2dUb29sQ29udHJpYnV0aW9uc30pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVUb29sQ29udHJpYnV0aW9ucyhcbiAgdG9vbHM6IHJlYWRvbmx5IFRvb2xiYXJDb250cmlidXRpb25bXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbltdIHtcbiAgY29uc3QgcnVuID0gKHRvb2xzID8/IFtdKS5maWx0ZXIoXG4gICAgKHQpOiB0IGlzIFRvb2xiYXJUb29sQ29udHJpYnV0aW9uID0+XG4gICAgICAhaXNEaWFsb2dUb29sQ29udHJpYnV0aW9uKHQpICYmIHR5cGVvZiAodCBhcyBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbik/Lm1vZGVscyA9PT0gJ2Z1bmN0aW9uJyxcbiAgKTtcbiAgcmV0dXJuIHNvcnRUb29sQ29udHJpYnV0aW9ucyhydW4pLmZpbHRlcigodCkgPT4gdC5tb2RlbHMoKS5sZW5ndGggPiAwKTtcbn1cblxuLyoqXG4gKiBUaGUgZGlhbG9nIHRvb2xzLCBpbiBkaXNwbGF5IG9yZGVyLiBBIG1hbGZvcm1lZCBvbmUgKG5vIHN0cmluZyBgaWRgLCBub1xuICogYGFjdGl2YXRlYCBvciBgbW91bnRgIGZ1bmN0aW9uKSBvciBhIHJlcGVhdGVkIGBpZGAgaXMgZHJvcHBlZCB3aXRoIGEgd2FybmluZ1xuICogcmF0aGVyIHRoYW4gYnJlYWtpbmcgdGhlIHRvb2xiYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWFsb2dUb29sQ29udHJpYnV0aW9ucyhcbiAgdG9vbHM6IHJlYWRvbmx5IFRvb2xiYXJDb250cmlidXRpb25bXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvZzogeyB3YXJuKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQgfSA9IGNvbnNvbGUsXG4pOiBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvdXQ6IFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCB0IG9mICh0b29scyA/PyBbXSkuZmlsdGVyKGlzRGlhbG9nVG9vbENvbnRyaWJ1dGlvbikpIHtcbiAgICBpZiAodHlwZW9mIHQuaWQgIT09ICdzdHJpbmcnIHx8ICF0LmlkIHx8IHR5cGVvZiB0LmFjdGl2YXRlICE9PSAnZnVuY3Rpb24nXG4gICAgICAgIHx8IHR5cGVvZiB0Lm1vdW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsb2cud2FybignW3Zpc3VhbGl6ZXJdIGRpYWxvZyB0b29sIGlnbm9yZWQ6IGl0IG5lZWRzIGEgc3RyaW5nIGBpZGAgYW5kIGBhY3RpdmF0ZWAgYW5kIGBtb3VudGAgZnVuY3Rpb25zLicsIHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyh0LmlkKSkge1xuICAgICAgbG9nLndhcm4oYFt2aXN1YWxpemVyXSBkaWFsb2cgdG9vbCAnJHt0LmlkfScgaWdub3JlZDogYW5vdGhlciBkaWFsb2cgdG9vbCBhbHJlYWR5IHVzZXMgdGhhdCBpZC5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzZWVuLmFkZCh0LmlkKTtcbiAgICBvdXQucHVzaCh0KTtcbiAgfVxuICByZXR1cm4gc29ydFRvb2xDb250cmlidXRpb25zKG91dCk7XG59XG4iXX0=
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci10b29sLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvdG9vbGJhci10b29sLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBa00vQyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHdCQUF3QixDQUFDLENBQVU7SUFDakQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQXdCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQWlDLGVBQWUsQ0FBQyxDQUFDO0FBRWpHLGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUscUJBQXFCLENBQStCLEtBQW1CO0lBQ3JGLDZFQUE2RTtJQUM3RSxtREFBbUQ7SUFDbkQsT0FBTyxLQUFLO1NBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEO3VFQUN1RTtBQUN2RSxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLEtBQXdEO0lBRXhELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDOUIsQ0FBQyxDQUFDLEVBQWdDLEVBQUUsQ0FDbEMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFRLENBQTZCLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FDL0YsQ0FBQztJQUNGLE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxLQUF3RCxFQUN4RCxNQUEwQyxPQUFPO0lBRWpELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQW9DLEVBQUUsQ0FBQztJQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMzRyxHQUFHLENBQUMsSUFBSSxDQUNOLGdHQUFnRyxFQUNoRyxDQUFDLENBQ0YsQ0FBQztZQUNGLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLHNEQUFzRCxDQUFDLENBQUM7WUFDbEcsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIb3cgYSB0b29sIGdldHMgaW50byB0aGUgdG9vbGJhciB3aXRob3V0IHRoaXMgbGlicmFyeSBrbm93aW5nIHdoYXQgaXQgaXMuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTXG4gKiBUaGUgWU9MTyBkZXRlY3RvciBhbmQgdGhlIHJldGluYWwtbGF5ZXIgc2VnbWVudGVyIHVzZWQgdG8gYmUgYnVpbHQgaW46IHRoZWlyXG4gKiBidXR0b25zIHdlcmUgaGFyZGNvZGVkIGluIHRoZSB0b29sYmFyIHRlbXBsYXRlLCB0aGVpciBtb2RlbCByZWdpc3RyaWVzIG5hbWVkXG4gKiBKQVggY2hlY2twb2ludHMsIGFuZCB0aGUgYElOU1RBTkNFX1NFR01FTlRFUmAgLyBgU0VNQU5USUNfU0VHTUVOVEVSYCB0b2tlbnNcbiAqIGRlZmF1bHRlZCB0byBpbi1saWJyYXJ5IHNlcnZpY2VzIHRoYXQgaW1wb3J0ZWQgYHlvbG8tc2VnZGV0ZWN0LWpzYCBhbmRcbiAqIGBqYXgtYWktanNgLiBUaG9zZSBkZWZhdWx0IGZhY3RvcmllcyB3ZXJlIHRoZSBvbmx5IHRoaW5nIHB1bGxpbmcgZWl0aGVyXG4gKiBwYWNrYWdlIGludG8gdGhlIGJ1bmRsZSDigJQgdGhlIGNvbnRyYWN0cyB0aGVtc2VsdmVzIHdlcmUgYWxyZWFkeSBjbGVhbi5cbiAqXG4gKiBUaGF0IGFycmFuZ2VtZW50IGNhbm5vdCBzaGlwIGluIGFuIG9wZW4gbGlicmFyeSB3aGlsZSB0aGUgbW9kZWxzIGFyZSBjbG9zZWQuXG4gKiBTbyB0aGUgdG9vbHMgbW92ZSBvdXQsIGludG8gYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiB0aGlzIG9uZSwgYW5kIGFycml2ZVxuICogYmFjayB0aHJvdWdoIHtAbGluayBUT09MQkFSX1RPT0xTfS4gVGhpcyBsaWJyYXJ5IGtlZXBzIHRoZSBjb250cmFjdHMsIHRoZVxuICogY2hyb21lIGFuZCB0aGUgcmVnaW9uIHBsdW1iaW5nOyBpdCBubyBsb25nZXIga25vd3MgdGhhdCBZT0xPIGV4aXN0cy5cbiAqXG4gKiBBIGhvc3QgcmVnaXN0ZXJzIHRvb2xzIHdpdGggYSBtdWx0aS1wcm92aWRlcjpcbiAqXG4gKiAgICAgeyBwcm92aWRlOiBUT09MQkFSX1RPT0xTLCB1c2VFeGlzdGluZzogWW9sb1Rvb2xDb250cmlidXRpb24sIG11bHRpOiB0cnVlIH1cbiAqXG4gKiBSZWdpc3RlciBub3RoaW5nIGFuZCB0aGUgdG9vbGJhciBoYXMgbm8gc2VnbWVudGF0aW9uIHRvb2xzLCB0aGUgaGVscCBkaWFsb2dcbiAqIGxpc3RzIG5vbmUsIGFuZCBuZWl0aGVyIG1vZGVsIHBhY2thZ2UgaXMgaW4gdGhlIGdyYXBoLlxuICpcbiAqIFdIWSBQQVJBTVMgQVJFIERFQ0xBUkVELCBOT1QgUkVOREVSRURcbiAqIEEgY29udHJpYnV0aW9uIGRlc2NyaWJlcyBpdHMgcGFyYW1ldGVycyAoe0BsaW5rIFRvb2xQYXJhbVNwZWN9KSBpbnN0ZWFkIG9mXG4gKiBzdXBwbHlpbmcgYSBjb21wb25lbnQgdG8gZHJhdyB0aGVtLiBUaGUgdG9vbGJhciByZW5kZXJzIG9uZSBnZW5lcmljIGRpYWxvZ1xuICogZnJvbSB0aGF0IGRlc2NyaXB0aW9uLiBUaGUgYWx0ZXJuYXRpdmUg4oCUIGVhY2ggcGx1Z2luIHNoaXBwaW5nIGl0cyBvd24gZGlhbG9nXG4gKiBjb21wb25lbnQg4oCUIHdvdWxkIG1ha2UgZXZlcnkgcGx1Z2luIGRlcGVuZCBvbiB0aGlzIGxpYnJhcnkncyBleGFjdCBQcmltZU5HXG4gKiB2ZXJzaW9uIGFuZCBzdHlsaW5nIGludGVybmFscyB0byBsb29rIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHRvb2xiYXIsIGFuZCB0aGVcbiAqIHR3byBkaWFsb2dzIHRoYXQgZXhpc3QgdG9kYXkgYXJlIGVudGlyZWx5IG51bWJlcnMgYW5kIG9uZSBjaGVja2JveC4gQSBzY2hlbWFcbiAqIGNvdmVycyB0aGVtLCBhbmQgaXQgaXMgdGhlIHNhbWUgc2hhcGUgaml0LXVpIGFscmVhZHkgdXNlcyBmb3IgaXRzIHBpcGVsaW5lXG4gKiBzdGVwIHBhcmFtZXRlcnMsIHNvIHRoZSB2b2NhYnVsYXJ5IGlzIGZhbWlsaWFyLlxuICpcbiAqIElmIGEgdG9vbCBldmVyIG5lZWRzIGEgY29udHJvbCB0aGlzIGNhbm5vdCBleHByZXNzLCBhZGQgYSB2YXJpYW50IGhlcmUgcmF0aGVyXG4gKiB0aGFuIGFuIGVzY2FwZSBoYXRjaCB0aGF0IHJldHVybnMgYSBjb21wb25lbnQg4oCUIHRoZSBtb21lbnQgb25lIHRvb2wgZHJhd3NcbiAqIGl0c2VsZiwgdGhlIHRvb2xiYXIgc3RvcHMgYmVpbmcgYWJsZSB0byBsYXkgdG9vbHMgb3V0IGNvbnNpc3RlbnRseS5cbiAqXG4gKiBESUFMT0cgVE9PTFNcbiAqIFNvbWUgdG9vbHMgYXJlIG5vdCBcInNldCBwYXJhbWV0ZXJzLCBydW4gb25jZVwiIGJ1dCBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOiB0aGVcbiAqIHVzZXIgcGFpbnRzLCB0aGUgdG9vbCByZXRyYWlucyBhbmQgcmVkcmF3cywgb3ZlciBhbmQgb3ZlciAoRElBTk5FKS4gQSBzY2hlbWFcbiAqIGNhbm5vdCBkZXNjcmliZSB0aGF0LCBzbyB7QGxpbmsgVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb259IGlzIHRoZSBvbmVcbiAqIHZhcmlhbnQgdGhhdCByZW5kZXJzIGl0cyBvd24gYm9keS4gVGhlIHRvb2xiYXIgc3RpbGwgb3ducyB0aGUgYnV0dG9uLCBpdHNcbiAqIHBsYWNlbWVudCBhbmQgdGhlIGRpYWxvZyBjaHJvbWU7IHRoZSB0b29sIG9ubHkgZmlsbHMgdGhlIGRpYWxvZywgd2l0aCBwbGFpblxuICogRE9NIChgbW91bnRgKSwgc28gaXQgbmVlZHMgbmVpdGhlciBBbmd1bGFyIG5vciB0aGlzIGxpYnJhcnkncyBQcmltZU5HIHZlcnNpb24uXG4gKiBJdHMgYnV0dG9uIHNpdHMgd2l0aCB0aGUgaG9zdCdzIG93biBhY3Rpb25zIGF0IHRoZSBzdGFydCBvZiB0aGUgdG9vbGJhciwgYW5kXG4gKiBzaG93cyBvbmx5IGluIHRoZSBJbWFnZSB2aWV3LCB0aGUgdmlldyBpdHMgY29udGV4dCAoe0BsaW5rIFRvb2xEaWFsb2dDb250ZXh0fSlcbiAqIGRyYXdzIG92ZXIuXG4gKlxuICogV0hZIEFOIEVNUFRZIE1PREVMIExJU1QgSElERVMgVEhFIFRPT0xcbiAqIHtAbGluayBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbi5tb2RlbHN9IHJldHVybmluZyBgW11gIHJlbW92ZXMgdGhlIHRvb2wgZnJvbVxuICogdGhlIHRvb2xiYXIgZW50aXJlbHkuIFRoaXMgcHJlc2VydmVzIHRoZSBiZWhhdmlvdXIgdGhlIGJ1aWx0LWluIHRvb2xzIGFscmVhZHlcbiAqIGhhZCAodGhlaXIgYnV0dG9ucyB3ZXJlIGAqbmdJZmAnZCBvbiBhIGZpbHRlcmVkIHJlZ2lzdHJ5KSwgYW5kIGl0IGdpdmVzIGEgaG9zdFxuICogb25lIHN3aXRjaCBmb3IgXCJ0aGUgd2VpZ2h0cyBhcmUgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBkZXBsb3ltZW50XCIgdGhhdCBkb2VzXG4gKiBub3QgcmVxdWlyZSB1bnJlZ2lzdGVyaW5nIHRoZSBwcm92aWRlci5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgdHlwZSB7IElWaXN1YWxpemVyIH0gZnJvbSAnLi92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgUGxvdE1vZGVDb250ZXh0LCBQbG90TW9kZVNlc3Npb24sIFBsb3RNb2RlVG9vbHMgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKiogQSBudW1iZXIgZmllbGQuIFJlbmRlcmVkIGFzIGEgc3RlcHBlciwgbWF0Y2hpbmcgdGhlIGJ1aWx0LWluIGRpYWxvZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlclBhcmFtU3BlYyB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHR5cGU6ICdudW1iZXInO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqIERlY2ltYWwgcGxhY2VzIHRvIHNob3cuIE9taXQgZm9yIGludGVnZXJzLiAqL1xuICBmcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgLyoqIEhvdmVyIGhlbHAuIFBsYWluIHRleHQ7IGl0IGlzIG5vdCByZW5kZXJlZCBhcyBIVE1MLiAqL1xuICB0b29sdGlwPzogc3RyaW5nO1xufVxuXG4vKiogQSBjaGVja2JveC4gYGxhYmVsYCBzaXRzIGJlc2lkZSBpdCBhbmQgbWF5IHJ1biB0byBhIHNlbnRlbmNlIG9yIHR3by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vbGVhblBhcmFtU3BlYyB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHR5cGU6ICdib29sZWFuJztcbiAgdG9vbHRpcD86IHN0cmluZztcbn1cblxuLyoqIEEgZml4ZWQgc2V0IG9mIGNob2ljZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdFBhcmFtU3BlYyB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHR5cGU6ICdzZWxlY3QnO1xuICBvcHRpb25zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICB0b29sdGlwPzogc3RyaW5nO1xufVxuXG4vKiogT25lIHBhcmFtZXRlciBhIGRpYWxvZyB0b29sIGFza3MgZm9yLCBkaXNjcmltaW5hdGVkIGJ5IGB0eXBlYC4gKi9cbmV4cG9ydCB0eXBlIFRvb2xQYXJhbVNwZWMgPSBOdW1iZXJQYXJhbVNwZWMgfCBCb29sZWFuUGFyYW1TcGVjIHwgU2VsZWN0UGFyYW1TcGVjO1xuXG4vKiogT25lIHNlbGVjdGFibGUgY2hlY2twb2ludC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbE1vZGVsT3B0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgY2hlY2twb2ludCBpbiB0aGUgcGlja2VyJ3MgaG92ZXIgdG9vbHRpcCDigJQgc2l6ZSwgc3BlZWQsXG4gICAqIHRyYWluaW5nIGRvbWFpbiwgYWNjdXJhY3kuICoqUmVuZGVyZWQgYXMgSFRNTCoqLCBzbyBpdCBpcyB0cnVzdGVkIGNvbnRlbnRcbiAgICogZnJvbSB0aGUgY29udHJpYnV0aW5nIHBhY2thZ2UsIG5ldmVyIGFueXRoaW5nIHVzZXItc3VwcGxpZWQuXG4gICAqL1xuICBpbmZvPzogc3RyaW5nO1xuICAvKipcbiAgICogUGFyYW1ldGVyIHZhbHVlcyB0aGlzIGNoZWNrcG9pbnQgd2FudHMsIG1lcmdlZCBvdmVyXG4gICAqIHtAbGluayBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbi5kZWZhdWx0UGFyYW1zfSB3aGVuIGl0IGlzIHNlbGVjdGVkLiBEZWZhdWx0c1xuICAgKiBiZWxvbmcgdG8gdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSB0b29sIOKAlCBhIGRldGVjdG9yIHRyYWluZWQgb24gbmF0aXZlIDQweFxuICAgKiBwYXRjaGVzIHdhbnRzIGRpZmZlcmVudCB0aWxpbmcgZnJvbSBvbmUgdHJhaW5lZCBvbiB0aHVtYm5haWxzLlxuICAgKi9cbiAgZGVmYXVsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBUaGUgYHN0YXR1cyRgIC8gYGJ1c3kkYCAvIGBwcm9ncmVzcyRgIHN1cmZhY2UgdGhlIHRvb2xiYXIgZHJpdmVzIGl0cyBzdGlja3lcbiAqIHRvYXN0IGFuZCBwcm9ncmVzcyBiYXIgZnJvbS4gYHByb2dyZXNzJGAgaXMgYSAwLi4xIGZyYWN0aW9uLCBvciAtMSBmb3JcbiAqIGluZGV0ZXJtaW5hdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbFByb2dyZXNzIHtcbiAgc3RhdHVzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBidXN5JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHJvZ3Jlc3MkOiBPYnNlcnZhYmxlPG51bWJlcj47XG59XG5cbi8qKiBUb29sYmFyIGljb246IGEgcHVibGlzaGVkIGFzc2V0LCBvciBhIFByaW1lSWNvbiBjbGFzcyBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgVG9vbEljb24gPSB7IHNyYzogc3RyaW5nOyBwaT86IG5ldmVyIH0gfCB7IHBpOiBzdHJpbmc7IHNyYz86IG5ldmVyIH07XG5cbi8qKlxuICogQSB0b29sIGNvbnRyaWJ1dGVkIHRvIHRoZSB0b29sYmFyLlxuICpcbiAqIEltcGxlbWVudCBpdCBvbiBhbiBgQEluamVjdGFibGUoKWAgc2VydmljZSBpbiB0aGUgY29udHJpYnV0aW5nIHBhY2thZ2UsIHNvIGl0XG4gKiBjYW4gaW5qZWN0IGl0cyBvd24gc2VnbWVudGVyIGFuZCBtb2RlbCByZWdpc3RyeSDigJQgdGhpcyBsaWJyYXJ5IHByb3ZpZGVzXG4gKiBuZWl0aGVyIGFuZCBtdXN0IG5vdCBsZWFybiB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbiB7XG4gIC8qKiBTdGFibGUgaWRlbnRpdHksIHVzZWQgZm9yIHRyYWNraW5nIGFuZCBwZXJzaXN0ZWQgcHJlZmVyZW5jZXMuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBTaG9ydCBuYW1lLCB1c2VkIGluIHRoZSB0b2FzdCBhbmQgdGhlIGhlbHAgZGlhbG9nIGhlYWRpbmcuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IFRvb2xJY29uO1xuXG4gIC8qKiBUb29sdGlwIG9uIHRoZSBydW4gYnV0dG9uIOKAlCBzYXkgd2hhdCBpdCBkb2VzIHRvIHRoZSBjdXJyZW50IHZpZXcuICovXG4gIHJ1blRvb2x0aXA6IHN0cmluZztcbiAgLyoqIFRvb2x0aXAgb24gdGhlIGNoZWNrcG9pbnQgcGlja2VyLiBEZWZhdWx0cyB0byBcIlBpY2sgdGhlIG1vZGVsXCIuICovXG4gIG1vZGVsVG9vbHRpcD86IHN0cmluZztcbiAgLyoqIFRvb2x0aXAgb24gdGhlIHBhcmFtZXRlcnMgYnV0dG9uLiBEZWZhdWx0cyB0byBcIlBhcmFtZXRlcnNcIi4gKi9cbiAgcGFyYW1zVG9vbHRpcD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgaXQgc2l0cyBhbW9uZyB0aGUgc2VnbWVudGF0aW9uIHRvb2xzLiBMb3dlciBzb3J0cyBmaXJzdDsgdGllcyBmYWxsXG4gICAqIGJhY2sgdG8gcmVnaXN0cmF0aW9uIG9yZGVyLiBUaGUgYnVpbHQtaW4gcHJvbXB0ZWQgdG9vbHMgb2NjdXB5IDAtOTksIHNvXG4gICAqIGNvbnRyaWJ1dGVkIHRvb2xzIHNob3VsZCBzdGFydCBhdCAxMDAgdG8gbGFuZCBhZnRlciB0aGVtLlxuICAgKi9cbiAgb3JkZXI/OiBudW1iZXI7XG5cbiAgLyoqIFNlbGVjdGFibGUgY2hlY2twb2ludHMuICoqRW1wdHkgaGlkZXMgdGhlIHRvb2wuKiogKi9cbiAgbW9kZWxzKCk6IFRvb2xNb2RlbE9wdGlvbltdO1xuICAvKiogV2hpY2ggY2hlY2twb2ludCBydW5zIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBjaG9zZW4uICovXG4gIGRlZmF1bHRNb2RlbElkKCk6IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzIGEgY2hlY2twb2ludCwgYmVmb3JlIHBhcmFtZXRlcnMgYXJlIHJlLXNlZWRlZC5cbiAgICogVXNlIGl0IHRvIHJlY29yZCB0aGUgY2hvaWNlIGluIHRoZSBjb250cmlidXRpbmcgcGFja2FnZSdzIG93biByZWdpc3RyeS5cbiAgICovXG4gIG9uTW9kZWxDaGFuZ2U/KG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqIFBhcmFtZXRlciBmaWVsZHMsIGluIGRpYWxvZyBvcmRlci4gRW1wdHkgaGlkZXMgdGhlIHBhcmFtZXRlcnMgYnV0dG9uLiAqL1xuICBwYXJhbXM6IFRvb2xQYXJhbVNwZWNbXTtcbiAgLyoqXG4gICAqIEJhc2VsaW5lIHBhcmFtZXRlciB2YWx1ZXMgZm9yIGEgY2hlY2twb2ludC4gQ2FsbGVkIG9uIGZpcnN0IHVzZSBhbmQgYWdhaW5cbiAgICogb24gXCJSZXNldCB0byBtb2RlbCBkZWZhdWx0c1wiLCBzbyBpdCBtdXN0IGJlIHB1cmUgYW5kIG11c3QgcmV0dXJuIGV2ZXJ5IGtleVxuICAgKiB0aGUgdG9vbCByZWFkcyDigJQgYSBwYXJhbWV0ZXIgdGhlIGRpYWxvZyBzaG93cyBidXQgdGhpcyBvbWl0cyByZW5kZXJzIGFzXG4gICAqIGVtcHR5IGFuZCByZWFjaGVzIGBydW5gIGFzIHVuZGVmaW5lZC5cbiAgICovXG4gIGRlZmF1bHRQYXJhbXMobW9kZWxJZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEVudHJ5IGZvciB0aGUgaGVscCBkaWFsb2cncyB0b29sIGxpc3QuIGBib2R5YCBpcyByZW5kZXJlZCBhcyBIVE1MIGFuZCBtYXlcbiAgICogcmVmZXJlbmNlIHB1Ymxpc2hlZCBhc3NldHMgKGUuZy4gdGhlIHRvb2wncyBvd24gaWNvbikuXG4gICAqL1xuICBoZWxwPzogeyBib2R5OiBzdHJpbmcgfTtcblxuICAvKiogUHJvZ3Jlc3Mgc3VyZmFjZSBmb3IgdGhlIHRvYXN0LiAqL1xuICBwcm9ncmVzczogVG9vbFByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBSdW4gb3ZlciB3aGF0IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQsIGFuZCB3cml0ZSB3aGF0ZXZlciBpdCBmaW5kcyB0aHJvdWdoXG4gICAqIGB2aXpgLiBSZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBhZGRlZC5cbiAgICpcbiAgICogRXZlcnl0aGluZyB0aGUgdG9vbCBuZWVkcyBpcyBvbiB7QGxpbmsgSVZpc3VhbGl6ZXJ9LCB3aGljaCBpcyBwYXJ0IG9mIHRoaXNcbiAgICogbGlicmFyeSdzIHB1YmxpYyBzdXJmYWNlIOKAlCBhIGNvbnRyaWJ1dGlvbiBuZXZlciByZWFjaGVzIGludG8gaW50ZXJuYWxzLlxuICAgKiBSZWdpb24gd3JpdGVzIGdvIHRocm91Z2ggdGhlIHNhbWUgcGF0aCB0aGUgYnVpbHQtaW4gdG9vbHMgdXNlLCBzbyB0aGVcbiAgICogaW5kZXgtYmFzZWQgb3ZlcmxheXMgYW5kIHRoZSBSZWdpb25zIHRhYmxlIHN0YXkgY29uc2lzdGVudC5cbiAgICovXG4gIHJ1bih2aXo6IElWaXN1YWxpemVyLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vKipcbiAqIFdoYXQgYSBkaWFsb2cgdG9vbCBnZXRzIHdoaWxlIGl0cyBkaWFsb2cgaXMgb3BlbjogdGhlIHNhbWUgc3VyZmFjZSBhXG4gKiBjb250cmlidXRlZCBwbG90IG1vZGUgZ2V0cyAodGhlIHB1YmxpYyB2aXN1YWxpemVyLCB0aGUgSW1hZ2UgdmlldydzIHZpZXdwb3J0XG4gKiBhbmQgdGhlIGN1cnJlbnQgaW1hZ2UpLCB3aXRoIHRoZSB0b29sYmFyIHRvb2xzIGFsd2F5cyBwcmVzZW50LlxuICovXG5leHBvcnQgdHlwZSBUb29sRGlhbG9nQ29udGV4dCA9IFBsb3RNb2RlQ29udGV4dCAmIHsgdG9vbHM6IFBsb3RNb2RlVG9vbHMgfTtcblxuLyoqIEEgbGl2ZSBkaWFsb2ctdG9vbCBzZXNzaW9uLiBgZGVhY3RpdmF0ZSgpYCBydW5zIGV4YWN0bHkgb25jZSwgYWZ0ZXIgdGhlIGJvZHkncyB0ZWFyZG93bi4gKi9cbmV4cG9ydCB0eXBlIFRvb2xEaWFsb2dTZXNzaW9uID0gUGxvdE1vZGVTZXNzaW9uO1xuXG4vKipcbiAqIEEgdG9vbGJhciB0b29sIHRoYXQgb3BlbnMgYSBkaWFsb2cgaW5zdGVhZCBvZiBydW5uaW5nIG9uY2UgKHNlZSBESUFMT0cgVE9PTFNcbiAqIGFib3ZlKS4gQ2xpY2tpbmcgaXRzIGJ1dHRvbiBvcGVucyB0aGUgZGlhbG9nIGFuZCBzdGFydHMgYSBzZXNzaW9uOyBjbGlja2luZyBpdFxuICogYWdhaW4sIG9yIGNsb3NpbmcgdGhlIGRpYWxvZywgZW5kcyBpdC5cbiAqXG4gKiBUaGUgc2Vzc2lvbiBpcyBib3VuZCB0byB0aGUgSW1hZ2UgdmlldyBvbiBzY3JlZW4uIFdoZW4gdGhhdCB2aWV3IGlzIHJlLXJlbmRlcmVkXG4gKiAoYW5vdGhlciBpbWFnZSwgYW5vdGhlciBzbGljZSkgdGhlIHNlc3Npb24gZW5kcyBhbmQsIHdpdGggdGhlIGRpYWxvZyBzdGlsbFxuICogb3BlbiwgYSBmcmVzaCBvbmUgc3RhcnRzIG9uY2UgdGhlIG5ldyB2aWV3IGlzIHJlYWR5LiBMZWF2aW5nIHRoZSBJbWFnZSB2aWV3XG4gKiBjbG9zZXMgdGhlIGRpYWxvZy4gQXMgd2l0aCBwbG90IG1vZGVzLCBub3RoaW5nIHRoZSB0b29sIHRocm93cyBvciByZWplY3RzXG4gKiBlc2NhcGVzOiBhIGZhaWxlZCBzdGFydCBjbG9zZXMgdGhlIGRpYWxvZyB3aXRoIGEgd2FybmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbiB7XG4gIGtpbmQ6ICdkaWFsb2cnO1xuICAvKiogU3RhYmxlIGlkZW50aXR5LiBNdXN0IG5vdCBjbGFzaCB3aXRoIGFub3RoZXIgdG9vbGJhciB0b29sLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogU2hvcnQgbmFtZTsgdGhlIGRpYWxvZyB0aXRsZSB1bmxlc3MgYGRpYWxvZy50aXRsZWAgaXMgc2V0LiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uOiBUb29sSWNvbjtcbiAgLyoqIFRvb2x0aXAgb24gdGhlIGJ1dHRvbi4gKi9cbiAgdG9vbHRpcDogc3RyaW5nO1xuICAvKiogT3JkZXIgYW1vbmcgdGhlIGRpYWxvZyB0b29scy4gTG93ZXIgc29ydHMgZmlyc3Q7IHRpZXMga2VlcCByZWdpc3RyYXRpb24gb3JkZXIuICovXG4gIG9yZGVyPzogbnVtYmVyO1xuICBkaWFsb2c/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIENTUyB3aWR0aCBvZiB0aGUgZGlhbG9nLiBEZWZhdWx0IGAnMjJyZW0nYC4gKi9cbiAgICB3aWR0aD86IHN0cmluZztcbiAgfTtcbiAgLyoqIEVudHJ5IGZvciB0aGUgaGVscCBkaWFsb2cncyB0b29sIGxpc3QsIHJlbmRlcmVkIGFzIEhUTUwgKHRydXN0ZWQgY29udGVudCkuICovXG4gIGhlbHA/OiB7IGJvZHk6IHN0cmluZyB9O1xuICAvKiogU3RhcnQgYSBzZXNzaW9uLCBvbmNlIHRoZSBJbWFnZSB2aWV3J3Mgdmlld3BvcnQgaXMgcmVhZHkuICovXG4gIGFjdGl2YXRlKGN0eDogVG9vbERpYWxvZ0NvbnRleHQpOiBUb29sRGlhbG9nU2Vzc2lvbiB8IFByb21pc2U8VG9vbERpYWxvZ1Nlc3Npb24+O1xuICAvKipcbiAgICogUmVuZGVyIHRoZSBkaWFsb2cgYm9keSBpbnRvIGBob3N0YDsgcmV0dXJuIGl0cyB0ZWFyZG93biAoY2FsbGVkIGJlZm9yZVxuICAgKiBgZGVhY3RpdmF0ZSgpYCkuIENhbGxlZCBhZnRlciBgYWN0aXZhdGVgIHJlc29sdmVzLCBvbmNlIHRoZSBkaWFsb2cgaGFzIHJlbmRlcmVkIGFuZFxuICAgKiBgaG9zdGAgaXMgaW4gdGhlIGRvY3VtZW50LCBzbyB0aGUgYm9keSBjYW4gbWVhc3VyZSBpdHNlbGYuXG4gICAqL1xuICBtb3VudChob3N0OiBIVE1MRWxlbWVudCwgY3R4OiBUb29sRGlhbG9nQ29udGV4dCwgc2Vzc2lvbjogVG9vbERpYWxvZ1Nlc3Npb24pOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogQW55dGhpbmcgcHJvdmlkZWQgb24ge0BsaW5rIFRPT0xCQVJfVE9PTFN9LiBBIHJ1biB0b29sIGhhcyBubyBga2luZGAuICovXG5leHBvcnQgdHlwZSBUb29sYmFyQ29udHJpYnV0aW9uID0gVG9vbGJhclRvb2xDb250cmlidXRpb24gfCBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbjtcblxuLyoqIFdoZXRoZXIgYSBjb250cmlidXRpb24gaXMgYSB7QGxpbmsgVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb259LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nVG9vbENvbnRyaWJ1dGlvbihjOiB1bmtub3duKTogYyBpcyBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbiB7XG4gIHJldHVybiAhIWMgJiYgKGMgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAnZGlhbG9nJztcbn1cblxuLyoqXG4gKiBNdWx0aS1wcm92aWRlciB0b2tlbiBmb3IgY29udHJpYnV0ZWQgdG9vbHM6IHJ1biB0b29sc1xuICogKHtAbGluayBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbn0pIGFuZCwgc2luY2UgMC42LjAsIGRpYWxvZyB0b29sc1xuICogKHtAbGluayBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbn0pLlxuICpcbiAqIERlbGliZXJhdGVseSBoYXMgbm8gYGZhY3RvcnlgOiB1bnJlZ2lzdGVyZWQgbWVhbnMgbm8gdG9vbHMsIHdoaWNoIGlzIHdoYXRcbiAqIG1ha2VzIHRoaXMgbGlicmFyeSBzaGlwcGFibGUgd2l0aG91dCB0aGUgY2xvc2VkIG1vZGVsIHBhY2thZ2VzLiBJbmplY3QgaXRcbiAqIGB7IG9wdGlvbmFsOiB0cnVlIH1gIGFuZCB0cmVhdCBudWxsIGFzIGVtcHR5LlxuICovXG5leHBvcnQgY29uc3QgVE9PTEJBUl9UT09MUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxyZWFkb25seSBUb29sYmFyQ29udHJpYnV0aW9uW10+KCdUT09MQkFSX1RPT0xTJyk7XG5cbi8qKiBTb3J0IGNvbnRyaWJ1dGVkIHRvb2xzIGludG8gZGlzcGxheSBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VG9vbENvbnRyaWJ1dGlvbnM8VCBleHRlbmRzIHsgb3JkZXI/OiBudW1iZXIgfT4odG9vbHM6IHJlYWRvbmx5IFRbXSk6IFRbXSB7XG4gIC8vIFN0YWJsZTogZXF1YWwgYG9yZGVyYCBrZWVwcyByZWdpc3RyYXRpb24gb3JkZXIsIHNvIGEgaG9zdCBjb250cm9scyB0aWVzIGJ5XG4gIC8vIHByb3ZpZGVyIG9yZGVyIHdpdGhvdXQgaGF2aW5nIHRvIGludmVudCBudW1iZXJzLlxuICByZXR1cm4gdG9vbHNcbiAgICAubWFwKCh0LCBpKSA9PiAoeyB0LCBpIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiAoYS50Lm9yZGVyID8/IDEwMCkgLSAoYi50Lm9yZGVyID8/IDEwMCkgfHwgYS5pIC0gYi5pKVxuICAgIC5tYXAoKHsgdCB9KSA9PiB0KTtcbn1cblxuLyoqIFRoZSBydW4gdG9vbHMgYSB0b29sYmFyIHNob3VsZCBhY3R1YWxseSBzaG93OiB0aG9zZSB3aXRoIGF0IGxlYXN0IG9uZSBtb2RlbC5cbiAqICBEaWFsb2cgdG9vbHMgYXJlIGxlZnQgb3V0IChzZWUge0BsaW5rIGRpYWxvZ1Rvb2xDb250cmlidXRpb25zfSkuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaWJsZVRvb2xDb250cmlidXRpb25zKFxuICB0b29sczogcmVhZG9ubHkgVG9vbGJhckNvbnRyaWJ1dGlvbltdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFRvb2xiYXJUb29sQ29udHJpYnV0aW9uW10ge1xuICBjb25zdCBydW4gPSAodG9vbHMgPz8gW10pLmZpbHRlcihcbiAgICAodCk6IHQgaXMgVG9vbGJhclRvb2xDb250cmlidXRpb24gPT5cbiAgICAgICFpc0RpYWxvZ1Rvb2xDb250cmlidXRpb24odCkgJiYgdHlwZW9mICh0IGFzIFRvb2xiYXJUb29sQ29udHJpYnV0aW9uKT8ubW9kZWxzID09PSAnZnVuY3Rpb24nLFxuICApO1xuICByZXR1cm4gc29ydFRvb2xDb250cmlidXRpb25zKHJ1bikuZmlsdGVyKCh0KSA9PiB0Lm1vZGVscygpLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIFRoZSBkaWFsb2cgdG9vbHMsIGluIGRpc3BsYXkgb3JkZXIuIEEgbWFsZm9ybWVkIG9uZSAobm8gc3RyaW5nIGBpZGAsIG5vXG4gKiBgYWN0aXZhdGVgIG9yIGBtb3VudGAgZnVuY3Rpb24pIG9yIGEgcmVwZWF0ZWQgYGlkYCBpcyBkcm9wcGVkIHdpdGggYSB3YXJuaW5nXG4gKiByYXRoZXIgdGhhbiBicmVha2luZyB0aGUgdG9vbGJhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpYWxvZ1Rvb2xDb250cmlidXRpb25zKFxuICB0b29sczogcmVhZG9ubHkgVG9vbGJhckNvbnRyaWJ1dGlvbltdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9nOiB7IHdhcm4oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB9ID0gY29uc29sZSxcbik6IFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHQgb2YgKHRvb2xzID8/IFtdKS5maWx0ZXIoaXNEaWFsb2dUb29sQ29udHJpYnV0aW9uKSkge1xuICAgIGlmICh0eXBlb2YgdC5pZCAhPT0gJ3N0cmluZycgfHwgIXQuaWQgfHwgdHlwZW9mIHQuYWN0aXZhdGUgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHQubW91bnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICAnW3Zpc3VhbGl6ZXJdIGRpYWxvZyB0b29sIGlnbm9yZWQ6IGl0IG5lZWRzIGEgc3RyaW5nIGBpZGAgYW5kIGBhY3RpdmF0ZWAgYW5kIGBtb3VudGAgZnVuY3Rpb25zLicsXG4gICAgICAgIHQsXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyh0LmlkKSkge1xuICAgICAgbG9nLndhcm4oYFt2aXN1YWxpemVyXSBkaWFsb2cgdG9vbCAnJHt0LmlkfScgaWdub3JlZDogYW5vdGhlciBkaWFsb2cgdG9vbCBhbHJlYWR5IHVzZXMgdGhhdCBpZC5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzZWVuLmFkZCh0LmlkKTtcbiAgICBvdXQucHVzaCh0KTtcbiAgfVxuICByZXR1cm4gc29ydFRvb2xDb250cmlidXRpb25zKG91dCk7XG59XG4iXX0=
@@ -7,4 +7,4 @@ import { InjectionToken } from '@angular/core';
7
7
  * the routing/fallback implementation can change without touching constructors.
8
8
  */
9
9
  export const VISUALIZER = new InjectionToken('VISUALIZER');
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBlL0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFjLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBQbG90VHlwZSwgUGxvdFR5cGVEZXNjcmlwdG9yIH0gZnJvbSAnLi9wbG90LXR5cGUnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIElXYW5kT3B0aW9ucywgSUJydXNoT3B0aW9ucywgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbENvbG9yQnkgfSBmcm9tICcuL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbEVtYmVkZGluZyxcbiAgU3BhdGlhbE1hcmtlckdlbmVzLCBTcGF0aWFsVHJhbnNjcmlwdENvdW50cyxcbn0gZnJvbSAnLi9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUGxvdE1vZGVWaWV3cG9ydCB9IGZyb20gJy4vcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIHZpc3VhbGl6YXRpb24gY29udHJhY3QuIFBsb3RseSBpcyBvbmUgaW1wbGVtZW50YXRpb247XG4gKiBPcGVuU2VhZHJhZ29uIGlzIGFub3RoZXIgKGZvciB0aGUgaW1hZ2UgcGxvdCB0eXBlKS4gVGhlIGFic3RyYWN0aW9uIHJlbmRlcnNcbiAqIGRhdGEg4oCUIGEgcmFzdGVyIGltYWdlIE9SIGEgc2NpZW50aWZpYyBwbG90IChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLFxuICogc2NhdHRlciwgbGluZSwgaXNvc3VyZmFjZSkg4oCUIGRyYXdzIHJlZ2lvbnMgb24gaXQsIGFuZCBkcml2ZXMgb24tY2FudmFzIHRvb2xzLlxuICpcbiAqIFNwbGl0IGludG8gcm9sZSBpbnRlcmZhY2VzIHNvIGEgY29uc3VtZXIgY2FuIGRlcGVuZCBvbmx5IG9uIHRoZSBzbGljZSBpdFxuICogdXNlcywgdGhlbiBjb21wb3NlZCBpbnRvIGBJVmlzdWFsaXplcmAuXG4gKlxuICogVHlwZXMgYXJlIGludGVudGlvbmFsbHkgcGVybWlzc2l2ZSAoYGFueWAgd2hlcmUgdGhlIGN1cnJlbnQgUGxvdGx5IHNlcnZpY2VcbiAqIGlzIHVudHlwZWQpIHNvIGBQbG90bHlTZXJ2aWNlYCBzYXRpc2ZpZXMgdGhlIGNvbnRyYWN0IHdpdGhvdXQgYSB0eXBpbmdcbiAqIHJld3JpdGUg4oCUIHRpZ2h0ZW5pbmcgaXMgYSBmb2xsb3ctdXAsIG5vdCBwYXJ0IG9mIHN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgdXAuXG4gKi9cblxuLyoqIFBpeGVsIHJlYWRiYWNrIHNoYXBlIHJldHVybmVkIGJ5IGBnZXREaXNwbGF5ZWRQaXhlbERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbERhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7XG59XG5cbi8qKiBJbnRlbnNpdHkgc2FtcGxlZCBhbG9uZyBhIGxpbmUgUk9JIChQbG90VHlwZS5MSU5FIG92ZXIgaW1hZ2UgZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVuc2l0eVByb2ZpbGUge1xuICAvKiogRGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUuIEluIG1pY3JvbnMgd2hlbiB0aGUgaW1hZ2UgY2FycmllcyBhIHBoeXNpY2FsXG4gICAqICBwaXhlbCBzaXplIChtcHApOyBvdGhlcndpc2UgaW4gaW1hZ2UgcGl4ZWxzLiBTZWUge0BsaW5rIHVuaXR9LiAqL1xuICBwb3NpdGlvbnM6IG51bWJlcltdO1xuICAvKiogU2FtcGxlZCBpbnRlbnNpdHkgKGdyYXlzY2FsZSB2YWx1ZSBvciBSR0IgbHVtaW5hbmNlKS4gKi9cbiAgdmFsdWVzOiBudW1iZXJbXTtcbiAgLyoqIFVuaXQgb2Yge0BsaW5rIHBvc2l0aW9uc306ICfCtW0nIHdoZW4gc2NhbGVkIGJ5IHRoZSBpbWFnZSdzIG1wcCwgZWxzZSAncHgnLiAqL1xuICB1bml0PzogJ8K1bScgfCAncHgnO1xuICAvKiogU3RhYmxlIGlkIG9mIHRoZSBsaW5lIFJPSSB0aGlzIHByb2ZpbGUgY2FtZSBmcm9tIChtdWx0aS1saW5lIHN1cHBvcnQpLiAqL1xuICBpZD86IG51bWJlcjtcbiAgLyoqIENvbG91ciBvZiB0aGUgbGluZSBST0kg4oCUIHRoZSBpbnNldCB0cmFjZSBpcyBkcmF3biBpbiB0aGUgc2FtZSBjb2xvdXIuICovXG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8YW55PjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIGJhY2tlbmQtc3BlY2lmaWMgaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIOKAlFxuICAgKiAgdHJlYXQgaXQgYXMgb3BhcXVlIGFuZCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guICovXG4gIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogdW5rbm93biwgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICAgICBwbG90VHlwZTogUGxvdFR5cGUsIGluUGxhY2U/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyByZS1yZW5kZXI7IHRoZSBPU0QgYmFja2VuZCBuby1vcHMgaXQuIFRoZSBob3N0XG4gICAqICByZS1kcml2ZXMgYHBsb3QoKWAgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtIGluc3RlYWQuICovXG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgcmVsYXlvdXQodHJ1ZUltYWdlU2l6ZT86IG51bWJlcltdKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyAoYXhpcyByZXNldCk7IHRoZSBPU0QgYmFja2VuZCBuby1vcHMgaXQuIEdhdGVcbiAgICogIG9uIHtAbGluayBWaWV3ZXJDYXBhYmlsaXRpZXN9IGJlZm9yZSBjYWxsaW5nLiAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyAoYXV0b3NjYWxlKTsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gR2F0ZVxuICAgKiAgb24ge0BsaW5rIFZpZXdlckNhcGFiaWxpdGllc30gYmVmb3JlIGNhbGxpbmcuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBPcGVuU2VhZHJhZ29uIG9ubHkg4oCUIFBsb3RseVxuICAgKiAgbm8tb3BzIGl0IChpdCBoYXMgbm8gbmF2aWdhdG9yKS4gQXBwbGllZCB3aGVuIHRoZSB2aWV3ZXIgaXMgKHJlKWNyZWF0ZWQsIGFuZFxuICAgKiAgdG9nZ2xlZCBsaXZlIHdoZW4gb25lIGlzIGFscmVhZHkgbW91bnRlZC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikuIGBmYWxzZWAgPSBuZWFyZXN0LW5laWdoYm91ciwgc29cbiAgICogIHpvb21pbmcgcGFzdCAxOjEgc2hvd3MgY3Jpc3AgcGl4ZWwgYmxvY2tzIChwaXhlbC1sZXZlbCBpbnNwZWN0aW9uKS5cbiAgICogIE9wZW5TZWFkcmFnb24gb25seSDigJQgUGxvdGx5IG5vLW9wcyBpdC4gQXBwbGllZCBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmVcbiAgICogICh3aXRoIGEgcmVkcmF3KSB3aGVuIG9uZSBpcyBtb3VudGVkLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLiBcbiAgICpcbiAgICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgdmlld3BvcnQgaXNuJ3QgbGFpZCBvdXQgeWV0IG9yIHRoZSBiYWNrZW5kIGNhbid0XG4gICAqIHJlcG9ydCBpdCDigJQgY2FsbGVycyBzaG91bGQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGZ1bGwtaW1hZ2Ugc2NhbGUgKHRyZWF0XG4gICAqIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzIGFzIGEgZG93bnNhbXBsZSBvZiB0aGUgd2hvbGUgaW1hZ2UpLlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkO1xuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQ7XG4gIC8qKiBTZXQgdGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gT3B0aW9uYWwg4oCUIG9ubHkgdGhlIG5hcGFyaS1qcyBXZWJHUFVcbiAgICogIGJhY2tlbmQgaG9ub3JzIGl0OyBjaGFuZ2luZyBpdCByZS1sb2FkcyB0aGUgY3VycmVudCAzRCBwbG90IGF0IHRoZSBjb2Fyc2VyL2ZpbmVyIHNhbXBsaW5nLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGU/KHNjYWxlOiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIGN1cnJlbnQgbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gT3B0aW9uYWwuICovXG4gIGdldFJlc29sdXRpb25TY2FsZT8oKTogbnVtYmVyO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYCDigJQgM0Qgc2NlbmUgY29udHJvbHMgb25seSBleGlzdCBvblxuICAgKiAgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyAzRCBwbG90IHR5cGVzOyB0aGlzIG1ldGhvZCBzaWxlbnRseSBuby1vcHMgb24gT1NELiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAg4oCUIHNlZSB7QGxpbmsgc2V0U3VyZmFjZURyYWdNb2RlfS4gKi9cbiAgcmVzZXRTdXJmYWNlQ2FtZXJhKCk6IHZvaWQ7XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKiBQbG90IHR5cGVzIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIChkcml2ZXMgdGhlIFVJIHNlbGVjdG9yKS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXTtcblxuICAvKiogSW50ZW5zaXR5IGFsb25nIHRoZSBsaW5lIFJPSXM7IGVtaXRzIHRoZSBmdWxsIHNldCBhcyBhbnkgbGluZSBpcyBhZGRlZCxcbiAgICogIG1vdmVkLCBvciByZW1vdmVkIChQbG90VHlwZS5MSU5FKS4gT25lIGVudHJ5IHBlciBsaW5lIFJPSS4gKi9cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+O1xuXG4gIC8qKiBSZW5kZXIgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGNoYXJ0IGludG8gYGRpdklkYCBmcm9tIHRoZVxuICAgKiAgZ2l2ZW4gcHJvZmlsZXMgKG9uZSB0cmFjZSBwZXIgbGluZSBST0ksIGNvbG91cmVkIHRvIG1hdGNoIGl0cyBsaW5lKS5cbiAgICogIE93bmVkIGJ5IHRoZSBiYWNrZW5kIHNvIGNvbnN1bWVycyBuZXZlciByZWFjaCBhIGNoYXJ0aW5nIGxpYnJhcnkgZGlyZWN0bHkuICovXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkO1xufVxuXG4vKiogUmVnaW9uL3NoYXBlIHN0YXRlOiBDUlVELCBzZWxlY3Rpb24sIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMsIEdlb0pTT04gSS9PLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVnaW9uU3RvcmUge1xuICBzZXRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdLCBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLCBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgICAgICAgICAgZmlsbENvbG9yPzogc3RyaW5nLCBhcHBlbmQ/OiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEZyYW1ld29yay1uZXV0cmFsIGFjY2Vzc29yIOKAlCB0aGUgY2Fub25pY2FsIHdheSB0byByZWFkIGN1cnJlbnQgcmVnaW9ucy4gKi9cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXTtcbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W107XG4gIGdldFJlZ2lvblVwZGF0ZUV2ZW50KCk6IE9ic2VydmFibGU8YW55W10+O1xuXG4gIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXM6IG51bWJlcltdKTogdm9pZDtcbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICAvKiogU2VsZWN0IGEgc3BlY2lmaWMgcmVnaW9uIChieSBpZGVudGl0eSksIGhpZ2hsaWdodGluZyBpdCBvbiB3aGljaGV2ZXJcbiAgICogIGJhY2tlbmQgaXMgcmVuZGVyaW5nIOKAlCBQbG90bHkgc2V0cyBpdHMgYWN0aXZlLXNoYXBlIGhhbmRsZXMsIE9wZW5TZWFkcmFnb25cbiAgICogIGhpZ2hsaWdodHMgdGhlIFNWRyBlbGVtZW50LiBOby1vcCBpZiB0aGUgcmVnaW9uIGlzbid0IGluIHRoZSBzdG9yZS4gKi9cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZDtcbiAgZGVsZXRlQWN0aXZlU2hhcGUoKTogdm9pZDtcblxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuO1xuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZztcbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZztcbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZDtcblxuICBwbG90UHJldmlvdXNTaGFwZXMoKTogdm9pZDtcbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBhbnlbXSk6IHZvaWQ7XG4gIGdldFByZXZpb3VzU2hhcGVzKCk6IGFueVtdO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScpOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2xDb250cm9sbGVyIHtcbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZDtcbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZDtcbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQ7XG4gIC8qKiBCcnVzaCByZWdpb24gdG9vbC4gYHNpemVgIChtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIpIHNpemVzIHRoZSBwYWludGVkIGRpc2MuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQ7XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS4gKi9cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBGaW5hbGlzZSAvIGRpc2NhcmQgdGhlIGluLXByb2dyZXNzIFNBTSBwb2ludCBvYmplY3QuICovXG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkO1xuICBjbGVhclNhbVBvaW50cygpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSBJU09TVVJGQUNFIHBsb3QgdHlwZS4gT3B0aW9uYWwgYW5kIGNhcGFiaWxpdHktZ2F0ZWRcbiAqIChgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCk6IG9ubHkgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyBpc29zdXJmYWNlcyBleHBvc2VzXG4gKiBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRJc29zdXJmYWNlQ29udHJvbHMoKWAuIEtlcHQgb2ZmIHRoZSBhbHdheXMtb25cbiAqIGNvbnRyYWN0IHNvIGNvbnN1bWVycyBuZXZlciBjYWxsIGEgY29udHJvbCB0aGF0J3MgbWVhbmluZ2xlc3MgZm9yIHRoZSBjdXJyZW50XG4gKiBwbG90IHR5cGUgLyBiYWNrZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJc29zdXJmYWNlQ29udHJvbHMge1xuICAvKiogTGl2ZS11cGRhdGUgdGhlIGlzb3N1cmZhY2UgaW50ZW5zaXR5IGJhbmQgW2lzb21pbiwgaXNvbWF4XSBvdmVyIDDigJMyNTUuICovXG4gIHNldElzb1JhbmdlKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIDNEIHBsb3QgdHlwZXMgKFNVUkZBQ0UgLyBTQ0FUVEVSM0QgLyBJU09TVVJGQUNFXG4gKiBzY2VuZXMpLiBDYXBhYmlsaXR5LWdhdGVkIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZFxuICogdGhhdCByZW5kZXJzIDNEIHNjZW5lcyBleHBvc2VzIGl0LCB2aWEgYElWaXN1YWxpemVyLmdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlFxuICogdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsIGBzZXRTdXJmYWNlRHJhZ01vZGVgL2ByZXNldFN1cmZhY2VDYW1lcmFgIHNpbGVudGx5XG4gKiBuby1vcCBvbiAyRC1vbmx5IGJhY2tlbmRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdXJmYWNlM2RDb250cm9scyB7XG4gIC8qKiBTd2l0Y2ggdGhlIDNEIHNjZW5lIGludGVyYWN0aW9uIG1vZGUgKG9yYml0IC8gdHVybnRhYmxlIC8gcGFuIC8gem9vbSkuICovXG4gIHNldFN1cmZhY2VEcmFnTW9kZShtb2RlOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogUmVzZXQgdGhlIDNEIHNjZW5lIGNhbWVyYSB0byBpdHMgZGVmYXVsdCBleWUgcG9zaXRpb24uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuICAvKiogVG9nZ2xlIHRoZSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyBvbi9vZmYuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZSBuYXBhcmktanMgV2ViR1BVXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZSBiYWNrZW5kIHJlbmRlcnMgb25lIChqaXQtdWkjMTAyKS4gKi9cbiAgc2V0QXhlc1Zpc2libGU/KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgYXhlcyBnaXptbyBpcyBjdXJyZW50bHkgc2hvd24gKGZvciBpbml0aWFsaXppbmcgdGhlIHRvZ2dsZSBVSSkuIE9wdGlvbmFsLiAqL1xuICBheGVzVmlzaWJsZT8oKTogYm9vbGVhbjtcbiAgLyoqIFJlbmRlciB0aGUgc3VyZmFjZSBhcyBhIHdpcmVmcmFtZSAoZWRnZXMpIGluc3RlYWQgb2YgYSBmaWxsZWQgc3VyZmFjZS4gT3B0aW9uYWwg4oCUIG9ubHkgdGhlXG4gICAqICBuYXBhcmktanMgV2ViR1BVIHN1cmZhY2UgYmFja2VuZCBzdXBwb3J0cyBpdCAoaml0LXVpIzEwMikuICovXG4gIHNldFdpcmVmcmFtZT8ob246IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgc3VyZmFjZSBpcyBjdXJyZW50bHkgZHJhd24gYXMgYSB3aXJlZnJhbWUgKGZvciBpbml0aWFsaXppbmcgdGhlIHRvZ2dsZSBVSSkuICovXG4gIHdpcmVmcmFtZT8oKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgTElORSAoaW50ZW5zaXR5LXByb2ZpbGUpIHBsb3QgdHlwZS4gQ2FwYWJpbGl0eS1nYXRlZFxuICogbGlrZSB7QGxpbmsgSUlzb3N1cmZhY2VDb250cm9sc306IG9ubHkgYSBiYWNrZW5kIHRoYXQgcmVuZGVycyB0aGUgbGluZS1ST0kgL1xuICogaW5zZXQgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlDb250cm9scygpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Q29udHJvbHMge1xuICAvKiogQWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IHBhbGV0dGUgY29sb3VyKSBhbmQgaXRzIGluc2V0IHRyYWNlLlxuICAgKiAgUmV0dXJucyB0aGUgY3JlYXRlZCByZWdpb24gc28gdGhlIGNhbGxlciBjYW4gc2VsZWN0IGl0IG9uIHRoZSBhY3RpdmVcbiAgICogIGJhY2tlbmQsIG9yIG51bGwgaWYgbm8gaW1hZ2UgZXh0ZW50IGlzIGtub3duIHlldC4gKi9cbiAgYWRkUHJvZmlsZUxpbmUoKTogUmVnaW9uIHwgbnVsbDtcbn1cblxuLyoqIEEgY2F0ZWdvcmljYWwgY29sdW1uIHJlc29sdmVkIGZvciBjaGFydGluZzogbGFiZWxzLCBjb2RlcyBhbmQgbWFwIGNvbG91cnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxDYXRlZ29yaWNhbFZpZXcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdO1xuICAvKiogYCNycmdnYmJgIHBlciBjYXRlZ29yeSwgaW5kZXgtYWxpZ25lZCB3aXRoIHtAbGluayBjYXRlZ29yaWVzfS4gKi9cbiAgY29sb3JzOiBzdHJpbmdbXTtcbiAgLyoqIFBlci1vYnNlcnZhdGlvbiBjYXRlZ29yeSBpbmRleCwgb3IgYE5PX0NBVEVHT1JZYC4gKi9cbiAgY29kZXM6IFVpbnQxNkFycmF5O1xufVxuXG4vKipcbiAqIENvbnRyb2xzIGZvciB0aGUgU1BBVElBTF9PTUlDUyBwbG90IHR5cGU6IHdoYXQgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgYXJlXG4gKiBjb2xvdXJlZCBieSwgYW5kIGhvdyB0aGV5IGFyZSBkcmF3bi4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlXG4gKiB7QGxpbmsgSUlzb3N1cmZhY2VDb250cm9sc30g4oCUIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgcmV0dXJucyBudWxsIHVubGVzcyBhXG4gKiBob3N0IGhhcyBib3VuZCBgU1BBVElBTF9EQVRBX1BPUlRgLlxuICpcbiAqIFRoZSB2aWV3IHN0YXRlIGlzIGJhY2tlbmQtbmV1dHJhbCAoaXQgbGl2ZXMgaW4gdGhlIHNoYXJlZCBzdG9yZSwgbGlrZSB0aGVcbiAqIGNvbG9ybWFwKSwgc28gdGhlc2UgY29udHJvbHMgd29yayB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNwYXRpYWxDb250cm9scyB7XG4gIC8qKiBUaGUgZGF0YXNldCBiZWluZyB2aXN1YWxpemVkLCBvciBudWxsLiBEcml2ZXMgdGhlIGNvbHVtbi9nZW5lIHBpY2tlcnMgYW5kXG4gICAqICB0aGUgbGVnZW5kLiAqL1xuICBnZXREYXRhc2V0JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxEYXRhc2V0IHwgbnVsbD47XG4gIC8qKiBDdXJyZW50IGRpc3BsYXkgc3RhdGUgKGNvbG91ciBzb3VyY2UsIHBvaW50IHNjYWxlLCBvcGFjaXR5LCBzY2FsaW5nKS4gKi9cbiAgZ2V0Vmlld1N0YXRlJCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxWaWV3U3RhdGU+O1xuICAvKiogU3luY2hyb25vdXMgcmVhZCwgZm9yIHNlZWRpbmcgYSBjb250cm9sJ3MgaW5pdGlhbCB2YWx1ZS4gKi9cbiAgdmlld1N0YXRlKCk6IFNwYXRpYWxWaWV3U3RhdGU7XG4gIC8qKiBQYXRjaCB0aGUgZGlzcGxheSBzdGF0ZTsgdGhlIG1hcmtlcnMgcmVidWlsZCB3aXRob3V0IHJlbW91bnRpbmcgdGhlIHNjZW5lLiAqL1xuICBzZXRWaWV3U3RhdGUocGFydGlhbDogUGFydGlhbDxTcGF0aWFsVmlld1N0YXRlPik6IHZvaWQ7XG4gIC8qKiBDb2xvdXIgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4uIFJlamVjdHMgZm9yIGFuIHVua25vd24gY29sdW1uLiAqL1xuICBjb2xvckJ5Q29sdW1uKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBDb2xvdXIgYnkgYSBnZW5lOyBpdHMgdmVjdG9yIGlzIGZldGNoZWQgb24gZGVtYW5kLiAqL1xuICBjb2xvckJ5RmVhdHVyZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogQ2xlYXIgdGhlIGNvbG91ciBzb3VyY2Ug4oCUIGV2ZXJ5IG9ic2VydmF0aW9uIHJlbmRlcnMgaW4gb25lIG5ldXRyYWwgY29sb3VyLiAqL1xuICBjbGVhckNvbG9yQnkoKTogdm9pZDtcbiAgLyoqIFR5cGVhaGVhZCBvdmVyIGZlYXR1cmUgbmFtZXMsIGZvciBkYXRhc2V0cyB0b28gd2lkZSB0byBpbmxpbmUgdGhlIGxpc3QuICovXG4gIHNlYXJjaEZlYXR1cmVzKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0PzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIC8qKiBQZXItY2F0ZWdvcnkgZGlzcGxheSBjb2xvdXJzIGZvciBhIGNhdGVnb3JpY2FsIGNvbHVtbiwgaW5kZXgtYWxpZ25lZCB3aXRoXG4gICAqICBpdHMgYGNhdGVnb3JpZXNgIOKAlCB0aGUgbGVnZW5kJ3Mgc3dhdGNoZXMsIHJlc29sdmVkIHRoZSBzYW1lIHdheSB0aGVcbiAgICogIHJlbmRlcmVyIHJlc29sdmVzIHRoZW0gc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUuICovXG4gIGNhdGVnb3J5Q29sb3JzKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+O1xuXG4gIC8vIOKUgOKUgCB2YWx1ZXMsIGZvciB0aGUgMS1EIGNoYXJ0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZXMgYmVoaW5kIGEgY29sb3VyIHNvdXJjZSwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBvYnNlcnZhdGlvbnMuXG4gICAqIFJlamVjdHMgZm9yIGEgY2F0ZWdvcmljYWwgY29sdW1uIOKAlCB0aGVyZSBpcyBub3RoaW5nIGNvbnRpbnVvdXMgdG8gY2hhcnQuXG4gICAqL1xuICBjb250aW51b3VzVmFsdWVzKHNvdXJjZTogU3BhdGlhbENvbG9yQnkpOiBQcm9taXNlPEZsb2F0MzJBcnJheT47XG4gIC8qKlxuICAgKiBBIGNhdGVnb3JpY2FsIGNvbHVtbidzIGNhdGVnb3JpZXMsIHBlci1vYnNlcnZhdGlvbiBjb2RlcyBhbmQgZGlzcGxheVxuICAgKiBjb2xvdXJzIOKAlCBldmVyeXRoaW5nIGEgZ3JvdXBlZCB2aW9saW4vYm94IG5lZWRzLCB3aXRoIHRoZSBjb2xvdXJzIHJlc29sdmVkXG4gICAqIHRoZSBzYW1lIHdheSB0aGUgbWFwIHJlc29sdmVzIHRoZW0uXG4gICAqL1xuICBjYXRlZ29yaWNhbFZpZXcoY29sdW1uOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxDYXRlZ29yaWNhbFZpZXc+O1xuXG4gIC8qKlxuICAgKiBPbmUgZW1iZWRkaW5nJ3MgY29vcmRpbmF0ZXMg4oCUIGEgVU1BUCwgdC1TTkUgb3IgUENBIHBsYW5lIG92ZXIgdGhlIHNhbWUgb2JzZXJ2YXRpb25zLlxuICAgKlxuICAgKiBPcHRpb25hbCwgYW5kIGFic2VudCB3aGVuIHRoZSBkYXRhIHNvdXJjZSBzZXJ2ZXMgbm9uZTogYFNwYXRpYWxEYXRhUG9ydC5nZXRFbWJlZGRpbmdgXG4gICAqIGlzIGl0c2VsZiBvcHRpb25hbCwgc28gYSBwYW5lbCBtdXN0IGJlIGFibGUgdG8gYXNrIHdoZXRoZXIgdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAgICogY2FsbGluZyBpdCBhbmQgY2F0Y2hpbmcuXG4gICAqL1xuICBnZXRFbWJlZGRpbmc/KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz47XG4gIC8qKiBOYW1lcyBvZiB0aGUgY2F0ZWdvcmljYWwgY29sdW1ucyBhdmFpbGFibGUgdG8gZ3JvdXAgYnkuICovXG4gIGNhdGVnb3JpY2FsQ29sdW1ucygpOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEltcG9ydCBhIGNlbGwgZ3JvdXBpbmcgKENTVi9UU1Ygb2YgYGNlbGxfaWRgLCBgZ3JvdXBgKSBhcyBhIG5ldyBjYXRlZ29yaWNhbCBjb2x1bW4uXG4gICAqIE9wdGlvbmFsOiBvbmx5IGRhdGEgc291cmNlcyB0aGF0IGNhbiBqb2luIGNlbGwgaWRzIGltcGxlbWVudCBpdC5cbiAgICovXG4gIGltcG9ydEdyb3Vwcz8obGFiZWw6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8eyBjb2x1bW46IENhdGVnb3JpY2FsQ29sdW1uTWV0YTsgbWF0Y2hlZDogbnVtYmVyIH0+O1xuICAvKiogVHJhbnNjcmlwdCB0b3RhbHMgcGVyIGdlbmUg4oCUIGZvciB0aGUgcG9pbnRzIGVzdGltYXRlLiBPcHRpb25hbC4gKi9cbiAgdHJhbnNjcmlwdENvdW50cz8oZ2VuZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdENvdW50cz47XG4gIC8qKiBNYXJrZXIgZ2VuZXMgb2YgZWFjaCBncm91cCBvZiBhIGNhdGVnb3JpY2FsIGNvbHVtbi4gT3B0aW9uYWwgKHNlZSB0aGUgcG9ydCkuICovXG4gIG1hcmtlckdlbmVzPyhjb2x1bW46IHN0cmluZywgcGVyR3JvdXA/OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxNYXJrZXJHZW5lcz47XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW4gdGhlIGN1cnJlbnQgdmlldywgb3IgbnVsbCB3aGVuIG5vdCBrbm93blxuICAgKiAgKGFsbCBnZW5lcyBhdCBvbmNlLCB0cmFuc2NyaXB0cyBvZmYsIG9yIGEgc2VsZWN0aW9uIHpvb21lZCBvdXQgb24gYSBkYXRhc2V0IHdpdGhvdXQgdGhlXG4gICAqICBweXJhbWlkJ3MgcGVyLWdlbmUgbGV2ZWxzLCB3aGVyZSBjbHVzdGVycyBhcmUgZHJhd24gZnJvbSBzdW1tZWQgZGVuc2l0eSBncmlkcykuICovXG4gIGdldEdlbmVDb3VudHNJblZpZXckPygpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPjtcbiAgLyoqIEVzdGltYXRlZCB0cmFuc2NyaXB0cyBpbiB2aWV3IGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFnYWluc3QgdGhlIG1hcmtlciBidWRnZXQuICovXG4gIGdldFRyYW5zY3JpcHRFc3RpbWF0ZSQ/KCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+O1xuICAvKiogVGhlIGRlbnNpdHkgbWFwJ3MgY29sb3VyIHdpbmRvdyBpbiB1c2UgKGF1dG8tZGVyaXZlZCBvciBzZXQpIGFuZCBpdHMgZGVuc2VzdCBiaW4uICovXG4gIGdldERlbnNpdHlTdGF0cyQ/KCk6IE9ic2VydmFibGU8eyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD47XG4gIC8qKlxuICAgKiBUaGUgeiBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb25zIHRoZSBkYXRhc2V0IHdhcyBpbWFnZWQgYXQsIGFzY2VuZGluZyDigJQgb3JcbiAgICogbnVsbCB3aGVuIGl0cyB6IGlzIGNvbnRpbnVvdXMgcmF0aGVyIHRoYW4gc2VjdGlvbmVkIChzbyB0aGVyZSBhcmUgbm8gc2VjdGlvbnNcbiAgICogdG8gb2ZmZXIpIG9yIHdoZW4gdGhlcmUgaXMgbm8gZGF0YXNldC5cbiAgICpcbiAgICogTGV0cyBhIHBhbmVsIG9mZmVyIFwib25lIHNlY3Rpb24gYXQgYSB0aW1lXCIgZm9yIHRoZSAzRCBjbG91ZCBvbmx5IHdoZXJlIHRoYXRcbiAgICogbWVhbnMgc29tZXRoaW5nLCBhbmQgbGFiZWwgdGhlIGNob3NlbiBvbmUuIFNjYW5uZWQgb25jZSBwZXIgZGF0YXNldC5cbiAgICovXG4gIHNhbXBsZWRTZWN0aW9ucygpOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xuXG4gIC8vIOKUgOKUgCBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBUaGUgY3VycmVudCBzZWxlY3Rpb24uIEVtcHR5IG1lYW5zIFwibm90aGluZyBzZWxlY3RlZFwiLCBpbiB3aGljaCBjYXNlIHRoZVxuICAgKiAgd2hvbGUgdGlzc3VlIHJlbmRlcnMgbm9ybWFsbHkgcmF0aGVyIHRoYW4gZXZlcnl0aGluZyBiZWluZyBtdXRlZC4gKi9cbiAgZ2V0U2VsZWN0aW9uJCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxTZWxlY3Rpb25NYXNrPjtcbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbnNpZGUgdGhlIGN1cnJlbnRseS1kcmF3biByZWdpb25zICh0aGVpciB1bmlvbikuXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgUk9JIHRvb2xzIOKAlCByZWN0YW5nbGUsIHBvbHlnb24sIGZyZWVoYW5kLCB3YW5kLCBicnVzaCDigJRcbiAgICogc28gdGhlcmUgaXMgbm8gc2VwYXJhdGUgbWFycXVlZSB0byBsZWFybi4gUmV0dXJucyBob3cgbWFueSB3ZXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgc2VsZWN0RnJvbVJlZ2lvbnMoKTogbnVtYmVyO1xuICAvKiogU2VsZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIGluIG9uZSBjYXRlZ29yeSBvZiBhIGNhdGVnb3JpY2FsIGNvbHVtbiDigJQgdGhlXG4gICAqICBsZWdlbmQgY2xpY2suIFJlamVjdHMgZm9yIGFuIHVua25vd24gb3IgY29udGludW91cyBjb2x1bW4uICovXG4gIHNlbGVjdENhdGVnb3J5KGNvbHVtbjogc3RyaW5nLCBjYXRlZ29yeUluZGV4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBleHBsaWNpdCBzZXQgb2Ygb2JzZXJ2YXRpb25zLCByZXBsYWNpbmcgYW55IGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgKlxuICAgKiBGb3IgYSBsaW5rZWQgcGxvdDogbGFzc29pbmcgcG9pbnRzIGluIGFuIGVtYmVkZGluZyBpcyBhIHNlbGVjdGlvbiBPRiBvYnNlcnZhdGlvbnMsXG4gICAqIGFuZCBldmVyeSBvdGhlciB2aWV3IOKAlCB0aGUgbWFwLCB0aGUgZGlzdHJpYnV0aW9ucyDigJQgcmVhZHMgdGhlIHNhbWUgbWFzaywgc28gYnJ1c2hpbmdcbiAgICogb25lIGxpZ2h0cyB1cCB0aGUgcmVzdC4gUmV0dXJucyBob3cgbWFueSB3ZXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgc2VsZWN0SW5kaWNlcyhpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+KTogbnVtYmVyO1xuICBjbGVhclNlbGVjdGlvbigpOiB2b2lkO1xufVxuXG4vKiogRGlzcGxheSBvcHRpb25zIChjb2xvcm1hcC9MVVQsIHJldmVyc2Ugc2NhbGUsIGltYWdlIG1ldGFkYXRhKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlPcHRpb25zIHtcbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPjtcbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IENvbG9ybWFwTm9kZSk6IHZvaWQ7XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXTtcbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNjYWxlOiBhbnkpOiB2b2lkO1xuICBzZXRJbWFnZU1ldGEoaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdKTogdm9pZDtcbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT47XG59XG5cbi8qKlxuICogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcgKFBsb3RUeXBlLkxJTkUpLiBUaGUgc2FtcGxpbmcgKnNvdXJjZSogbGl2ZXMgaW4gdGhlXG4gKiBQbG90bHkgYmFja2VuZCAoaXQgb3ducyBwaXhlbCByZWFkYmFjayk7IE9wZW5TZWFkcmFnb24gY29udHJpYnV0ZXMgb25seSB0aGVcbiAqIHZpZXdwb3J0LWNoYW5nZSBzaWduYWwgdGhhdCBkcml2ZXMgcmUtc2FtcGxpbmcgYXQgdGhlIGN1cnJlbnQgem9vbS4gRWFjaFxuICogYmFja2VuZCBpbXBsZW1lbnRzIHRoZSBwYXJ0IGl0IG93bnMgYW5kIG5vLW9wcyB0aGUgcmVzdCDigJQgbWlycm9yaW5nIHRoZVxuICogZGVwcmVjYXRlZCBuby1vcCBwYXR0ZXJuIG9uIHtAbGluayBJRGF0YVJlbmRlcmVyfSDigJQgc28gdGhlIGNvbnRyYWN0IGlzIHVuaWZvcm1cbiAqIGFuZCBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb24gYElWaXN1YWxpemVyYCBhbG9uZSAobm8gY29uY3JldGUtdHlwZSByZWFjaC1pbikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgLyoqIFBvcHVsYXRlIHRoZSBpbnRlbnNpdHktc2FtcGxpbmcgY2FjaGUgZm9yIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlIHNvIHRoZVxuICAgKiAgbGluZS1ST0kgcHJvZmlsZXMgaGF2ZSBwaXhlbCBkYXRhLiBSZWFsIG9uIFBsb3RseTsgbm8tb3Agb24gT1NELiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlLXNhbXBsZSB0aGUgcHJvZmlsZXMgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGdpdmVuIGltYWdlLXBpeGVsIFJPSSBhdFxuICAgKiAgZGlzcGxheSByZXNvbHV0aW9uLiBSZWFsIG9uIFBsb3RseTsgbm8tb3Agb24gT1NELiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBudW1iZXIpOiB2b2lkO1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiBSZWFsIG9uIE9TRDsgZW1wdHkgb24gUGxvdGx5XG4gICAqICAoaXRzIGhpZ2gtZGVmIHpvb20gdXBkYXRlcyB0aGUgc2FtcGxpbmcgY2FjaGUgaW5saW5lIGluc3RlYWQpLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqIENvbXBvc2l0ZSBjb250cmFjdCBhIHZpc3VhbGl6YXRpb24gYmFja2VuZCBpbXBsZW1lbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplciBleHRlbmRzIElEYXRhUmVuZGVyZXIsIElSZWdpb25TdG9yZSwgSVRvb2xDb250cm9sbGVyLCBJRGlzcGxheU9wdGlvbnMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzO1xuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyLiBNYXkgYmUgbnVsbCB1bnRpbCBhIHBsb3QgaXMgbW91bnRlZFxuICAgKiAgKE9wZW5TZWFkcmFnb24pLiBEcml2ZXMgcmVnaW9uIGRyYXcvc2VsZWN0IG1vZGVzIHVuaWZvcm1seS4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGw7XG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIHdoZW4gdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWAsXG4gICAqICBlbHNlIG51bGwg4oCUIHNvIGNvbnN1bWVycyBnYXRlIG9uIHRoZSByZXR1cm5lZCBvYmplY3QsIG5vdCBhIG5vLW9wIG1ldGhvZC4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsO1xuICAvKiogSW50ZW5zaXR5IChsaW5lLVJPSSkgY29udHJvbHMgd2hlbiB0aGUgYmFja2VuZCByZW5kZXJzIHRoZSBMSU5FIHBsb3QgdHlwZSxcbiAgICogIGVsc2UgbnVsbC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIDNEIHNjZW5lIGNvbnRyb2xzIHdoZW4gdGhpcyBiYWNrZW5kIHJlbmRlcnMgM0QgcGxvdCB0eXBlcywgZWxzZSBudWxsIOKAlFxuICAgKiAgdGhlIGNhcGFiaWxpdHktZ2F0ZWQgcmVwbGFjZW1lbnQgZm9yIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbFxuICAgKiAgYHNldFN1cmZhY2VEcmFnTW9kZWAvYHJlc2V0U3VyZmFjZUNhbWVyYWAuICovXG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGw7XG4gIC8qKiBTcGF0aWFsLW9taWNzIGNvbnRyb2xzIHdoZW4gYSBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLCBlbHNlIG51bGwuXG4gICAqICBPcHRpb25hbDogb25seSB0aGUgcm91dGluZyBzZXJ2aWNlIGltcGxlbWVudHMgaXQsIHNpbmNlIHRoZSBzdGF0ZSBpcyBzaGFyZWRcbiAgICogIHJhdGhlciB0aGFuIG93bmVkIGJ5IGFueSBvbmUgYmFja2VuZC4gKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzPygpOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSB2aWV3cG9ydCBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZSBkcmF3cyBvdmVyLCB3aGVuIHRoZSBiYWNrZW5kIG9uXG4gICAqICBzY3JlZW4gY2FuIHByb3ZpZGUgb25lIChPcGVuU2VhZHJhZ29uKSwgZWxzZSBudWxsLiBPcHRpb25hbDogYmFja2VuZHMgdGhhdFxuICAgKiAgbm8gY29udHJpYnV0ZWQgbW9kZSByaWRlcyBvbiBuZWVkIG5vdCBpbXBsZW1lbnQgaXQuICovXG4gIGdldFBsb3RNb2RlVmlld3BvcnQ/KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsO1xuICAvKiogQmlubmVkIGludGVuc2l0eSBoaXN0b2dyYW0gZm9yIGEgY2hhbm5lbCBmcm9tIHRoZSBjdXJyZW50bHktZGlzcGxheWVkXG4gICAqICBwaXhlbHMsIG9yIG51bGwgd2hlbiBub25lIGFyZSBhdmFpbGFibGUuIEZlZWRzIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbVxuICAgKiAgcGFuZS4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbDtcbiAgLyoqIEFzeW5jIGhpc3RvZ3JhbSBzdHJlYW0g4oCUIG5hdGl2ZSBiaXQgZGVwdGggZm9yID44LWJpdCBpbWFnZXMgKHNlcnZlciksIGVsc2VcbiAgICogIHRoZSA4LWJpdCBjbGllbnQgaGlzdG9ncmFtLiAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPjtcbiAgLyoqIEV4cG9ydCB0aGUgZGlzcGxheWVkIGltYWdlLCBjb21wb3NpdGVkIHdpdGggdGhlIGN1cnJlbnQgZGlzcGxheSBzZXR0aW5ncyxcbiAgICogIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGRvd25sb2FkLiAqL1xuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZDtcbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRlxuICAgKiAgKG5hdGl2ZSBiaXQgZGVwdGgpLiBOby1vcCBvbiBiYWNrZW5kcyB0aGF0IGNhbid0IHByb3ZpZGUgaXQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZDtcbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBESSB0b2tlbiBmb3IgdGhlIGFjdGl2ZSB2aXN1YWxpemF0aW9uIGJhY2tlbmQuIEJpbmQgaXQgKGB1c2VFeGlzdGluZ2ApIHRvIHRoZVxuICogYFJvdXRpbmdWaXN1YWxpemVyU2VydmljZWAsIHdoaWNoIHNlbGVjdHMgUGxvdGx5IHZzIE9wZW5TZWFkcmFnb24gcGVyIHBsb3RcbiAqIHR5cGUuIENvbnN1bWVycyDigJQgaW5jbHVkaW5nIHRoaXMgbGlicmFyeSdzIG93biBgVmlzdWFsaXplckNvbXBvbmVudGAg4oCUXG4gKiBpbmplY3QgYElWaXN1YWxpemVyYCB0aHJvdWdoIHRoaXMgdG9rZW4gcmF0aGVyIHRoYW4gdGhlIGNvbmNyZXRlIHJvdXRlciwgc29cbiAqIHRoZSByb3V0aW5nL2ZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGNhbiBjaGFuZ2Ugd2l0aG91dCB0b3VjaGluZyBjb25zdHJ1Y3RvcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBWSVNVQUxJWkVSID0gbmV3IEluamVjdGlvblRva2VuPElWaXN1YWxpemVyPignVklTVUFMSVpFUicpO1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQThxQi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBYyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4vcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ2FudmFzVG9vbE9wdGlvbnMsXG4gIENvbG9ybWFwTm9kZSxcbiAgSVdhbmRPcHRpb25zLFxuICBJQnJ1c2hPcHRpb25zLFxuICBTcGF0aWFsVmlld1N0YXRlLFxuICBTcGF0aWFsQ29sb3JCeSxcbn0gZnJvbSAnLi9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxufSBmcm9tICcuL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlVmlld3BvcnQgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCB2aXN1YWxpemF0aW9uIGNvbnRyYWN0LiBQbG90bHkgaXMgb25lIGltcGxlbWVudGF0aW9uO1xuICogT3BlblNlYWRyYWdvbiBpcyBhbm90aGVyIChmb3IgdGhlIGltYWdlIHBsb3QgdHlwZSkuIFRoZSBhYnN0cmFjdGlvbiByZW5kZXJzXG4gKiBkYXRhIOKAlCBhIHJhc3RlciBpbWFnZSBPUiBhIHNjaWVudGlmaWMgcGxvdCAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91cixcbiAqIHNjYXR0ZXIsIGxpbmUsIGlzb3N1cmZhY2UpIOKAlCBkcmF3cyByZWdpb25zIG9uIGl0LCBhbmQgZHJpdmVzIG9uLWNhbnZhcyB0b29scy5cbiAqXG4gKiBTcGxpdCBpbnRvIHJvbGUgaW50ZXJmYWNlcyBzbyBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb25seSBvbiB0aGUgc2xpY2UgaXRcbiAqIHVzZXMsIHRoZW4gY29tcG9zZWQgaW50byBgSVZpc3VhbGl6ZXJgLlxuICovXG5cbi8qKiBQaXhlbCByZWFkYmFjayBzaGFwZSByZXR1cm5lZCBieSBgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxEYXRhIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG4vKiogSW50ZW5zaXR5IHNhbXBsZWQgYWxvbmcgYSBsaW5lIFJPSSAoUGxvdFR5cGUuTElORSBvdmVyIGltYWdlIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbnNpdHlQcm9maWxlIHtcbiAgLyoqIERpc3RhbmNlIGFsb25nIHRoZSBsaW5lLiBJbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbFxuICAgKiAgcGl4ZWwgc2l6ZSAobXBwKTsgb3RoZXJ3aXNlIGluIGltYWdlIHBpeGVscy4gU2VlIHtAbGluayB1bml0fS4gKi9cbiAgcG9zaXRpb25zOiBudW1iZXJbXTtcbiAgLyoqIFNhbXBsZWQgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSkuICovXG4gIHZhbHVlczogbnVtYmVyW107XG4gIC8qKiBVbml0IG9mIHtAbGluayBwb3NpdGlvbnN9OiAnwrVtJyB3aGVuIHNjYWxlZCBieSB0aGUgaW1hZ2UncyBtcHAsIGVsc2UgJ3B4Jy4gKi9cbiAgdW5pdD86ICfCtW0nIHwgJ3B4JztcbiAgLyoqIFN0YWJsZSBpZCBvZiB0aGUgbGluZSBST0kgdGhpcyBwcm9maWxlIGNhbWUgZnJvbSAobXVsdGktbGluZSBzdXBwb3J0KS4gKi9cbiAgaWQ/OiBudW1iZXI7XG4gIC8qKiBDb2xvdXIgb2YgdGhlIGxpbmUgUk9JIOKAlCB0aGUgaW5zZXQgdHJhY2UgaXMgZHJhd24gaW4gdGhlIHNhbWUgY29sb3VyLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBJRGF0YVJlbmRlcmVyLmxvYWQoKWAgcmVzb2x2ZXMgdG8uIEJhY2tlbmQtc3BlY2lmaWMgYmV5b25kIGBmaWxlbmFtZWAsXG4gKiB3aGljaCBuYW1lcyB0aGUgaW1hZ2UgdGhlIGhhbmRsZSB3YXMgbG9hZGVkIGZvcjogdGhlIGhvc3QgY29tcGFyZXMgaXQgd2l0aCB0aGVcbiAqIGltYWdlIGl0IGFza2VkIGZvciwgdG8gZHJvcCBhIGhhbmRsZSBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gUGFzcyB0aGVcbiAqIGhhbmRsZSBvbiB0byBgcGxvdCgpYCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkSW1hZ2Uge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIC8qKiBGZXRjaCB3aGF0IHtAbGluayBwbG90fSBuZWVkcyBmb3IgdGhpcyBpbWFnZS9zbGljZS4gYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlXG4gICAqICBob3N0IG5vIGxvbmdlciB3YW50cyB0aGUgcmVzdWx0IChhIG5ld2VyIGltYWdlLCBDYW5jZWwsIHRlYXJkb3duKTsgYSBiYWNrZW5kXG4gICAqICBtYXkgc3RvcCBpdHMgbmV0d29yayB3b3JrIHRoZW4uIE9wdGlvbmFsLCBhbmQgaWdub3JlZCBieSBiYWNrZW5kcyB0aGF0IGRvXG4gICAqICBub3Qgc3VwcG9ydCBpdCB5ZXQuICovXG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIHtAbGluayBMb2FkZWRJbWFnZX0gaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIChvciBudWxsXG4gICAqICBmb3IgYSBkcmF3IHdpdGggbm8gaW1hZ2UpIOKAlCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIGNvdWxkIG5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCDigKYpLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIHJlLXJlbmRlcjsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gVGhlIGhvc3RcbiAgICogIHJlLWRyaXZlcyBgcGxvdCgpYCBmcm9tIGl0cyBpbWFnZSBzdHJlYW0gaW5zdGVhZC4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKipcbiAgICogRml0IHRoZSB3aG9sZSBpbWFnZSAob3Igc2NlbmUpIGludG8gdGhlIHZpZXcg4oCUIGV2ZXJ5IGJhY2tlbmQgZG9lczogUGxvdGx5XG4gICAqIGF1dG9yYW5nZXMgaXRzIGF4ZXMsIE9wZW5TZWFkcmFnb24gZ29lcyBob21lLCBuYXBhcmktanMgZml0cyBpdHMgY2FtZXJhLiBUaGVcbiAgICogYmFja2VuZCB0aGVuIGVtaXRzIG9uIHtAbGluayBnZXRBdXRvc2NhbGVFdmVudH0uXG4gICAqL1xuICBmaXRUb1ZpZXcoKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSB2aWV3IHRvIHRoZSBpbWFnZSBleHRlbnQuIFNhbWUgaW50ZW50IGFzIHtAbGluayBmaXRUb1ZpZXd9OyBrZXB0IGZvclxuICAgKiAgY2FsbGVycyBvZiB0aGUgb3JpZ2luYWwgbmFtZS4gKi9cbiAgcmVzZXRBeGVzKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30g4oCUIHRoZSBzYW1lIG9wZXJhdGlvbiB1bmRlciBpdHMgYmFja2VuZC1uZXV0cmFsIG5hbWUuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLlxuICAgKlxuICAgKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSB2aWV3cG9ydCBpc24ndCBsYWlkIG91dCB5ZXQgb3IgdGhlIGJhY2tlbmQgY2FuJ3RcbiAgICogcmVwb3J0IGl0IOKAlCBjYWxsZXJzIHNob3VsZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgZnVsbC1pbWFnZSBzY2FsZSAodHJlYXRcbiAgICogdGhlIGRpc3BsYXllZCBwaXhlbHMgYXMgYSBkb3duc2FtcGxlIG9mIHRoZSB3aG9sZSBpbWFnZSkuXG4gICAqL1xuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAgb24gYElWaXN1YWxpemVyYC4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlPyhzY2FsZTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAgb24gYElWaXN1YWxpemVyYCAodGhpcyByZXR1cm5zIDEgd2l0aG91dCBvbmUpLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGU/KCk6IG51bWJlcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKClgIOKAlCAzRCBzY2VuZSBjb250cm9sc1xuICAgKiAgb25seSBleGlzdCBvbiBhIGJhY2tlbmQgdGhhdCByZW5kZXJzIDNEIHBsb3QgdHlwZXM7IHRoaXMgc2lsZW50bHkgbm8tb3BzIG9uIE9TRC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlCBzZWUge0BsaW5rIHNldFN1cmZhY2VEcmFnTW9kZX0uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3ICh7QGxpbmsgZml0VG9WaWV3fSkuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdO1xuXG4gIC8qKiBJbnRlbnNpdHkgYWxvbmcgdGhlIGxpbmUgUk9JczsgZW1pdHMgdGhlIGZ1bGwgc2V0IGFzIGFueSBsaW5lIGlzIGFkZGVkLFxuICAgKiAgbW92ZWQsIG9yIHJlbW92ZWQgKFBsb3RUeXBlLkxJTkUpLiBPbmUgZW50cnkgcGVyIGxpbmUgUk9JLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT47XG5cbiAgLyoqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIGZyb20gdGhlXG4gICAqICBnaXZlbiBwcm9maWxlcyAob25lIHRyYWNlIHBlciBsaW5lIFJPSSwgY29sb3VyZWQgdG8gbWF0Y2ggaXRzIGxpbmUpLlxuICAgKiAgT3duZWQgYnkgdGhlIGJhY2tlbmQgc28gY29uc3VtZXJzIG5ldmVyIHJlYWNoIGEgY2hhcnRpbmcgbGlicmFyeSBkaXJlY3RseS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQ6IHN0cmluZywgcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQ7XG59XG5cbi8qKiBSZWdpb24vc2hhcGUgc3RhdGU6IENSVUQsIHNlbGVjdGlvbiwgY2xhc3NpZmljYXRpb24gY29sb3VycywgR2VvSlNPTiBJL08uICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpb25TdG9yZSB7XG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG4gIC8qKiBGcmFtZXdvcmstbmV1dHJhbCBhY2Nlc3NvciDigJQgdGhlIGNhbm9uaWNhbCB3YXkgdG8gcmVhZCBjdXJyZW50IHJlZ2lvbnMuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW107XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChyZWN0YW5nbGVzIGV4cGFuZGVkKSwgZm9yIHNlcnZlciByZXF1ZXN0cy4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xuICAvKiogRW1pdHMgdGhlIHJlZ2lvbiBzZXQgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT47XG5cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIC8qKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKGJ5IGlkZW50aXR5KSwgaGlnaGxpZ2h0aW5nIGl0IG9uIHdoaWNoZXZlclxuICAgKiAgYmFja2VuZCBpcyByZW5kZXJpbmcg4oCUIFBsb3RseSBzZXRzIGl0cyBhY3RpdmUtc2hhcGUgaGFuZGxlcywgT3BlblNlYWRyYWdvblxuICAgKiAgaGlnaGxpZ2h0cyB0aGUgU1ZHIGVsZW1lbnQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkO1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkO1xuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW47XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nO1xuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nO1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0gcG9pbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQXJtIG9uZSBvbi1jYW52YXMgdG9vbCAoYENhbnZhc1Rvb2xJZGApIHdpdGggaXRzIG9wdGlvbnMg4oCUIHRoZSB3YW5kJ3NcbiAgICoge0BsaW5rIElXYW5kT3B0aW9uc30sIHRoZSBicnVzaCdzIHtAbGluayBJQnJ1c2hPcHRpb25zfSAoYHNpemVgIGlzIHRoZVxuICAgKiBtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIgb2YgdGhlIHBhaW50ZWQgZGlzYyksIHRoZSBlcmFzZXIncyBgeyByYWRpdXMgfWAg4oCUXG4gICAqIGFuZCBkaXNhcm0gdGhlIG9uZSB0aGF0IHdhcyBhcm1lZC4gYG51bGxgLCBvciBhbnkgaWQgdGhhdCBpcyBub3QgYSBjYW52YXNcbiAgICogdG9vbCAoYSByZWdpb24gZHJhdyBtb2RlIHN1Y2ggYXMgYCdkcmF3cmVjdCdgLCBgJ3BhbidgKSwgZGlzYXJtcyBvbmx5LlxuICAgKiBBcm1pbmcgdGhlIGFybWVkIHRvb2wgYWdhaW4gYXBwbGllcyB0aGUgb3B0aW9ucyBhbmQga2VlcHMgaXRzIHdvcmsgaW5cbiAgICogcHJvZ3Jlc3MuXG4gICAqL1xuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd3YW5kJywgb3B0aW9ucylgIC8gYHNldEFjdGl2ZVRvb2wobnVsbClgLiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnYnJ1c2gnLCBvcHRpb25zKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCdlcmFzZVZlcnRleCcsIHsgcmFkaXVzIH0pYCAvIGBzZXRBY3RpdmVUb29sKG51bGwpYC4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd6b29tVG9Cb3gnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS5cbiAgICogIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnc2FtUG9pbnQnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogRmluYWxpc2UgLyBkaXNjYXJkIHRoZSBpbi1wcm9ncmVzcyBTQU0gcG9pbnQgb2JqZWN0LiAqL1xuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZDtcbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgSVNPU1VSRkFDRSBwbG90IHR5cGUuIE9wdGlvbmFsIGFuZCBjYXBhYmlsaXR5LWdhdGVkXG4gKiAoYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWApOiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgaXNvc3VyZmFjZXMgZXhwb3Nlc1xuICogaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKClgLiBLZXB0IG9mZiB0aGUgYWx3YXlzLW9uXG4gKiBjb250cmFjdCBzbyBjb25zdW1lcnMgbmV2ZXIgY2FsbCBhIGNvbnRyb2wgdGhhdCdzIG1lYW5pbmdsZXNzIGZvciB0aGUgY3VycmVudFxuICogcGxvdCB0eXBlIC8gYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXNvc3VyZmFjZUNvbnRyb2xzIHtcbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGludGVuc2l0eSBiYW5kIFtpc29taW4sIGlzb21heF0gb3ZlciAw4oCTMjU1LiAqL1xuICBzZXRJc29SYW5nZShpc29NaW46IG51bWJlciwgaXNvTWF4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSAzRCBwbG90IHR5cGVzIChTVVJGQUNFIC8gU0NBVFRFUjNEIC8gSVNPU1VSRkFDRVxuICogc2NlbmVzKS4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfTogb25seSBhIGJhY2tlbmRcbiAqIHRoYXQgcmVuZGVycyAzRCBzY2VuZXMgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRTdXJmYWNlM2RDb250cm9scygpYCDigJRcbiAqIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbCBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYCBzaWxlbnRseVxuICogbm8tb3Agb24gMkQtb25seSBiYWNrZW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZmFjZTNkQ29udHJvbHMge1xuICAvKiogU3dpdGNoIHRoZSAzRCBzY2VuZSBpbnRlcmFjdGlvbiBtb2RlIChvcmJpdCAvIHR1cm50YWJsZSAvIHBhbiAvIHpvb20pLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSAzRCBzY2VuZSBjYW1lcmEgdG8gaXRzIGRlZmF1bHQgZXllIHBvc2l0aW9uLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gb24vb2ZmLiBPcHRpb25hbCDigJQgb25seSB0aGUgbmFwYXJpLWpzIFdlYkdQVVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UgYmFja2VuZCByZW5kZXJzIG9uZSAoaml0LXVpIzEwMikuICovXG4gIHNldEF4ZXNWaXNpYmxlPyh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGF4ZXMgZ2l6bW8gaXMgY3VycmVudGx5IHNob3duIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiBPcHRpb25hbC4gKi9cbiAgYXhlc1Zpc2libGU/KCk6IGJvb2xlYW47XG4gIC8qKiBSZW5kZXIgdGhlIHN1cmZhY2UgYXMgYSB3aXJlZnJhbWUgKGVkZ2VzKSBpbnN0ZWFkIG9mIGEgZmlsbGVkIHN1cmZhY2UuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZVxuICAgKiAgbmFwYXJpLWpzIFdlYkdQVSBzdXJmYWNlIGJhY2tlbmQgc3VwcG9ydHMgaXQgKGppdC11aSMxMDIpLiAqL1xuICBzZXRXaXJlZnJhbWU/KG9uOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgY3VycmVudGx5IGRyYXduIGFzIGEgd2lyZWZyYW1lIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiAqL1xuICB3aXJlZnJhbWU/KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIExJTkUgKGludGVuc2l0eS1wcm9maWxlKSBwbG90IHR5cGUuIENhcGFiaWxpdHktZ2F0ZWRcbiAqIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgdGhlIGxpbmUtUk9JIC9cbiAqIGluc2V0IGV4cG9zZXMgaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eUNvbnRyb2xzIHtcbiAgLyoqIEFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91cikgYW5kIGl0cyBpbnNldCB0cmFjZS5cbiAgICogIFJldHVybnMgdGhlIGNyZWF0ZWQgcmVnaW9uIHNvIHRoZSBjYWxsZXIgY2FuIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlXG4gICAqICBiYWNrZW5kLCBvciBudWxsIGlmIG5vIGltYWdlIGV4dGVudCBpcyBrbm93biB5ZXQuICovXG4gIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGw7XG59XG5cbi8qKiBBIGNhdGVnb3JpY2FsIGNvbHVtbiByZXNvbHZlZCBmb3IgY2hhcnRpbmc6IGxhYmVscywgY29kZXMgYW5kIG1hcCBjb2xvdXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqIGAjcnJnZ2JiYCBwZXIgY2F0ZWdvcnksIGluZGV4LWFsaWduZWQgd2l0aCB7QGxpbmsgY2F0ZWdvcmllc30uICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqXG4gKiBDb250cm9scyBmb3IgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlOiB3aGF0IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIGFyZVxuICogY29sb3VyZWQgYnksIGFuZCBob3cgdGhleSBhcmUgZHJhd24uIENhcGFiaWxpdHktZ2F0ZWQgbGlrZVxuICoge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9IOKAlCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHJldHVybnMgbnVsbCB1bmxlc3MgYVxuICogaG9zdCBoYXMgYm91bmQgYFNQQVRJQUxfREFUQV9QT1JUYC5cbiAqXG4gKiBUaGUgdmlldyBzdGF0ZSBpcyBiYWNrZW5kLW5ldXRyYWwgKGl0IGxpdmVzIGluIHRoZSBzaGFyZWQgc3RvcmUsIGxpa2UgdGhlXG4gKiBjb2xvcm1hcCksIHNvIHRoZXNlIGNvbnRyb2xzIHdvcmsgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTcGF0aWFsQ29udHJvbHMge1xuICAvKiogVGhlIGRhdGFzZXQgYmVpbmcgdmlzdWFsaXplZCwgb3IgbnVsbC4gRHJpdmVzIHRoZSBjb2x1bW4vZ2VuZSBwaWNrZXJzIGFuZFxuICAgKiAgdGhlIGxlZ2VuZC4gKi9cbiAgZ2V0RGF0YXNldCQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsRGF0YXNldCB8IG51bGw+O1xuICAvKiogQ3VycmVudCBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzY2FsZSwgb3BhY2l0eSwgc2NhbGluZykuICovXG4gIGdldFZpZXdTdGF0ZSQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsVmlld1N0YXRlPjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQsIGZvciBzZWVkaW5nIGEgY29udHJvbCdzIGluaXRpYWwgdmFsdWUuICovXG4gIHZpZXdTdGF0ZSgpOiBTcGF0aWFsVmlld1N0YXRlO1xuICAvKiogUGF0Y2ggdGhlIGRpc3BsYXkgc3RhdGU7IHRoZSBtYXJrZXJzIHJlYnVpbGQgd2l0aG91dCByZW1vdW50aW5nIHRoZSBzY2VuZS4gKi9cbiAgc2V0Vmlld1N0YXRlKHBhcnRpYWw6IFBhcnRpYWw8U3BhdGlhbFZpZXdTdGF0ZT4pOiB2b2lkO1xuICAvKiogQ29sb3VyIGJ5IGFuIGFubm90YXRpb24gY29sdW1uLiBSZWplY3RzIGZvciBhbiB1bmtub3duIGNvbHVtbi4gKi9cbiAgY29sb3JCeUNvbHVtbihuYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogQ29sb3VyIGJ5IGEgZ2VuZTsgaXRzIHZlY3RvciBpcyBmZXRjaGVkIG9uIGRlbWFuZC4gKi9cbiAgY29sb3JCeUZlYXR1cmUobmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIENsZWFyIHRoZSBjb2xvdXIgc291cmNlIOKAlCBldmVyeSBvYnNlcnZhdGlvbiByZW5kZXJzIGluIG9uZSBuZXV0cmFsIGNvbG91ci4gKi9cbiAgY2xlYXJDb2xvckJ5KCk6IHZvaWQ7XG4gIC8qKiBUeXBlYWhlYWQgb3ZlciBmZWF0dXJlIG5hbWVzLCBmb3IgZGF0YXNldHMgdG9vIHdpZGUgdG8gaW5saW5lIHRoZSBsaXN0LiAqL1xuICBzZWFyY2hGZWF0dXJlcyhxdWVyeTogc3RyaW5nLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+O1xuICAvKiogUGVyLWNhdGVnb3J5IGRpc3BsYXkgY29sb3VycyBmb3IgYSBjYXRlZ29yaWNhbCBjb2x1bW4sIGluZGV4LWFsaWduZWQgd2l0aFxuICAgKiAgaXRzIGBjYXRlZ29yaWVzYCDigJQgdGhlIGxlZ2VuZCdzIHN3YXRjaGVzLCByZXNvbHZlZCB0aGUgc2FtZSB3YXkgdGhlXG4gICAqICByZW5kZXJlciByZXNvbHZlcyB0aGVtIHNvIHRoZSB0d28gY2Fubm90IGRpc2FncmVlLiAqL1xuICBjYXRlZ29yeUNvbG9ycyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPjtcblxuICAvLyDilIDilIAgdmFsdWVzLCBmb3IgdGhlIDEtRCBjaGFydHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIGJlaGluZCBhIGNvbG91ciBzb3VyY2UsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgb2JzZXJ2YXRpb25zLlxuICAgKiBSZWplY3RzIGZvciBhIGNhdGVnb3JpY2FsIGNvbHVtbiDigJQgdGhlcmUgaXMgbm90aGluZyBjb250aW51b3VzIHRvIGNoYXJ0LlxuICAgKi9cbiAgY29udGludW91c1ZhbHVlcyhzb3VyY2U6IFNwYXRpYWxDb2xvckJ5KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+O1xuICAvKipcbiAgICogQSBjYXRlZ29yaWNhbCBjb2x1bW4ncyBjYXRlZ29yaWVzLCBwZXItb2JzZXJ2YXRpb24gY29kZXMgYW5kIGRpc3BsYXlcbiAgICogY29sb3VycyDigJQgZXZlcnl0aGluZyBhIGdyb3VwZWQgdmlvbGluL2JveCBuZWVkcywgd2l0aCB0aGUgY29sb3VycyByZXNvbHZlZFxuICAgKiB0aGUgc2FtZSB3YXkgdGhlIG1hcCByZXNvbHZlcyB0aGVtLlxuICAgKi9cbiAgY2F0ZWdvcmljYWxWaWV3KGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3PjtcblxuICAvKipcbiAgICogT25lIGVtYmVkZGluZydzIGNvb3JkaW5hdGVzIOKAlCBhIFVNQVAsIHQtU05FIG9yIFBDQSBwbGFuZSBvdmVyIHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAgICpcbiAgICogT3B0aW9uYWwsIGFuZCBhYnNlbnQgd2hlbiB0aGUgZGF0YSBzb3VyY2Ugc2VydmVzIG5vbmU6IGBTcGF0aWFsRGF0YVBvcnQuZ2V0RW1iZWRkaW5nYFxuICAgKiBpcyBpdHNlbGYgb3B0aW9uYWwsIHNvIGEgcGFuZWwgbXVzdCBiZSBhYmxlIHRvIGFzayB3aGV0aGVyIHRoaXMgZXhpc3RzIHJhdGhlciB0aGFuXG4gICAqIGNhbGxpbmcgaXQgYW5kIGNhdGNoaW5nLlxuICAgKi9cbiAgZ2V0RW1iZWRkaW5nPyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmc+O1xuICAvKiogTmFtZXMgb2YgdGhlIGNhdGVnb3JpY2FsIGNvbHVtbnMgYXZhaWxhYmxlIHRvIGdyb3VwIGJ5LiAqL1xuICBjYXRlZ29yaWNhbENvbHVtbnMoKTogc3RyaW5nW107XG4gIC8qKlxuICAgKiBJbXBvcnQgYSBjZWxsIGdyb3VwaW5nIChDU1YvVFNWIG9mIGBjZWxsX2lkYCwgYGdyb3VwYCkgYXMgYSBuZXcgY2F0ZWdvcmljYWwgY29sdW1uLlxuICAgKiBPcHRpb25hbDogb25seSBkYXRhIHNvdXJjZXMgdGhhdCBjYW4gam9pbiBjZWxsIGlkcyBpbXBsZW1lbnQgaXQuXG4gICAqL1xuICBpbXBvcnRHcm91cHM/KGxhYmVsOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGE7IG1hdGNoZWQ6IG51bWJlciB9PjtcbiAgLyoqIFRyYW5zY3JpcHQgdG90YWxzIHBlciBnZW5lIOKAlCBmb3IgdGhlIHBvaW50cyBlc3RpbWF0ZS4gT3B0aW9uYWwuICovXG4gIHRyYW5zY3JpcHRDb3VudHM/KGdlbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+O1xuICAvKiogTWFya2VyIGdlbmVzIG9mIGVhY2ggZ3JvdXAgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4uIE9wdGlvbmFsIChzZWUgdGhlIHBvcnQpLiAqL1xuICBtYXJrZXJHZW5lcz8oY29sdW1uOiBzdHJpbmcsIHBlckdyb3VwPzogbnVtYmVyKTogUHJvbWlzZTxTcGF0aWFsTWFya2VyR2VuZXM+O1xuICAvKiogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluIHRoZSBjdXJyZW50IHZpZXcsIG9yIG51bGwgd2hlbiBub3Qga25vd25cbiAgICogIChhbGwgZ2VuZXMgYXQgb25jZSwgdHJhbnNjcmlwdHMgb2ZmLCBvciBhIHNlbGVjdGlvbiB6b29tZWQgb3V0IG9uIGEgZGF0YXNldCB3aXRob3V0IHRoZVxuICAgKiAgcHlyYW1pZCdzIHBlci1nZW5lIGxldmVscywgd2hlcmUgY2x1c3RlcnMgYXJlIGRyYXduIGZyb20gc3VtbWVkIGRlbnNpdHkgZ3JpZHMpLiAqL1xuICBnZXRHZW5lQ291bnRzSW5WaWV3JD8oKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD47XG4gIC8qKiBFc3RpbWF0ZWQgdHJhbnNjcmlwdHMgaW4gdmlldyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhZ2FpbnN0IHRoZSBtYXJrZXIgYnVkZ2V0LiAqL1xuICBnZXRUcmFuc2NyaXB0RXN0aW1hdGUkPygpOiBPYnNlcnZhYmxlPHsgcG9pbnRzOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPjtcbiAgLyoqIFRoZSBkZW5zaXR5IG1hcCdzIGNvbG91ciB3aW5kb3cgaW4gdXNlIChhdXRvLWRlcml2ZWQgb3Igc2V0KSBhbmQgaXRzIGRlbnNlc3QgYmluLiAqL1xuICBnZXREZW5zaXR5U3RhdHMkPygpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+O1xuICAvKipcbiAgICogVGhlIHogcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyB0aGUgZGF0YXNldCB3YXMgaW1hZ2VkIGF0LCBhc2NlbmRpbmcg4oCUIG9yXG4gICAqIG51bGwgd2hlbiBpdHMgeiBpcyBjb250aW51b3VzIHJhdGhlciB0aGFuIHNlY3Rpb25lZCAoc28gdGhlcmUgYXJlIG5vIHNlY3Rpb25zXG4gICAqIHRvIG9mZmVyKSBvciB3aGVuIHRoZXJlIGlzIG5vIGRhdGFzZXQuXG4gICAqXG4gICAqIExldHMgYSBwYW5lbCBvZmZlciBcIm9uZSBzZWN0aW9uIGF0IGEgdGltZVwiIGZvciB0aGUgM0QgY2xvdWQgb25seSB3aGVyZSB0aGF0XG4gICAqIG1lYW5zIHNvbWV0aGluZywgYW5kIGxhYmVsIHRoZSBjaG9zZW4gb25lLiBTY2FubmVkIG9uY2UgcGVyIGRhdGFzZXQuXG4gICAqL1xuICBzYW1wbGVkU2VjdGlvbnMoKTogRmxvYXQzMkFycmF5IHwgbnVsbDtcblxuICAvLyDilIDilIAgc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogVGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBFbXB0eSBtZWFucyBcIm5vdGhpbmcgc2VsZWN0ZWRcIiwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICogIHdob2xlIHRpc3N1ZSByZW5kZXJzIG5vcm1hbGx5IHJhdGhlciB0aGFuIGV2ZXJ5dGhpbmcgYmVpbmcgbXV0ZWQuICovXG4gIGdldFNlbGVjdGlvbiQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsU2VsZWN0aW9uTWFzaz47XG4gIC8qKlxuICAgKiBTZWxlY3QgZXZlcnkgb2JzZXJ2YXRpb24gaW5zaWRlIHRoZSBjdXJyZW50bHktZHJhd24gcmVnaW9ucyAodGhlaXIgdW5pb24pLlxuICAgKiBSZXVzZXMgdGhlIGV4aXN0aW5nIFJPSSB0b29scyDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCwgd2FuZCwgYnJ1c2gg4oCUXG4gICAqIHNvIHRoZXJlIGlzIG5vIHNlcGFyYXRlIG1hcnF1ZWUgdG8gbGVhcm4uIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEZyb21SZWdpb25zKCk6IG51bWJlcjtcbiAgLyoqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbiBvbmUgY2F0ZWdvcnkgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZVxuICAgKiAgbGVnZW5kIGNsaWNrLiBSZWplY3RzIGZvciBhbiB1bmtub3duIG9yIGNvbnRpbnVvdXMgY29sdW1uLiAqL1xuICBzZWxlY3RDYXRlZ29yeShjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZXhwbGljaXQgc2V0IG9mIG9ic2VydmF0aW9ucywgcmVwbGFjaW5nIGFueSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRm9yIGEgbGlua2VkIHBsb3Q6IGxhc3NvaW5nIHBvaW50cyBpbiBhbiBlbWJlZGRpbmcgaXMgYSBzZWxlY3Rpb24gT0Ygb2JzZXJ2YXRpb25zLFxuICAgKiBhbmQgZXZlcnkgb3RoZXIgdmlldyDigJQgdGhlIG1hcCwgdGhlIGRpc3RyaWJ1dGlvbnMg4oCUIHJlYWRzIHRoZSBzYW1lIG1hc2ssIHNvIGJydXNoaW5nXG4gICAqIG9uZSBsaWdodHMgdXAgdGhlIHJlc3QuIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPik6IG51bWJlcjtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEuIGBpbWFnZUtleWAgKGl0cyBmaWxlIG5hbWUpIGxldHMgdGhlXG4gICAqICBjaGFubmVsIHN0YXRlIHN1cnZpdmUgYSByZS1wbG90IG9mIHRoZSBzYW1lIGltYWdlIGJ1dCBub3QgYSBzd2l0Y2ggdG8gYW5vdGhlci4gKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkO1xuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPjtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBpbnRlbnNpdHkgc2FtcGxpbmcgYSByZW5kZXJpbmcgYmFja2VuZCBvd25zOiB3aGVyZSBpdHMgdmlldyBzZXR0bGVkLlxuICogV2hhdCBgSVZpZXdlckJhY2tlbmQuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKWAgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZyAodGhlIGxpbmUgUk9JcycgaW5zZXQpLCBmcm9tIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlTYW1wbGluZygpYC5cbiAqIFRoZSBzYW1wbGluZyBpdHNlbGYgaXMgYmFja2VuZC1uZXV0cmFsICh0aGUgbGlicmFyeSdzIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlXG4gKiBzYW1wbGVzIHdoYXRldmVyIGltYWdlIGlzIG9uIHNjcmVlbik7IHRoZSB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIGNvbWVzIGZyb20gdGhlXG4gKiBiYWNrZW5kIHRoYXQgZHJhd3MgdGhlIGltYWdlIChPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmktanMgcmVwb3J0IGl0OyBQbG90bHlcbiAqIHJlLXNhbXBsZXMgaXRzIGhpZ2gtZGVmIHpvb20gY3JvcHMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyBleHRlbmRzIElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB7XG4gIC8qKiBMb2FkIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlJ3MgcGl4ZWxzIHNvIHRoZSBsaW5lLVJPSSBwcm9maWxlcyBoYXZlIGRhdGFcbiAgICogIChhIGJhY2tlbmQgd2l0aCBubyBmcmFtZXMgb2YgaXRzIG93bjogT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKS4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSAyRCB2aWV3IG9wdGlvbnMgb2YgYSB0aWxlZCBpbWFnZSB2aWV3ZXI6IHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgYW5kIGltYWdlXG4gKiBzbW9vdGhpbmcuIE9wZW5TZWFkcmFnb24ncywgbWlycm9yZWQgYnkgbmFwYXJpLWpzJ3MgMkQgdmlld3M7IFBsb3RseSBoYXMgbmVpdGhlci5cbiAqIENhcGFiaWxpdHktZ2F0ZWQ6IGBJVmlld2VyQmFja2VuZC5nZXRPc2RWaWV3T3B0aW9ucygpYCBpcyBudWxsIG9uIGEgYmFja2VuZFxuICogd2l0aG91dCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPc2RWaWV3T3B0aW9ucyB7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBBcHBsaWVkIHdoZW4gdGhlIHZpZXdlciBpc1xuICAgKiAgKHJlKWNyZWF0ZWQsIGFuZCB0b2dnbGVkIGxpdmUgd2hlbiBvbmUgaXMgYWxyZWFkeSBtb3VudGVkLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKS4gYGZhbHNlYCA9IG5lYXJlc3QtbmVpZ2hib3VyLCBzb1xuICAgKiAgem9vbWluZyBwYXN0IDE6MSBzaG93cyBjcmlzcCBwaXhlbCBibG9ja3MgKHBpeGVsLWxldmVsIGluc3BlY3Rpb24pLiBBcHBsaWVkXG4gICAqICBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmUgKHdpdGggYSByZWRyYXcpIHdoZW4gb25lIGlzIG1vdW50ZWQuICovXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIGEgdm9sdW1lIHJlbmRlcmVyIChuYXBhcmktanMgV2ViR1BVKTogMSA9IGZ1bGxcbiAqIHJlc29sdXRpb24g4oCmIDggPSDihZsgcGVyIGF4aXMuIENhcGFiaWxpdHktZ2F0ZWQ6IG51bGwgb24gYSBiYWNrZW5kIHdpdGhvdXQgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgLyoqIFRoZSBjdXJyZW50IGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gKi9cbiAgZ2V0KCk6IG51bWJlcjtcbiAgLyoqIFNldCB0aGUgZmFjdG9yIChyb3VuZGVkLCBhdCBsZWFzdCAxKS4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlFxuICAgKiAgdGhlIGhvc3QgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyBpdCwgc2luY2UgaXQgY2hhbmdlcyB0aGUgZmV0Y2hlZCBkYXRhLiAqL1xuICBzZXQoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGhvc3QtZmFjaW5nIGNvbXBvc2l0ZSBjb250cmFjdCwgaW1wbGVtZW50ZWQgYnkgdGhlIHJvdXRlciAoYFZJU1VBTElaRVJgKS4gQVxuICogcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyB7QGxpbmsgSVZpZXdlckJhY2tlbmR9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJcbiAgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLCBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogSXNvc3VyZmFjZSBjb250cm9scyB3aGVuIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIGBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2VgLFxuICAgKiAgZWxzZSBudWxsIOKAlCBzbyBjb25zdW1lcnMgZ2F0ZSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBub3QgYSBuby1vcCBtZXRob2QuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzIHdoZW4gdGhlIGJhY2tlbmQgcmVuZGVycyB0aGUgTElORSBwbG90IHR5cGUsXG4gICAqICBlbHNlIG51bGwuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGw7XG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyB3aGVuIHRoaXMgYmFja2VuZCByZW5kZXJzIDNEIHBsb3QgdHlwZXMsIGVsc2UgbnVsbCDigJRcbiAgICogIHRoZSBjYXBhYmlsaXR5LWdhdGVkIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZCB0b3AtbGV2ZWxcbiAgICogIGBzZXRTdXJmYWNlRHJhZ01vZGVgL2ByZXNldFN1cmZhY2VDYW1lcmFgLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICAvKiogVGhlIG5hdmlnYXRvciAvIGltYWdlLXNtb290aGluZyBvcHRpb25zLiBOZXZlciBudWxsIG9uIHRoZSByb3V0ZXI6IGEgc2V0dGluZ1xuICAgKiAgYXBwbGllcyB0byBldmVyeSBiYWNrZW5kIHRoYXQgaGFzIHRoZW0gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qcyksIHNvIGl0IGNhblxuICAgKiAgYmUgc2V0IGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyIGFuZCBzdXJ2aXZlcyBhIGJhY2tlbmQgc3dpdGNoLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnM7XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lXG4gICAqICAob25seSBuYXBhcmktanMgcmVuZGVycyB2b2x1bWVzKS4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGw7XG4gIC8qKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZywgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5U2FtcGxpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoKWAuICovXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmdldFZpZXdwb3J0Q2hhbmdlJCgpYC4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT47XG4gIC8qKiBTcGF0aWFsLW9taWNzIGNvbnRyb2xzIHdoZW4gYSBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLCBlbHNlIG51bGwuXG4gICAqICBPcHRpb25hbDogb25seSB0aGUgcm91dGluZyBzZXJ2aWNlIGltcGxlbWVudHMgaXQsIHNpbmNlIHRoZSBzdGF0ZSBpcyBzaGFyZWRcbiAgICogIHJhdGhlciB0aGFuIG93bmVkIGJ5IGFueSBvbmUgYmFja2VuZC4gKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzPygpOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSB2aWV3cG9ydCBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZSBkcmF3cyBvdmVyLCB3aGVuIHRoZSBiYWNrZW5kIG9uXG4gICAqICBzY3JlZW4gY2FuIHByb3ZpZGUgb25lIChPcGVuU2VhZHJhZ29uKSwgZWxzZSBudWxsLiBPcHRpb25hbDogYmFja2VuZHMgdGhhdFxuICAgKiAgbm8gY29udHJpYnV0ZWQgbW9kZSByaWRlcyBvbiBuZWVkIG5vdCBpbXBsZW1lbnQgaXQuICovXG4gIGdldFBsb3RNb2RlVmlld3BvcnQ/KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsO1xuICAvKiogQmlubmVkIGludGVuc2l0eSBoaXN0b2dyYW0gZm9yIGEgY2hhbm5lbCBmcm9tIHRoZSBjdXJyZW50bHktZGlzcGxheWVkXG4gICAqICBwaXhlbHMsIG9yIG51bGwgd2hlbiBub25lIGFyZSBhdmFpbGFibGUuIEZlZWRzIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbVxuICAgKiAgcGFuZS4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbDtcbiAgLyoqIEFzeW5jIGhpc3RvZ3JhbSBzdHJlYW0g4oCUIG5hdGl2ZSBiaXQgZGVwdGggZm9yID44LWJpdCBpbWFnZXMgKHNlcnZlciksIGVsc2VcbiAgICogIHRoZSA4LWJpdCBjbGllbnQgaGlzdG9ncmFtLiAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPjtcbiAgLyoqIEV4cG9ydCB0aGUgZGlzcGxheWVkIGltYWdlLCBjb21wb3NpdGVkIHdpdGggdGhlIGN1cnJlbnQgZGlzcGxheSBzZXR0aW5ncyxcbiAgICogIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGRvd25sb2FkLiAqL1xuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZDtcbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRlxuICAgKiAgKG5hdGl2ZSBiaXQgZGVwdGgpLiBOby1vcCBvbiBiYWNrZW5kcyB0aGF0IGNhbid0IHByb3ZpZGUgaXQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZDtcbiAgLyoqXG4gICAqIFRoZSB2aWV3IGlzIGdvaW5nIGF3YXkgKHRoZSBgPHZpc3VhbGl6ZXI+YCBpcyBkZXN0cm95ZWQpOiBkcm9wIHdoYXQgaXMgYm91bmQgdG9cbiAgICogaXQg4oCUIHRoZSBvbi1zY3JlZW4gdmlld2VyLCBpdHMgcmVuZGVyIGxvb3AgYW5kIHZpZXcgc3Vic2NyaXB0aW9ucyDigJQgc28gbm90aGluZ1xuICAgKiBvdXRsaXZlcyB0aGUgdmlldy4gU2VydmljZS1saWZldGltZSBzdGF0ZSAoc3RvcmVzLCB0aGUgYmFja2VuZHMnIG93biBzdG9yZVxuICAgKiBzdWJzY3JpcHRpb25zKSBpcyB1bnRvdWNoZWQsIHNvIGEgbGF0ZXIgdmlldyBvbiB0aGUgc2FtZSBjaGFpbiByZW5kZXJzIG5vcm1hbGx5LlxuICAgKi9cbiAgZGV0YWNoKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGRldGFjaH0sIHdoaWNoIHRoaXMgZGVsZWdhdGVzIHRvLiAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFdoYXQgYSByZW5kZXJpbmcgYmFja2VuZCBpbXBsZW1lbnRzIChQbG90bHksIE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qcyk6IHJlbmRlcmluZyxcbiAqIHRoZSB2aWV3cG9ydCwgcGl4ZWwgcmVhZGJhY2ssIGV4cG9ydCwgbG9hZGluZyBzdGF0ZSBhbmQgaXRzIG9uLWNhbnZhcyB0b29scywgcGx1c1xuICogY2FwYWJpbGl0eS1nYXRlZCBnZXR0ZXJzIGZvciB3aGF0IG9ubHkgc29tZSBiYWNrZW5kcyBoYXZlLlxuICpcbiAqIEl0IGlzIHRoZSBiYWNrZW5kLWZhY2luZyBoYWxmIG9mIHtAbGluayBJVmlzdWFsaXplcn0uIFJlZ2lvbiBhbmQgZGlzcGxheSBzdGF0ZSBhcmVcbiAqIG5vdCBoZXJlOiB0aGV5IGxpdmUgaW4gdGhlIHNoYXJlZCBgUmVnaW9uU3RvcmVgIC8gYFZpc3VhbGl6ZXJTdG9yZWAsIHdoaWNoIHRoZSByb3V0ZXJcbiAqIHNlcnZlcyB0byBob3N0cyBkaXJlY3RseTsgYSBiYWNrZW5kIGRyYXdzIHRoZW0gYnkgc3Vic2NyaWJpbmcgdG8gdGhlIHN0b3JlcycgZXZlbnRzLlxuICogSG9zdHMga2VlcCBkZXBlbmRpbmcgb24gYElWaXN1YWxpemVyYCAodGhlIHJvdXRlcidzIGNvbXBvc2l0ZSksIG5ldmVyIG9uIGEgYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlld2VyQmFja2VuZCBleHRlbmRzIElUb29sQ29udHJvbGxlciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzO1xuXG4gIC8vIOKUgOKUgCByZW5kZXIgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMb2FkZWRJbWFnZT47XG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiB1bmtub3duLFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQ7XG4gIC8qKiBUaGUgdmlldyBpcyBnb2luZyBhd2F5OiByZWxlYXNlIHdoYXQgaXMgYm91bmQgdG8gaXQuICovXG4gIGRldGFjaCgpOiB2b2lkO1xuICAvKiogU3RvcCBzdHJlYW1pbmcgZnJhbWVzICh2b2x1bWUgYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpLiBPcHRpb25hbDogb25seVxuICAgKiAgYmFja2VuZHMgdGhhdCBzdHJlYW0gYSB6LXN0YWNrIGRvIHdvcmsgaGVyZS4gKi9cbiAgY2FuY2VsTG9hZGluZz8oKTogdm9pZDtcblxuICAvLyDilIDilIAgdmlld3BvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHpvb21JbigpOiB2b2lkO1xuICB6b29tT3V0KCk6IHZvaWQ7XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZDtcbiAgZml0VG9WaWV3KCk6IHZvaWQ7XG4gIC8qKiBAc2VlIElEYXRhUmVuZGVyZXIucmVzZXRBeGVzICovXG4gIHJlc2V0QXhlcygpOiB2b2lkO1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkO1xuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEVtaXRzIHdoZW5ldmVyIHRoZSBiYWNrZW5kIGZpdHMgdGhlIHZpZXcuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICAvLyDilIDilIAgcGl4ZWxzLCBoaXN0b2dyYW0sIGV4cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+O1xuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbDtcbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbDtcbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD47XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZDtcbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQ7XG4gIGV4cG9ydERhdGEoKTogdm9pZDtcblxuICAvLyDilIDilIAgY2FwYWJpbGl0eS1nYXRlZCBzdXJmYWNlcyAobnVsbCAvIGFic2VudCB3aGVyZSB0aGUgYmFja2VuZCBsYWNrcyB0aGUgZmVhdHVyZSkg4pSA4pSAXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGw7XG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGw7XG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGw7XG4gIGdldFBsb3RNb2RlVmlld3BvcnQ/KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsO1xuICAvKiogTmF2aWdhdG9yIC8gaW1hZ2Ugc21vb3RoaW5nLCBvciBudWxsIHdoZW4gdGhlIGJhY2tlbmQgaGFzIG5laXRoZXIgKFBsb3RseSkuICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB8IG51bGw7XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yLCBvciBudWxsIHdoZW4gdGhlIGJhY2tlbmQgcmVuZGVycyBubyB2b2x1bWVzLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbDtcbiAgLyoqIFdoZXJlIHRoZSB2aWV3IHNldHRsZWQsIGZvciB0aGUgaW50ZW5zaXR5IGluc2V0J3MgcmUtc2FtcGxpbmc7IG51bGwgd2hlbiB0aGVcbiAgICogIGJhY2tlbmQgcmUtc2FtcGxlcyBvbiBpdHMgb3duIChQbG90bHkncyBoaWdoLWRlZiB6b29tKS4gVGhlIHNhbXBsaW5nIGl0c2VsZiBpc1xuICAgKiAgdGhlIHJvdXRlcidzIChJbnRlbnNpdHlQcm9maWxlU2VydmljZSkuICovXG4gIGdldEludGVuc2l0eVNhbXBsaW5nKCk6IElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB8IG51bGw7XG59XG5cbi8qKlxuICogV2hhdCBhIG1vdW50ZWQgYDx2aXN1YWxpemVyPmAgaGFuZHMgaXRzIGhvc3QgdGhyb3VnaFxuICogYEltYWdlU3RhdGVQb3J0LnNldERpYWdyYW0oKWAg4oCUIGEgc21hbGwsIHR5cGVkIHN1cmZhY2UgcmF0aGVyIHRoYW4gdGhlIGNvbXBvbmVudFxuICogaXRzZWxmLCB3aG9zZSBldmVyeSBwdWJsaWMgbWVtYmVyIHdvdWxkIG90aGVyd2lzZSBiZSBkZS1mYWN0byBBUEkuIENsZWFyZWRcbiAqIChgc2V0RGlhZ3JhbShudWxsKWApIHdoZW4gdGhlIHZpc3VhbGl6ZXIgaXMgZGVzdHJveWVkLiBIb3N0cyB0aGF0IGNhbiBpbmplY3RcbiAqIHtAbGluayBWSVNVQUxJWkVSfSAvIGBSRUdJT05fRURJVE9SX0FQSWAgZGlyZWN0bHkgbmVlZCBub3QgdXNlIGl0IGF0IGFsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXN1YWxpemVySGFuZGxlIHtcbiAgLyoqIFRoZSB2aXN1YWxpemVyIGNoYWluIHRoaXMgYDx2aXN1YWxpemVyPmAgcmVuZGVycyB0aHJvdWdoLiAqL1xuICByZWFkb25seSB2aXN1YWxpemVyOiBJVmlzdWFsaXplcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdmlzdWFsaXplcn0uIEtlcHQgZm9yIGhvc3RzIHRoYXQgcmVhZCB0aGUgY29tcG9uZW50J3NcbiAgICogIGZvcm1lciBgcGxvdFNlcnZpY2VgIGZpZWxkIG9mZiB0aGUgcmVnaXN0ZXJlZCBvYmplY3QuICovXG4gIHJlYWRvbmx5IHBsb3RTZXJ2aWNlOiBJVmlzdWFsaXplcjtcbiAgLyoqIFdoZXRoZXIgYW55IHJlZ2lvbiAoYW5ub3RhdGlvbiBvciBpbnRlbnNpdHkgbGluZSkgZXhpc3RzIG9uIHRoZSBjdXJyZW50IGltYWdlLiAqL1xuICBoYXNSZWdpb25zKCk6IGJvb2xlYW47XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zLCBmb3IgYSBzZXJ2ZXIgcmVxdWVzdCAoY3JvcCAvIHByb2Nlc3NpbmcpLiAqL1xuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW107XG59XG5cbi8qKlxuICogREkgdG9rZW4gZm9yIHRoZSBhY3RpdmUgdmlzdWFsaXphdGlvbiBiYWNrZW5kLiBCaW5kIGl0IChgdXNlRXhpc3RpbmdgKSB0byB0aGVcbiAqIGBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2VgLCB3aGljaCBzZWxlY3RzIFBsb3RseSB2cyBPcGVuU2VhZHJhZ29uIHBlciBwbG90XG4gKiB0eXBlLiBDb25zdW1lcnMg4oCUIGluY2x1ZGluZyB0aGlzIGxpYnJhcnkncyBvd24gYFZpc3VhbGl6ZXJDb21wb25lbnRgIOKAlFxuICogaW5qZWN0IGBJVmlzdWFsaXplcmAgdGhyb3VnaCB0aGlzIHRva2VuIHJhdGhlciB0aGFuIHRoZSBjb25jcmV0ZSByb3V0ZXIsIHNvXG4gKiB0aGUgcm91dGluZy9mYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBjYW4gY2hhbmdlIHdpdGhvdXQgdG91Y2hpbmcgY29uc3RydWN0b3JzLlxuICovXG5leHBvcnQgY29uc3QgVklTVUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJVmlzdWFsaXplcj4oJ1ZJU1VBTElaRVInKTtcbiJdfQ==
@@ -1,3 +1,4 @@
1
1
  import { InjectionToken } from '@angular/core';
2
+ /** DI token for the host's {@link VizConfig}. Required by the router. */
2
3
  export const VIZ_CONFIG = new InjectionToken('VIZ_CONFIG');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml6LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpei1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBCL0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBTdGF0aWMgY29uZmlndXJhdGlvbiB0aGUgdmlzdWFsaXphdGlvbiBsaWJyYXJ5IG5lZWRzIGZyb20gdGhlIGhvc3QsIHN1cHBsaWVkXG4gKiB2aWEgREkgc28gdGhlIGxpYnJhcnkgbmV2ZXIgaW1wb3J0cyB0aGUgYXBwJ3MgYGVudmlyb25tZW50YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpDb25maWcge1xuICAvKiogQmFzZSBVUkwgb2YgdGhlIHRpbGUvY3JvcCBzZXJ2ZXIgKGAvdGlsZWAsIGAvdGlsZXMvaW5mb2AsIHpvb20pLiAqL1xuICBzbGlkZUNyb3BTZXJ2ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIENTUyBzZWxlY3RvciBmb3IgYSBob3N0IGVsZW1lbnQgd2hvc2UgY3VycmVudCB3aWR0aCB0aGUgUmVnaW9uXG4gICAqIEVkaXRvciBkaWFsb2cgc2hvdWxkIG1hdGNoIHdoZW4gaXQgZmlyc3Qgb3BlbnMgKGUuZy4gdGhlIGFwcCdzIHJpZ2h0XG4gICAqIHBhbmVsKS4gTWVhc3VyZWQgb25jZSBwZXIgb3BlbiDigJQgaXQgZG9lcyBub3QgdHJhY2sgbGF0ZXIgcmVzaXplcy4gV2hlblxuICAgKiBhYnNlbnQgb3IgdGhlIGVsZW1lbnQgaXNuJ3QgZm91bmQsIHRoZSBkaWFsb2cgZmFsbHMgYmFjayB0byBhIHF1YXJ0ZXIgb2ZcbiAgICogdGhlIHBhZ2Ugd2lkdGggKDI1dncpLlxuICAgKi9cbiAgcmVnaW9uRWRpdG9yV2lkdGhTZWxlY3Rvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdCBpbiB0byB0aGUgZXhwZXJpbWVudGFsIFdlYkdQVSAqKm5hcGFyaS1qcyoqIGJhY2tlbmQgZm9yIHRoZSBJTUFHRSBwbG90IHR5cGVcbiAgICogKGppdC11aSMxMDIpLiBXaGVuIGB0cnVlYCwgdGhlIHJvdXRlciByZW5kZXJzIGltYWdlcyB0aHJvdWdoIG5hcGFyaS1qcyB3aXRoIE9wZW5TZWFkcmFnb25cbiAgICogYXMgdGhlIGZhbGxiYWNrOyB3aGVuIGFic2VudC9mYWxzZSwgT3BlblNlYWRyYWdvbiByZW1haW5zIHRoZSBkZWZhdWx0LiBPdGhlciBwbG90IHR5cGVzXG4gICAqIGFyZSB1bmFmZmVjdGVkLlxuICAgKi9cbiAgdXNlTmFwYXJpUmVuZGVyZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVklaX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWaXpDb25maWc+KCdWSVpfQ09ORklHJyk7XG4iXX0=
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml6LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpei1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBCL0MseUVBQXlFO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBWSxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogU3RhdGljIGNvbmZpZ3VyYXRpb24gdGhlIHZpc3VhbGl6YXRpb24gbGlicmFyeSBuZWVkcyBmcm9tIHRoZSBob3N0LCBzdXBwbGllZFxuICogdmlhIERJIHNvIHRoZSBsaWJyYXJ5IG5ldmVyIGltcG9ydHMgdGhlIGFwcCdzIGBlbnZpcm9ubWVudGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6Q29uZmlnIHtcbiAgLyoqIEJhc2UgVVJMIG9mIHRoZSB0aWxlL2Nyb3Agc2VydmVyIChgL3RpbGVgLCBgL3RpbGVzL2luZm9gLCB6b29tKS4gKi9cbiAgc2xpZGVDcm9wU2VydmVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBDU1Mgc2VsZWN0b3IgZm9yIGEgaG9zdCBlbGVtZW50IHdob3NlIGN1cnJlbnQgd2lkdGggdGhlIFJlZ2lvblxuICAgKiBFZGl0b3IgZGlhbG9nIHNob3VsZCBtYXRjaCB3aGVuIGl0IGZpcnN0IG9wZW5zIChlLmcuIHRoZSBhcHAncyByaWdodFxuICAgKiBwYW5lbCkuIE1lYXN1cmVkIG9uY2UgcGVyIG9wZW4g4oCUIGl0IGRvZXMgbm90IHRyYWNrIGxhdGVyIHJlc2l6ZXMuIFdoZW5cbiAgICogYWJzZW50IG9yIHRoZSBlbGVtZW50IGlzbid0IGZvdW5kLCB0aGUgZGlhbG9nIGZhbGxzIGJhY2sgdG8gYSBxdWFydGVyIG9mXG4gICAqIHRoZSBwYWdlIHdpZHRoICgyNXZ3KS5cbiAgICovXG4gIHJlZ2lvbkVkaXRvcldpZHRoU2VsZWN0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHQgaW4gdG8gdGhlIGV4cGVyaW1lbnRhbCBXZWJHUFUgKipuYXBhcmktanMqKiBiYWNrZW5kIGZvciB0aGUgSU1BR0UgcGxvdCB0eXBlXG4gICAqIChqaXQtdWkjMTAyKS4gV2hlbiBgdHJ1ZWAsIHRoZSByb3V0ZXIgcmVuZGVycyBpbWFnZXMgdGhyb3VnaCBuYXBhcmktanMgd2l0aCBPcGVuU2VhZHJhZ29uXG4gICAqIGFzIHRoZSBmYWxsYmFjazsgd2hlbiBhYnNlbnQvZmFsc2UsIE9wZW5TZWFkcmFnb24gcmVtYWlucyB0aGUgZGVmYXVsdC4gT3RoZXIgcGxvdCB0eXBlc1xuICAgKiBhcmUgdW5hZmZlY3RlZC5cbiAgICovXG4gIHVzZU5hcGFyaVJlbmRlcmVyPzogYm9vbGVhbjtcbn1cblxuLyoqIERJIHRva2VuIGZvciB0aGUgaG9zdCdzIHtAbGluayBWaXpDb25maWd9LiBSZXF1aXJlZCBieSB0aGUgcm91dGVyLiAqL1xuZXhwb3J0IGNvbnN0IFZJWl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48Vml6Q29uZmlnPignVklaX0NPTkZJRycpO1xuIl19
@@ -0,0 +1,63 @@
1
+ import { traceContours } from 'napari-js/geometry';
2
+ import { makePolygon } from '../models/polygon-factory';
3
+ /**
4
+ * Pure contour tracing: binary mask / label map → polygons with holes, through
5
+ * napari-js's `traceContours`. No DOM, no Angular.
6
+ *
7
+ * Pixel (x, y) of a mask covers `[x, x + 1) × [y, y + 1)` of its frame, and the
8
+ * outlines run along pixel EDGES (vertices on whole pixel corners, straight runs
9
+ * merged into one edge), so `rasterizePolygon` (`geometry/raster`, the pixel-centre
10
+ * rule) gives back exactly the traced pixels: a region the wand or brush adopts
11
+ * again after a zoom, pan or undo comes back unchanged. Each blob's holes are its
12
+ * own interior rings, never a gap that blobs enclose only together. Vertices are
13
+ * translated by the caller's origin and never clamped: a mask may sit partly
14
+ * outside the readback window it was painted in (jit-ui#102).
15
+ */
16
+ /** A traced contour as a closed Polygon, holes as `[[x, y], …]` rings. */
17
+ function toPolygon(c) {
18
+ const ring = (flat) => {
19
+ const xs = [];
20
+ const ys = [];
21
+ for (let i = 0; i < flat.length; i += 2) {
22
+ xs.push(flat[i]);
23
+ ys.push(flat[i + 1]);
24
+ }
25
+ return { xs, ys };
26
+ };
27
+ const outer = ring(c.outer);
28
+ const holes = c.holes.map((h) => {
29
+ const r = ring(h);
30
+ return r.xs.map((x, k) => [x, r.ys[k]]);
31
+ });
32
+ return makePolygon(outer.xs, outer.ys, { holes });
33
+ }
34
+ /**
35
+ * Trace EVERY 4-connected blob in `mask` (sized w*h) whose area is at least
36
+ * `minSize` pixels, returning one Polygon per blob translated via
37
+ * (originX, originY), ordered largest-first (ties in raster order). A blob's
38
+ * interior rings enclosing at least `minHoleSize` pixels become its
39
+ * {@link Polygon.holes}. An erase that cuts a region in two therefore yields
40
+ * both pieces, and a donut keeps its hole.
41
+ *
42
+ * The mask is labelled once and each blob traced inside its own bounding box
43
+ * (RT-16), so the cost is O(w·h + Σ bbox areas).
44
+ */
45
+ export function maskToPolygons(mask, w, h, originX, originY, minSize = 4, minHoleSize = minSize) {
46
+ return traceContours({ data: mask, width: w, height: h }, { minSize, minHoleSize, origin: [originX, originY] }).map(toPolygon);
47
+ }
48
+ /**
49
+ * Trace each instance in an integer label map (0 = background) into polygons —
50
+ * used to turn a cellpose-style segmentation into region outlines. Pieces with
51
+ * area below `minSize` are skipped (and holes below it dropped); a label made of
52
+ * several blobs yields one polygon per blob. Ordered by label, then largest
53
+ * piece first. Coords are translated via originX/originY (not clamped).
54
+ *
55
+ * One labelling pass finds every label's pieces; each is traced inside its own
56
+ * bounding box (RT-16), instead of rescanning the whole map per label.
57
+ */
58
+ export function labelsToPolygons(labels, w, h, originX, originY, minSize = 10) {
59
+ return traceContours({ data: labels, width: w, height: h }, { minSize, minHoleSize: minSize, origin: [originX, originY] })
60
+ .sort((a, b) => a.value - b.value) // stable: largest first within a label
61
+ .map(toPolygon);
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udG91ci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZ2VvbWV0cnkvY29udG91ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILDBFQUEwRTtBQUMxRSxTQUFTLFNBQVMsQ0FBQyxDQUFVO0lBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBYyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixJQUFnQixFQUNoQixDQUFTLEVBQ1QsQ0FBUyxFQUNULE9BQWUsRUFDZixPQUFlLEVBQ2YsT0FBTyxHQUFHLENBQUMsRUFDWCxXQUFXLEdBQUcsT0FBTztJQUVyQixPQUFPLGFBQWEsQ0FDbEIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUNuQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQ3JELENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQW1CLEVBQ25CLENBQVMsRUFDVCxDQUFTLEVBQ1QsT0FBZSxFQUNmLE9BQWUsRUFDZixPQUFPLEdBQUcsRUFBRTtJQUVaLE9BQU8sYUFBYSxDQUNsQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQ3JDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQzlEO1NBQ0UsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsdUNBQXVDO1NBQ3pFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHJhY2VDb250b3VycyB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7IENvbnRvdXIgfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBtYWtlUG9seWdvbiB9IGZyb20gJy4uL21vZGVscy9wb2x5Z29uLWZhY3RvcnknO1xuXG4vKipcbiAqIFB1cmUgY29udG91ciB0cmFjaW5nOiBiaW5hcnkgbWFzayAvIGxhYmVsIG1hcCDihpIgcG9seWdvbnMgd2l0aCBob2xlcywgdGhyb3VnaFxuICogbmFwYXJpLWpzJ3MgYHRyYWNlQ29udG91cnNgLiBObyBET00sIG5vIEFuZ3VsYXIuXG4gKlxuICogUGl4ZWwgKHgsIHkpIG9mIGEgbWFzayBjb3ZlcnMgYFt4LCB4ICsgMSkgw5cgW3ksIHkgKyAxKWAgb2YgaXRzIGZyYW1lLCBhbmQgdGhlXG4gKiBvdXRsaW5lcyBydW4gYWxvbmcgcGl4ZWwgRURHRVMgKHZlcnRpY2VzIG9uIHdob2xlIHBpeGVsIGNvcm5lcnMsIHN0cmFpZ2h0IHJ1bnNcbiAqIG1lcmdlZCBpbnRvIG9uZSBlZGdlKSwgc28gYHJhc3Rlcml6ZVBvbHlnb25gIChgZ2VvbWV0cnkvcmFzdGVyYCwgdGhlIHBpeGVsLWNlbnRyZVxuICogcnVsZSkgZ2l2ZXMgYmFjayBleGFjdGx5IHRoZSB0cmFjZWQgcGl4ZWxzOiBhIHJlZ2lvbiB0aGUgd2FuZCBvciBicnVzaCBhZG9wdHNcbiAqIGFnYWluIGFmdGVyIGEgem9vbSwgcGFuIG9yIHVuZG8gY29tZXMgYmFjayB1bmNoYW5nZWQuIEVhY2ggYmxvYidzIGhvbGVzIGFyZSBpdHNcbiAqIG93biBpbnRlcmlvciByaW5ncywgbmV2ZXIgYSBnYXAgdGhhdCBibG9icyBlbmNsb3NlIG9ubHkgdG9nZXRoZXIuIFZlcnRpY2VzIGFyZVxuICogdHJhbnNsYXRlZCBieSB0aGUgY2FsbGVyJ3Mgb3JpZ2luIGFuZCBuZXZlciBjbGFtcGVkOiBhIG1hc2sgbWF5IHNpdCBwYXJ0bHlcbiAqIG91dHNpZGUgdGhlIHJlYWRiYWNrIHdpbmRvdyBpdCB3YXMgcGFpbnRlZCBpbiAoaml0LXVpIzEwMikuXG4gKi9cblxuLyoqIEEgdHJhY2VkIGNvbnRvdXIgYXMgYSBjbG9zZWQgUG9seWdvbiwgaG9sZXMgYXMgYFtbeCwgeV0sIOKApl1gIHJpbmdzLiAqL1xuZnVuY3Rpb24gdG9Qb2x5Z29uKGM6IENvbnRvdXIpOiBQb2x5Z29uIHtcbiAgY29uc3QgcmluZyA9IChmbGF0OiBudW1iZXJbXSkgPT4ge1xuICAgIGNvbnN0IHhzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHlzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgeHMucHVzaChmbGF0W2ldKTtcbiAgICAgIHlzLnB1c2goZmxhdFtpICsgMV0pO1xuICAgIH1cbiAgICByZXR1cm4geyB4cywgeXMgfTtcbiAgfTtcbiAgY29uc3Qgb3V0ZXIgPSByaW5nKGMub3V0ZXIpO1xuICBjb25zdCBob2xlcyA9IGMuaG9sZXMubWFwKChoKSA9PiB7XG4gICAgY29uc3QgciA9IHJpbmcoaCk7XG4gICAgcmV0dXJuIHIueHMubWFwKCh4LCBrKSA9PiBbeCwgci55c1trXV0pO1xuICB9KTtcbiAgcmV0dXJuIG1ha2VQb2x5Z29uKG91dGVyLnhzLCBvdXRlci55cywgeyBob2xlcyB9KTtcbn1cblxuLyoqXG4gKiBUcmFjZSBFVkVSWSA0LWNvbm5lY3RlZCBibG9iIGluIGBtYXNrYCAoc2l6ZWQgdypoKSB3aG9zZSBhcmVhIGlzIGF0IGxlYXN0XG4gKiBgbWluU2l6ZWAgcGl4ZWxzLCByZXR1cm5pbmcgb25lIFBvbHlnb24gcGVyIGJsb2IgdHJhbnNsYXRlZCB2aWFcbiAqIChvcmlnaW5YLCBvcmlnaW5ZKSwgb3JkZXJlZCBsYXJnZXN0LWZpcnN0ICh0aWVzIGluIHJhc3RlciBvcmRlcikuIEEgYmxvYidzXG4gKiBpbnRlcmlvciByaW5ncyBlbmNsb3NpbmcgYXQgbGVhc3QgYG1pbkhvbGVTaXplYCBwaXhlbHMgYmVjb21lIGl0c1xuICoge0BsaW5rIFBvbHlnb24uaG9sZXN9LiBBbiBlcmFzZSB0aGF0IGN1dHMgYSByZWdpb24gaW4gdHdvIHRoZXJlZm9yZSB5aWVsZHNcbiAqIGJvdGggcGllY2VzLCBhbmQgYSBkb251dCBrZWVwcyBpdHMgaG9sZS5cbiAqXG4gKiBUaGUgbWFzayBpcyBsYWJlbGxlZCBvbmNlIGFuZCBlYWNoIGJsb2IgdHJhY2VkIGluc2lkZSBpdHMgb3duIGJvdW5kaW5nIGJveFxuICogKFJULTE2KSwgc28gdGhlIGNvc3QgaXMgTyh3wrdoICsgzqMgYmJveCBhcmVhcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9Qb2x5Z29ucyhcbiAgbWFzazogVWludDhBcnJheSxcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIG9yaWdpblg6IG51bWJlcixcbiAgb3JpZ2luWTogbnVtYmVyLFxuICBtaW5TaXplID0gNCxcbiAgbWluSG9sZVNpemUgPSBtaW5TaXplLFxuKTogUG9seWdvbltdIHtcbiAgcmV0dXJuIHRyYWNlQ29udG91cnMoXG4gICAgeyBkYXRhOiBtYXNrLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0sXG4gICAgeyBtaW5TaXplLCBtaW5Ib2xlU2l6ZSwgb3JpZ2luOiBbb3JpZ2luWCwgb3JpZ2luWV0gfSxcbiAgKS5tYXAodG9Qb2x5Z29uKTtcbn1cblxuLyoqXG4gKiBUcmFjZSBlYWNoIGluc3RhbmNlIGluIGFuIGludGVnZXIgbGFiZWwgbWFwICgwID0gYmFja2dyb3VuZCkgaW50byBwb2x5Z29ucyDigJRcbiAqIHVzZWQgdG8gdHVybiBhIGNlbGxwb3NlLXN0eWxlIHNlZ21lbnRhdGlvbiBpbnRvIHJlZ2lvbiBvdXRsaW5lcy4gUGllY2VzIHdpdGhcbiAqIGFyZWEgYmVsb3cgYG1pblNpemVgIGFyZSBza2lwcGVkIChhbmQgaG9sZXMgYmVsb3cgaXQgZHJvcHBlZCk7IGEgbGFiZWwgbWFkZSBvZlxuICogc2V2ZXJhbCBibG9icyB5aWVsZHMgb25lIHBvbHlnb24gcGVyIGJsb2IuIE9yZGVyZWQgYnkgbGFiZWwsIHRoZW4gbGFyZ2VzdFxuICogcGllY2UgZmlyc3QuIENvb3JkcyBhcmUgdHJhbnNsYXRlZCB2aWEgb3JpZ2luWC9vcmlnaW5ZIChub3QgY2xhbXBlZCkuXG4gKlxuICogT25lIGxhYmVsbGluZyBwYXNzIGZpbmRzIGV2ZXJ5IGxhYmVsJ3MgcGllY2VzOyBlYWNoIGlzIHRyYWNlZCBpbnNpZGUgaXRzIG93blxuICogYm91bmRpbmcgYm94IChSVC0xNiksIGluc3RlYWQgb2YgcmVzY2FubmluZyB0aGUgd2hvbGUgbWFwIHBlciBsYWJlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsc1RvUG9seWdvbnMoXG4gIGxhYmVsczogVWludDMyQXJyYXksXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuICBvcmlnaW5YOiBudW1iZXIsXG4gIG9yaWdpblk6IG51bWJlcixcbiAgbWluU2l6ZSA9IDEwLFxuKTogUG9seWdvbltdIHtcbiAgcmV0dXJuIHRyYWNlQ29udG91cnMoXG4gICAgeyBkYXRhOiBsYWJlbHMsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSxcbiAgICB7IG1pblNpemUsIG1pbkhvbGVTaXplOiBtaW5TaXplLCBvcmlnaW46IFtvcmlnaW5YLCBvcmlnaW5ZXSB9LFxuICApXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSAvLyBzdGFibGU6IGxhcmdlc3QgZmlyc3Qgd2l0aGluIGEgbGFiZWxcbiAgICAubWFwKHRvUG9seWdvbik7XG59XG4iXX0=