@igo2/geo 18.0.0-next.9 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
  3. package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
  4. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +2 -1
  5. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  6. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  7. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
  8. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
  9. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
  10. package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
  11. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
  12. package/esm2022/lib/directions/directions.component.mjs +55 -31
  13. package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
  14. package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
  15. package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
  16. package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
  17. package/esm2022/lib/directions/shared/store.mjs +2 -2
  18. package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
  19. package/esm2022/lib/download/shared/download.service.mjs +1 -1
  20. package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
  21. package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
  22. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  23. package/esm2022/lib/environment/environment.interface.mjs +1 -1
  24. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
  25. package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
  26. package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
  27. package/esm2022/lib/feature/shared/store.mjs +1 -1
  28. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
  29. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
  30. package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
  31. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
  32. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
  33. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
  34. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
  35. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
  36. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
  37. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
  38. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
  39. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
  40. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
  41. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
  42. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
  43. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
  44. package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
  45. package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
  46. package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
  47. package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
  48. package/esm2022/lib/layer/index.mjs +10 -5
  49. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  50. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  51. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +76 -161
  52. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
  53. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
  54. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
  55. package/esm2022/lib/layer/layer-list/index.mjs +1 -3
  56. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -785
  57. package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
  58. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
  59. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
  60. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
  61. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  62. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  63. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  64. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
  65. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  66. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  67. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  68. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  69. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  70. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  71. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  72. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  73. package/esm2022/lib/layer/layer.module.mjs +51 -33
  74. package/esm2022/lib/layer/shared/index.mjs +2 -1
  75. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  76. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  77. package/esm2022/lib/layer/shared/layer.service.mjs +31 -16
  78. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  79. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  80. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  81. package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
  82. package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
  83. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  84. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  85. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  86. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
  87. package/esm2022/lib/layer/shared/layers/layer.mjs +108 -117
  88. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  89. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  90. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  91. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  92. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
  93. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
  94. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
  95. package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
  96. package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
  97. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
  98. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
  99. package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
  100. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  101. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  102. package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
  103. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
  104. package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
  105. package/esm2022/lib/map/shared/map.mjs +7 -243
  106. package/esm2022/lib/map/shared/map.service.mjs +1 -1
  107. package/esm2022/lib/map/shared/map.utils.mjs +3 -3
  108. package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
  109. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
  110. package/esm2022/lib/map/utils/index.mjs +2 -0
  111. package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
  112. package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
  113. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
  114. package/esm2022/lib/offline/offline.provider.mjs +10 -11
  115. package/esm2022/lib/print/shared/print.service.mjs +3 -3
  116. package/esm2022/lib/query/shared/query.directive.mjs +9 -5
  117. package/esm2022/lib/query/shared/query.service.mjs +7 -7
  118. package/esm2022/lib/query/shared/query.utils.mjs +5 -1
  119. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
  120. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
  121. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
  122. package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
  123. package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
  124. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
  125. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
  126. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
  127. package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
  128. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
  129. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
  130. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
  131. package/fesm2022/igo2-geo.mjs +22952 -22018
  132. package/fesm2022/igo2-geo.mjs.map +1 -1
  133. package/lib/datasource/shared/capabilities.service.d.ts +7 -2
  134. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +2 -2
  135. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +5 -5
  136. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
  137. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
  138. package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
  139. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  140. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  141. package/lib/directions/directions.component.d.ts +5 -5
  142. package/lib/directions/shared/directions.enum.d.ts +42 -1
  143. package/lib/directions/shared/directions.interface.d.ts +50 -25
  144. package/lib/directions/shared/directions.service.d.ts +46 -8
  145. package/lib/directions/shared/directions.utils.d.ts +102 -23
  146. package/lib/directions/shared/store.d.ts +3 -3
  147. package/lib/download/download-button/download-button.component.d.ts +4 -8
  148. package/lib/download/shared/download.service.d.ts +1 -1
  149. package/lib/draw/draw/draw.component.d.ts +2 -2
  150. package/lib/draw/shared/draw.utils.d.ts +2 -1
  151. package/lib/environment/environment.interface.d.ts +2 -0
  152. package/lib/feature/shared/feature-store.utils.d.ts +1 -1
  153. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  154. package/lib/feature/shared/store.d.ts +1 -1
  155. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  156. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  157. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
  158. package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
  159. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
  160. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
  161. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
  162. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  163. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
  164. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  165. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
  166. package/lib/import-export/export-button/export-button.component.d.ts +3 -7
  167. package/lib/import-export/import-export/import-export.component.d.ts +1 -2
  168. package/lib/import-export/shared/export.service.d.ts +2 -2
  169. package/lib/layer/index.d.ts +9 -4
  170. package/lib/layer/layer-group/index.d.ts +1 -0
  171. package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
  172. package/lib/layer/layer-item/layer-item.component.d.ts +19 -42
  173. package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
  174. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
  175. package/lib/layer/layer-list/index.d.ts +0 -2
  176. package/lib/layer/layer-list/layer-list.component.d.ts +51 -128
  177. package/lib/layer/layer-list-tool/index.d.ts +0 -1
  178. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
  179. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
  180. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
  181. package/lib/layer/layer-search/index.d.ts +1 -0
  182. package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
  183. package/lib/layer/layer-unavailable/index.d.ts +2 -0
  184. package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
  185. package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
  186. package/lib/layer/layer-viewer/index.d.ts +2 -0
  187. package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
  188. package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
  189. package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
  190. package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
  191. package/lib/layer/layer-visibility-button/index.d.ts +1 -0
  192. package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
  193. package/lib/layer/layer.module.d.ts +18 -6
  194. package/lib/layer/shared/index.d.ts +1 -0
  195. package/lib/layer/shared/layer-controller.d.ts +81 -0
  196. package/lib/layer/shared/layer-selection.d.ts +14 -0
  197. package/lib/layer/shared/layer.service.d.ts +9 -5
  198. package/lib/layer/shared/layers/any-layer.d.ts +3 -6
  199. package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
  200. package/lib/layer/shared/layers/image-layer.d.ts +5 -2
  201. package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
  202. package/lib/layer/shared/layers/index.d.ts +5 -0
  203. package/lib/layer/shared/layers/layer-base.d.ts +75 -0
  204. package/lib/layer/shared/layers/layer-group.d.ts +32 -0
  205. package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
  206. package/lib/layer/shared/layers/layer.d.ts +27 -45
  207. package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
  208. package/lib/layer/shared/layers/linked/index.d.ts +3 -0
  209. package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
  210. package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
  211. package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
  212. package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
  213. package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
  214. package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
  215. package/lib/layer/utils/layer.utils.d.ts +12 -2
  216. package/lib/layer/utils/outputLegend.d.ts +2 -2
  217. package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
  218. package/lib/map/shared/hover-feature.directive.d.ts +0 -1
  219. package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
  220. package/lib/map/shared/map.abstract.d.ts +12 -29
  221. package/lib/map/shared/map.d.ts +10 -85
  222. package/lib/map/shared/map.service.d.ts +1 -1
  223. package/lib/map/shared/map.utils.d.ts +5 -3
  224. package/lib/map/utils/index.d.ts +1 -0
  225. package/lib/map/utils/layer-watcher.d.ts +18 -8
  226. package/lib/measure/measurer/measurer.component.d.ts +0 -8
  227. package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
  228. package/lib/offline/offline.provider.d.ts +1 -1
  229. package/lib/query/shared/query.service.d.ts +1 -1
  230. package/lib/query/shared/query.utils.d.ts +2 -1
  231. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  232. package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
  233. package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
  234. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  235. package/locale/en.geo.json +104 -89
  236. package/locale/fr.geo.json +103 -89
  237. package/package.json +5 -5
  238. package/src/geo-theme.scss +1 -1
  239. package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
  240. package/src/lib/directions/directions.theming.scss +2 -0
  241. package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
  242. package/src/lib/layer/layer-item/layer-item.theme.scss +4 -9
  243. package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
  244. package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
  245. package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
  246. package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
  247. package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
  248. package/src/lib/layer/layer.theming.scss +14 -3
  249. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
  250. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
  251. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
  252. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
  253. package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
  254. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
  255. package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
@@ -14,10 +14,10 @@ import { IgoLanguageModule } from '@igo2/core/language';
14
14
  import * as olObservable from 'ol/Observable';
15
15
  import * as olProj from 'ol/proj';
16
16
  import pointOnFeature from '@turf/point-on-feature';
17
- import { roundCoordTo } from '../../map/shared/map.utils';
18
- import { DirectionRelativePositionType } from '../shared/directions.enum';
19
- import { computeRelativePosition, removeStopFromStore, updateStoreSorting } from '../shared/directions.utils';
17
+ import { roundCoordTo, roundCoordToString } from '../../map/shared/map.utils';
18
+ import { addStopToStore, computeRelativePosition, removeStopFromStore, updateStoreSorting } from '../shared/directions.utils';
20
19
  import { StopsFeatureStore, StopsStore } from '../shared/store';
20
+ import { DirectionRelativePositionType } from './../shared/directions.enum';
21
21
  import * as i0 from "@angular/core";
22
22
  import * as i1 from "@igo2/core/language";
23
23
  import * as i2 from "@angular/material/form-field";
@@ -31,10 +31,6 @@ import * as i9 from "@angular/material/icon";
31
31
  import * as i10 from "@ngx-translate/core";
32
32
  export class DirectionsInputsComponent {
33
33
  languageService;
34
- invalidKeys = ['Control', 'Shift', 'Alt'];
35
- onMapClickEventKeys = [];
36
- stopWithHover;
37
- stopIsDragged = false;
38
34
  stopsStore;
39
35
  stopsFeatureStore;
40
36
  projection;
@@ -42,143 +38,238 @@ export class DirectionsInputsComponent {
42
38
  debounce = 200;
43
39
  length = 2;
44
40
  stopInputHasFocus = new EventEmitter(false);
41
+ invalidKeys = ['Control', 'Shift', 'Alt'];
42
+ onMapClickEventKeys = [];
43
+ stopWithHover;
44
+ stopIsDragged = false;
45
45
  constructor(languageService) {
46
46
  this.languageService = languageService;
47
47
  }
48
+ /**
49
+ * Returns the position property of the geolocationController.
50
+ *
51
+ * @return {BehaviorSubject<boolean> | undefined} The position property of
52
+ * the geolocationController.
53
+ */
54
+ get currentPosition() {
55
+ return (this.stopsFeatureStore?.map?.geolocationController?.position$?.value
56
+ ?.position &&
57
+ this.stopsFeatureStore?.map?.geolocationController?.tracking);
58
+ }
48
59
  ngOnDestroy() {
49
60
  this.unlistenMapSingleClick();
50
61
  }
62
+ /**
63
+ * Sets the stop with hover to the given stop.
64
+ *
65
+ * @param {Stop} stop - The stop to set as the stop with hover.
66
+ */
51
67
  onStopEnter(stop) {
52
68
  this.stopWithHover = stop;
53
69
  }
70
+ /**
71
+ * Sets the stop with hover to undefined.
72
+ *
73
+ */
54
74
  onStopLeave() {
55
75
  this.stopWithHover = undefined;
56
76
  }
77
+ /**
78
+ * Adds a stop to the stops store.
79
+ *
80
+ */
81
+ addStop() {
82
+ addStopToStore(this.stopsStore);
83
+ }
84
+ /**
85
+ * Returns the title of the option if it is an object and has a meta property with a title,
86
+ * otherwise returns the option itself.
87
+ *
88
+ * @param {any} option - The option to get the text from.
89
+ * @return {string} The title of the option if it is an object and has a meta property with a title,
90
+ * otherwise returns the option itself.
91
+ */
57
92
  getOptionText(option) {
58
93
  if (option instanceof Object) {
59
- return option?.meta ? option.meta.title : '';
94
+ const { meta } = option;
95
+ return meta?.title || '';
60
96
  }
61
97
  return option;
62
98
  }
63
- chooseProposal(event, stop) {
64
- const result = event.option.value;
65
- if (result) {
66
- let geomCoord;
67
- const geom = result.geometry;
68
- if (geom.type === 'Point') {
69
- geomCoord = geom.coordinates;
99
+ /**
100
+ * Chooses an option from a MatAutocomplete and updates the stop coordinates and text
101
+ * based on the selected feature.
102
+ *
103
+ * @param {Object} event - The event object containing the MatAutocomplete and MatOption.
104
+ * @param {MatAutocomplete} event.source - The MatAutocomplete component.
105
+ * @param {MatOption} event.option - The selected MatOption.
106
+ * @param {Stop} stop - The stop object to update.
107
+ */
108
+ chooseOption(event, stop) {
109
+ const feature = event.option.value;
110
+ if (feature) {
111
+ let coords;
112
+ const geometry = feature.geometry;
113
+ if (geometry.type === 'Point') {
114
+ coords = geometry.coordinates;
70
115
  }
71
116
  else {
72
- const point = pointOnFeature(result.geometry);
73
- geomCoord = [
74
- point.geometry.coordinates[0],
75
- point.geometry.coordinates[1]
76
- ];
117
+ const point = pointOnFeature(feature.geometry);
118
+ coords = [point.geometry.coordinates[0], point.geometry.coordinates[1]];
77
119
  }
78
- if (geomCoord) {
79
- stop.coordinates = geomCoord;
80
- stop.text = result.meta.title;
120
+ if (coords) {
121
+ stop.coordinates = coords;
122
+ stop.text = feature.meta.title;
81
123
  this.stopsStore.update(stop);
82
124
  }
83
125
  }
84
126
  }
127
+ /**
128
+ * Sets the text of a stop based on the value of an input field.
129
+ *
130
+ * @param {KeyboardEvent} event - The keyboard event triggered by the input field.
131
+ * @param {Stop} stop - The stop object to update.
132
+ */
85
133
  setStopText(event, stop) {
86
134
  this.unlistenMapSingleClick();
87
- const term = event.target.value;
88
- if (term.length === 0) {
89
- this.clearStop(stop);
135
+ const searchTerm = event.target.value;
136
+ if (searchTerm.length === 0) {
137
+ this.clearStopInput(stop);
90
138
  }
91
- else if (this.validateTerm(term)) {
92
- stop.text = term;
139
+ else if (this.validateSearchTerm(searchTerm)) {
140
+ stop.text = searchTerm;
93
141
  this.stopsStore.update(stop);
94
142
  }
95
143
  }
96
- validateTerm(term) {
97
- if (this.keyIsValid(term) &&
98
- (term.length >= this.length || term.length === 0)) {
99
- return true;
100
- }
101
- return false;
144
+ /**
145
+ * Validates a search term by checking if it contains any invalid characters and if its length is valid.
146
+ *
147
+ * @param {string} searchTerm - The search term to be validated.
148
+ * @return {boolean} Returns true if the search term is valid, false otherwise.
149
+ */
150
+ validateSearchTerm(searchTerm) {
151
+ const charactersAreValid = this.invalidKeys.indexOf(searchTerm) === -1;
152
+ const lengthIsValid = searchTerm.length >= this.length || searchTerm.length === 0;
153
+ return charactersAreValid && lengthIsValid;
102
154
  }
103
- keyIsValid(key) {
104
- return this.invalidKeys.find((value) => value === key) === undefined;
105
- }
106
- getNgClass(stop) {
107
- if (!this.stopWithHover) {
108
- return 'igo-input-container';
109
- }
110
- else if (stop.id === this.stopWithHover.id) {
111
- return 'igo-input-container reduce';
112
- }
113
- else {
114
- return 'igo-input-container';
115
- }
116
- }
117
- getPlaceholder(stop) {
118
- let extra = '';
119
- if (stop.relativePosition) {
120
- if (stop.relativePosition === DirectionRelativePositionType.Intermediate) {
121
- extra = ' #' + stop.position;
122
- }
123
- return (this.languageService.translate.instant('igo.geo.directionsForm.' + stop.relativePosition) + extra);
124
- }
125
- else {
126
- return '';
127
- }
155
+ /**
156
+ * Returns the label for the given stop input.
157
+ *
158
+ * @param {Stop} stop - The stop containing relativePosition and position.
159
+ * @return {string} The label for the stop input.
160
+ */
161
+ getInputLabel(stop) {
162
+ const { relativePosition, position } = stop;
163
+ const label = relativePosition
164
+ ? this.languageService.translate.instant(`igo.geo.directions.input.${relativePosition}`)
165
+ : '';
166
+ return relativePosition === DirectionRelativePositionType.Intermediate
167
+ ? `${label} #${position}`
168
+ : label;
128
169
  }
170
+ /**
171
+ * Removes a stop from the stops store.
172
+ *
173
+ * @param {Stop} stop - The stop object to be removed.
174
+ */
129
175
  removeStop(stop) {
130
176
  removeStopFromStore(this.stopsStore, stop);
131
177
  }
132
- clearStop(stop) {
178
+ /**
179
+ * Clears the specified stop in the stops store.
180
+ *
181
+ * @param {Stop} stop - The stop to be cleared.
182
+ */
183
+ clearStopInput(stop) {
133
184
  this.stopsStore.update({
134
185
  id: stop.id,
135
186
  relativePosition: stop.relativePosition,
136
187
  position: stop.position
137
188
  });
138
189
  }
139
- drop(event) {
190
+ /**
191
+ * Use the current position as a stop.
192
+ *
193
+ * @param {Stop} stop - The stop to update with the current position.
194
+ */
195
+ useCurrentPosition(stop) {
196
+ this.useCoordinatesAsStop(this.stopsFeatureStore.map.geolocationController.position$.value.position, stop);
197
+ }
198
+ /**
199
+ * Moves a stop in the list of stops..
200
+ *
201
+ * @param {CdkDragDrop<string[]>} event - The event containing the previous and current index of the dropped stop.
202
+ */
203
+ dropStop(event) {
140
204
  this.moveStops(event.previousIndex, event.currentIndex);
141
205
  }
206
+ /**
207
+ * Moves a stop in the list of stops from one index to another.
208
+ *
209
+ * @param {number} fromIndex - The index to move the stop from.
210
+ * @param {number} toIndex - The index to move the stop to.
211
+ */
142
212
  moveStops(fromIndex, toIndex) {
143
213
  if (fromIndex !== toIndex) {
144
214
  const stops = [...this.stopsStore.view.all()];
145
215
  moveItemInArray(stops, fromIndex, toIndex);
146
- stops.map((stop, i) => {
147
- stop.relativePosition = computeRelativePosition(i, stops.length);
148
- stop.position = i;
216
+ stops.map((stop, stopIndex) => {
217
+ stop.relativePosition = computeRelativePosition(stopIndex, stops.length - 1);
218
+ stop.position = stopIndex;
149
219
  });
150
220
  this.stopsStore.updateMany(stops);
151
221
  updateStoreSorting(this.stopsStore);
152
222
  }
153
223
  }
224
+ /**
225
+ * Handles the focus event on an input field for a stop.
226
+ *
227
+ * @param {Stop} stop - The stop that the input field is associated with.
228
+ */
154
229
  onInputFocus(stop) {
155
- if (!stop.text || stop.text?.length === 0) {
156
- this.unlistenMapSingleClick();
157
- this.stopInputHasFocus.emit(true);
158
- this.listenMapSingleClick(stop);
159
- }
230
+ this.unlistenMapSingleClick();
231
+ this.stopInputHasFocus.emit(true);
232
+ this.listenMapSingleClick(stop);
160
233
  }
234
+ /**
235
+ * Listens for a single click event on the map and uses the coordinates of the click
236
+ * to set the given stop's coordinates.
237
+ *
238
+ * @param {Stop} stop - The stop to update with the clicked coordinates.
239
+ */
161
240
  listenMapSingleClick(stop) {
162
241
  const key = this.stopsFeatureStore.layer.map.ol.once('singleclick', (event) => {
163
- const clickCoordinates = olProj.transform(event.coordinate, this.stopsFeatureStore.layer.map.projection, this.projection);
164
- const roundedCoord = roundCoordTo(clickCoordinates, this.coordRoundedDecimals);
165
- stop.text = roundedCoord.join(',');
166
- stop.coordinates = roundedCoord;
167
- this.stopsStore.update(stop);
168
- setTimeout(() => {
169
- this.stopInputHasFocus.emit(false);
170
- }, 500);
242
+ this.useCoordinatesAsStop(event.coordinate, stop);
171
243
  });
172
244
  this.onMapClickEventKeys.push(key);
173
245
  }
246
+ /**
247
+ * Unlistens for map single click events and clears the list of event keys.
248
+ */
174
249
  unlistenMapSingleClick() {
175
250
  this.onMapClickEventKeys.map((key) => {
176
251
  olObservable.unByKey(key);
177
252
  });
178
253
  this.onMapClickEventKeys = [];
179
254
  }
255
+ /**
256
+ * Uses the given coordinates to update the given stop.
257
+ *
258
+ * @param {Coordinate} coordinates - The coordinates to transform and round.
259
+ * @param {Stop} stop - The stop to update with the new coordinates and text.
260
+ */
261
+ useCoordinatesAsStop(coordinates, stop) {
262
+ const projectedCoordinates = olProj.transform(coordinates, this.stopsFeatureStore.layer.map.projection, this.projection);
263
+ const roundedCoordinates = roundCoordTo(projectedCoordinates, this.coordRoundedDecimals);
264
+ stop.text = roundCoordToString(projectedCoordinates, this.coordRoundedDecimals).join(', ');
265
+ stop.coordinates = roundedCoordinates;
266
+ this.stopsStore.update(stop);
267
+ setTimeout(() => {
268
+ this.stopInputHasFocus.emit(false);
269
+ }, 500);
270
+ }
180
271
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DirectionsInputsComponent, deps: [{ token: i1.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
181
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DirectionsInputsComponent, isStandalone: true, selector: "igo-directions-inputs", inputs: { stopsStore: "stopsStore", stopsFeatureStore: "stopsFeatureStore", projection: "projection", coordRoundedDecimals: "coordRoundedDecimals", debounce: "debounce", length: "length" }, outputs: { stopInputHasFocus: "stopInputHasFocus" }, ngImport: i0, template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"drop($event)\">\n <div\n touchleave\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n *ngFor=\"let stop of stopsStore.view.all$() | async; let i = index\"\n cdkDrag\n >\n <div [ngClass]=\"getNgClass(stop)\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getPlaceholder(stop) }}</mat-label>\n <input\n id=\"{{ stop.id }}\"\n type=\"text\"\n [placeholder]=\"getPlaceholder(stop)\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"stop.text\"\n aria-label=\"Number\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"\n (stop.text || stop.coordinates) &&\n stopWithHover &&\n stop.id === stopWithHover.id\n \"\n mat-icon-button\n matSuffix\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.clearStop' | translate\"\n color=\"warn\"\n aria-label=\"Clear\"\n (click)=\"clearStop(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseProposal($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"source.source.enabled === false\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"result.meta ? result.meta.title : ''\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"!stopIsDragged && stopWithHover && stop.id === stopWithHover.id\"\n class=\"igo-form-button-group\"\n >\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n\n <button\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .igo-form-button-group{display:flex;align-items:center;padding-left:12px}:host .stops-list{max-width:100%;min-height:60px;display:block;background:#fff;border-radius:4px;overflow:hidden;padding:20px 10px}:host .swipe-vertical{cursor:move}:host .stop-box{color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;background:#fff}:host .stop-box:not(:last-child){margin-bottom:16px}:host .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] });
272
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DirectionsInputsComponent, isStandalone: true, selector: "igo-directions-inputs", inputs: { stopsStore: "stopsStore", stopsFeatureStore: "stopsFeatureStore", projection: "projection", coordRoundedDecimals: "coordRoundedDecimals", debounce: "debounce", length: "length" }, outputs: { stopInputHasFocus: "stopInputHasFocus" }, ngImport: i0, template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"dropStop($event)\">\n <div\n *ngFor=\"let stop of stopsStore.view.all$() | async; let stopIndex = index\"\n class=\"stop\"\n >\n <div\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n cdkDrag\n >\n <div class=\"prefix-actions\">\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getInputLabel(stop) }}</mat-label>\n <input\n [id]=\"stop.id\"\n type=\"text\"\n [placeholder]=\"'igo.geo.directions.input.placeholder' | translate\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"currentPosition\"\n mat-icon-button\n matPrefix\n [matTooltip]=\"\n 'igo.geo.directions.input.currentPosition' | translate\n \"\n color=\"accent\"\n (click)=\"useCurrentPosition(stop); $event.stopPropagation()\"\n >\n <mat-icon>my_location</mat-icon>\n </button>\n <button\n *ngIf=\"stop.text || stop.coordinates\"\n mat-icon-button\n matSuffix\n [matTooltip]=\"'igo.geo.directions.input.clearStop' | translate\"\n color=\"warn\"\n (click)=\"clearStopInput(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseOption($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"!source.source.enabled\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <button\n class=\"delete-button\"\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"prefix-actions\">\n <button\n mat-icon-button\n [disabled]=\"\n (stopsStore.count$ | async) !== (stopsFeatureStore.count$ | async) ||\n stopIsDragged\n \"\n [matTooltip]=\"'igo.geo.directions.input.addStop' | translate\"\n color=\"primary\"\n (click)=\"addStop()\"\n >\n <mat-icon>add_location_alt</mat-icon>\n </button>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .stops-list{padding:12px 10px}:host .stops-list,:host .stop{display:flex;flex-flow:column;row-gap:12px}:host .stop:hover .swipe-vertical,:host .stop:hover .delete-button{visibility:visible;display:block}:host .swipe-vertical{visibility:hidden;cursor:move}:host .delete-button{display:none}:host .stop-box{display:flex;align-items:center;justify-content:space-between}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] });
182
273
  }
183
274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DirectionsInputsComponent, decorators: [{
184
275
  type: Component,
@@ -199,13 +290,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
199
290
  CdkDragHandle,
200
291
  AsyncPipe,
201
292
  IgoLanguageModule
202
- ], template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"drop($event)\">\n <div\n touchleave\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n *ngFor=\"let stop of stopsStore.view.all$() | async; let i = index\"\n cdkDrag\n >\n <div [ngClass]=\"getNgClass(stop)\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getPlaceholder(stop) }}</mat-label>\n <input\n id=\"{{ stop.id }}\"\n type=\"text\"\n [placeholder]=\"getPlaceholder(stop)\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"stop.text\"\n aria-label=\"Number\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"\n (stop.text || stop.coordinates) &&\n stopWithHover &&\n stop.id === stopWithHover.id\n \"\n mat-icon-button\n matSuffix\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.clearStop' | translate\"\n color=\"warn\"\n aria-label=\"Clear\"\n (click)=\"clearStop(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseProposal($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"source.source.enabled === false\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"result.meta ? result.meta.title : ''\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"!stopIsDragged && stopWithHover && stop.id === stopWithHover.id\"\n class=\"igo-form-button-group\"\n >\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n\n <button\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.directionsForm.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .igo-form-button-group{display:flex;align-items:center;padding-left:12px}:host .stops-list{max-width:100%;min-height:60px;display:block;background:#fff;border-radius:4px;overflow:hidden;padding:20px 10px}:host .swipe-vertical{cursor:move}:host .stop-box{color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;background:#fff}:host .stop-box:not(:last-child){margin-bottom:16px}:host .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
293
+ ], template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"dropStop($event)\">\n <div\n *ngFor=\"let stop of stopsStore.view.all$() | async; let stopIndex = index\"\n class=\"stop\"\n >\n <div\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n cdkDrag\n >\n <div class=\"prefix-actions\">\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getInputLabel(stop) }}</mat-label>\n <input\n [id]=\"stop.id\"\n type=\"text\"\n [placeholder]=\"'igo.geo.directions.input.placeholder' | translate\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"currentPosition\"\n mat-icon-button\n matPrefix\n [matTooltip]=\"\n 'igo.geo.directions.input.currentPosition' | translate\n \"\n color=\"accent\"\n (click)=\"useCurrentPosition(stop); $event.stopPropagation()\"\n >\n <mat-icon>my_location</mat-icon>\n </button>\n <button\n *ngIf=\"stop.text || stop.coordinates\"\n mat-icon-button\n matSuffix\n [matTooltip]=\"'igo.geo.directions.input.clearStop' | translate\"\n color=\"warn\"\n (click)=\"clearStopInput(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseOption($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"!source.source.enabled\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <button\n class=\"delete-button\"\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"prefix-actions\">\n <button\n mat-icon-button\n [disabled]=\"\n (stopsStore.count$ | async) !== (stopsFeatureStore.count$ | async) ||\n stopIsDragged\n \"\n [matTooltip]=\"'igo.geo.directions.input.addStop' | translate\"\n color=\"primary\"\n (click)=\"addStop()\"\n >\n <mat-icon>add_location_alt</mat-icon>\n </button>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .stops-list{padding:12px 10px}:host .stops-list,:host .stop{display:flex;flex-flow:column;row-gap:12px}:host .stop:hover .swipe-vertical,:host .stop:hover .delete-button{visibility:visible;display:block}:host .swipe-vertical{visibility:hidden;cursor:move}:host .delete-button{display:none}:host .stop-box{display:flex;align-items:center;justify-content:space-between}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
203
294
  }], ctorParameters: () => [{ type: i1.LanguageService }], propDecorators: { stopsStore: [{
204
- type: Input
295
+ type: Input,
296
+ args: [{ required: true }]
205
297
  }], stopsFeatureStore: [{
206
- type: Input
298
+ type: Input,
299
+ args: [{ required: true }]
207
300
  }], projection: [{
208
- type: Input
301
+ type: Input,
302
+ args: [{ required: true }]
209
303
  }], coordRoundedDecimals: [{
210
304
  type: Input
211
305
  }], debounce: [{
@@ -215,4 +309,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
215
309
  }], stopInputHasFocus: [{
216
310
  type: Output
217
311
  }] } });
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvZGlyZWN0aW9ucy9kaXJlY3Rpb25zLWlucHV0cy9kaXJlY3Rpb25zLWlucHV0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtaW5wdXRzL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsYUFBYSxFQUNiLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxxQkFBcUIsRUFDdEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFB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QUFTOytCQUNFLHVCQUF1QixjQUdyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxLQUFLO3dCQUNMLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsSUFBSTt3QkFDSixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjtvRkFPUSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDZGtEcmFnLFxuICBDZGtEcmFnRHJvcCxcbiAgQ2RrRHJhZ0hhbmRsZSxcbiAgQ2RrRHJvcExpc3QsXG4gIG1vdmVJdGVtSW5BcnJheVxufSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTWF0QXV0b2NvbXBsZXRlLFxuICBNYXRBdXRvY29tcGxldGVNb2R1bGVcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuXG5pbXBvcnQgKiBhcyBvbE9ic2VydmFibGUgZnJvbSAnb2wvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCBwb2ludE9uRmVhdHVyZSBmcm9tICdAdHVyZi9wb2ludC1vbi1mZWF0dXJlJztcblxuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyByb3VuZENvb3JkVG8gfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XG5pbXBvcnQgeyBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmVudW0nO1xuaW1wb3J0IHsgU3RvcCB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbixcbiAgcmVtb3ZlU3RvcEZyb21TdG9yZSxcbiAgdXBkYXRlU3RvcmVTb3J0aW5nXG59IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnV0aWxzJztcbmltcG9ydCB7IFN0b3BzRmVhdHVyZVN0b3JlLCBTdG9wc1N0b3JlIH0gZnJvbSAnLi4vc2hhcmVkL3N0b3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWRpcmVjdGlvbnMtaW5wdXRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENka0Ryb3BMaXN0LFxuICAgIE5nRm9yLFxuICAgIENka0RyYWcsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgQ2RrRHJhZ0hhbmRsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEaXJlY3Rpb25zSW5wdXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnZhbGlkS2V5cyA9IFsnQ29udHJvbCcsICdTaGlmdCcsICdBbHQnXTtcbiAgcHJpdmF0ZSBvbk1hcENsaWNrRXZlbnRLZXlzID0gW107XG4gIHB1YmxpYyBzdG9wV2l0aEhvdmVyOiBTdG9wO1xuICBwdWJsaWMgc3RvcElzRHJhZ2dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBzdG9wc1N0b3JlOiBTdG9wc1N0b3JlO1xuICBASW5wdXQoKSBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmU7XG4gIEBJbnB1dCgpIHByb2plY3Rpb246IHN0cmluZztcbiAgQElucHV0KCkgY29vcmRSb3VuZGVkRGVjaW1hbHMgPSA2O1xuXG4gIEBJbnB1dCgpIGRlYm91bmNlID0gMjAwO1xuICBASW5wdXQoKSBsZW5ndGggPSAyO1xuXG4gIEBPdXRwdXQoKSBzdG9wSW5wdXRIYXNGb2N1czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTtcbiAgfVxuICBvblN0b3BFbnRlcihzdG9wOiBTdG9wKSB7XG4gICAgdGhpcy5zdG9wV2l0aEhvdmVyID0gc3RvcDtcbiAgfVxuICBvblN0b3BMZWF2ZSgpIHtcbiAgICB0aGlzLnN0b3BXaXRoSG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRPcHRpb25UZXh0KG9wdGlvbikge1xuICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHJldHVybiBvcHRpb24/Lm1ldGEgPyBvcHRpb24ubWV0YS50aXRsZSA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgY2hvb3NlUHJvcG9zYWwoXG4gICAgZXZlbnQ6IHsgc291cmNlOiBNYXRBdXRvY29tcGxldGU7IG9wdGlvbjogTWF0T3B0aW9uIH0sXG4gICAgc3RvcDogU3RvcFxuICApIHtcbiAgICBjb25zdCByZXN1bHQ6IEZlYXR1cmUgPSBldmVudC5vcHRpb24udmFsdWU7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgbGV0IGdlb21Db29yZDtcbiAgICAgIGNvbnN0IGdlb20gPSByZXN1bHQuZ2VvbWV0cnk7XG4gICAgICBpZiAoZ2VvbS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGdlb21Db29yZCA9IGdlb20uY29vcmRpbmF0ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50T25GZWF0dXJlKHJlc3VsdC5nZW9tZXRyeSk7XG4gICAgICAgIGdlb21Db29yZCA9IFtcbiAgICAgICAgICBwb2ludC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcbiAgICAgICAgICBwb2ludC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGdlb21Db29yZCkge1xuICAgICAgICBzdG9wLmNvb3JkaW5hdGVzID0gZ2VvbUNvb3JkO1xuICAgICAgICBzdG9wLnRleHQgPSByZXN1bHQubWV0YS50aXRsZTtcbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRTdG9wVGV4dChldmVudDogS2V5Ym9hcmRFdmVudCwgc3RvcDogU3RvcCkge1xuICAgIHRoaXMudW5saXN0ZW5NYXBTaW5nbGVDbGljaygpO1xuICAgIGNvbnN0IHRlcm0gPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGlmICh0ZXJtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhclN0b3Aoc3RvcCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRlVGVybSh0ZXJtKSkge1xuICAgICAgc3RvcC50ZXh0ID0gdGVybTtcbiAgICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVUZXJtKHRlcm06IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMua2V5SXNWYWxpZCh0ZXJtKSAmJlxuICAgICAgKHRlcm0ubGVuZ3RoID49IHRoaXMubGVuZ3RoIHx8IHRlcm0ubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUga2V5SXNWYWxpZChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmludmFsaWRLZXlzLmZpbmQoKHZhbHVlKSA9PiB2YWx1ZSA9PT0ga2V5KSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TmdDbGFzcyhzdG9wOiBTdG9wKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc3RvcFdpdGhIb3Zlcikge1xuICAgICAgcmV0dXJuICdpZ28taW5wdXQtY29udGFpbmVyJztcbiAgICB9IGVsc2UgaWYgKHN0b3AuaWQgPT09IHRoaXMuc3RvcFdpdGhIb3Zlci5pZCkge1xuICAgICAgcmV0dXJuICdpZ28taW5wdXQtY29udGFpbmVyIHJlZHVjZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnaWdvLWlucHV0LWNvbnRhaW5lcic7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGxhY2Vob2xkZXIoc3RvcDogU3RvcCk6IHN0cmluZyB7XG4gICAgbGV0IGV4dHJhID0gJyc7XG4gICAgaWYgKHN0b3AucmVsYXRpdmVQb3NpdGlvbikge1xuICAgICAgaWYgKFxuICAgICAgICBzdG9wLnJlbGF0aXZlUG9zaXRpb24gPT09IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkludGVybWVkaWF0ZVxuICAgICAgKSB7XG4gICAgICAgIGV4dHJhID0gJyAjJyArIHN0b3AucG9zaXRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS4nICsgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uXG4gICAgICAgICkgKyBleHRyYVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0b3Aoc3RvcDogU3RvcCkge1xuICAgIHJlbW92ZVN0b3BGcm9tU3RvcmUodGhpcy5zdG9wc1N0b3JlLCBzdG9wKTtcbiAgfVxuXG4gIGNsZWFyU3RvcChzdG9wOiBTdG9wKSB7XG4gICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZSh7XG4gICAgICBpZDogc3RvcC5pZCxcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHN0b3AucmVsYXRpdmVQb3NpdGlvbixcbiAgICAgIHBvc2l0aW9uOiBzdG9wLnBvc2l0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcbiAgICB0aGlzLm1vdmVTdG9wcyhldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlU3RvcHMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xuICAgICAgY29uc3Qgc3RvcHMgPSBbLi4udGhpcy5zdG9wc1N0b3JlLnZpZXcuYWxsKCldO1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KHN0b3BzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgc3RvcHMubWFwKChzdG9wLCBpKSA9PiB7XG4gICAgICAgIHN0b3AucmVsYXRpdmVQb3NpdGlvbiA9IGNvbXB1dGVSZWxhdGl2ZVBvc2l0aW9uKGksIHN0b3BzLmxlbmd0aCk7XG4gICAgICAgIHN0b3AucG9zaXRpb24gPSBpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnN0b3BzU3RvcmUudXBkYXRlTWFueShzdG9wcyk7XG4gICAgICB1cGRhdGVTdG9yZVNvcnRpbmcodGhpcy5zdG9wc1N0b3JlKTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0Rm9jdXMoc3RvcDogU3RvcCkge1xuICAgIGlmICghc3RvcC50ZXh0IHx8IHN0b3AudGV4dD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTtcbiAgICAgIHRoaXMuc3RvcElucHV0SGFzRm9jdXMuZW1pdCh0cnVlKTtcbiAgICAgIHRoaXMubGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5NYXBTaW5nbGVDbGljayhzdG9wOiBTdG9wKSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAub2wub25jZShcbiAgICAgICdzaW5nbGVjbGljaycsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpY2tDb29yZGluYXRlcyA9IG9sUHJvai50cmFuc2Zvcm0oXG4gICAgICAgICAgZXZlbnQuY29vcmRpbmF0ZSxcbiAgICAgICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlLmxheWVyLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICAgICApO1xuICAgICAgICBjb25zdCByb3VuZGVkQ29vcmQgPSByb3VuZENvb3JkVG8oXG4gICAgICAgICAgY2xpY2tDb29yZGluYXRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgIHRoaXMuY29vcmRSb3VuZGVkRGVjaW1hbHNcbiAgICAgICAgKTtcbiAgICAgICAgc3RvcC50ZXh0ID0gcm91bmRlZENvb3JkLmpvaW4oJywnKTtcbiAgICAgICAgc3RvcC5jb29yZGluYXRlcyA9IHJvdW5kZWRDb29yZDtcbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9wSW5wdXRIYXNGb2N1cy5lbWl0KGZhbHNlKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICBwcml2YXRlIHVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKSB7XG4gICAgdGhpcy5vbk1hcENsaWNrRXZlbnRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBvbE9ic2VydmFibGUudW5CeUtleShrZXkpO1xuICAgIH0pO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cyA9IFtdO1xuICB9XG59XG4iLCI8ZGl2IGNka0Ryb3BMaXN0IGNsYXNzPVwic3RvcHMtbGlzdFwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICB0b3VjaGxlYXZlXG4gICAgKHRvdWNoZW50ZXIpPVwib25TdG9wRW50ZXIoc3RvcClcIlxuICAgICh0b3VjaGxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgIChtb3VzZW92ZXIpPVwib25TdG9wRW50ZXIoc3RvcClcIlxuICAgIChtb3VzZWxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgIChjZGtEcmFnU3RhcnRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gdHJ1ZVwiXG4gICAgKGNka0RyYWdFbmRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gZmFsc2VcIlxuICAgIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgIGNsYXNzPVwic3RvcC1ib3hcIlxuICAgICpuZ0Zvcj1cImxldCBzdG9wIG9mIHN0b3BzU3RvcmUudmlldy5hbGwkKCkgfCBhc3luYzsgbGV0IGkgPSBpbmRleFwiXG4gICAgY2RrRHJhZ1xuICA+XG4gICAgPGRpdiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKHN0b3ApXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7IGdldFBsYWNlaG9sZGVyKHN0b3ApIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGlkPVwie3sgc3RvcC5pZCB9fVwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcihzdG9wKVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic3RvcC50ZXh0XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTnVtYmVyXCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoc3RvcClcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcC50ZXh0XCJcbiAgICAgICAgICAoa2V5dXApPVwic2V0U3RvcFRleHQoJGV2ZW50LCBzdG9wKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHN0b3AudGV4dCB8fCBzdG9wLmNvb3JkaW5hdGVzKSAmJlxuICAgICAgICAgICAgc3RvcFdpdGhIb3ZlciAmJlxuICAgICAgICAgICAgc3RvcC5pZCA9PT0gc3RvcFdpdGhIb3Zlci5pZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uY2xlYXJTdG9wJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXJcIlxuICAgICAgICAgIChjbGljayk9XCJjbGVhclN0b3Aoc3RvcClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZ2V0T3B0aW9uVGV4dFwiXG4gICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJjaG9vc2VQcm9wb3NhbCgkZXZlbnQsIHN0b3ApXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtb3B0Z3JvdXBcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzb3VyY2Ugb2Ygc3RvcC5zZWFyY2hQcm9wb3NhbHNcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInNvdXJjZS5zb3VyY2UudGl0bGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNvdXJjZS5zb3VyY2UuZW5hYmxlZCA9PT0gZmFsc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByZXN1bHQgb2Ygc291cmNlLnJlc3VsdHNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwicmVzdWx0XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJyB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCIhc3RvcElzRHJhZ2dlZCAmJiBzdG9wV2l0aEhvdmVyICYmIHN0b3AuaWQgPT09IHN0b3BXaXRoSG92ZXIuaWRcIlxuICAgICAgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJzd2lwZS12ZXJ0aWNhbFwiXG4gICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5tb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIoc3RvcHNTdG9yZS5jb3VudCQgfCBhc3luYykgPiAyXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5yZW1vdmVTdG9wJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVTdG9wKHN0b3ApXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvZGlyZWN0aW9ucy9kaXJlY3Rpb25zLWlucHV0cy9kaXJlY3Rpb25zLWlucHV0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtaW5wdXRzL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsYUFBYSxFQUNiLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxxQkFBcUIsRUFDdEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFB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QUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO3dHQTFSVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixvVUM3RXRDLHluSEFnSEEscXdCRHJESSxXQUFXLDhmQUNYLEtBQUssbUhBQ0wsT0FBTyx1Y0FFUCxrQkFBa0IsNGlCQUNsQixjQUFjLDBXQUNkLFdBQVcsOG1CQUNYLHFCQUFxQix5OUJBQ3JCLGdCQUFnQiw2VEFDaEIsSUFBSSw0RkFDSixlQUFlLDJJQUNmLGFBQWEsbUxBQ2IsZUFBZSwrQkFDZixhQUFhLDBGQUNiLFNBQVMsNkNBQ1QsaUJBQWlCOzs0RkFHUix5QkFBeUI7a0JBeEJyQyxTQUFTOytCQUNFLHVCQUF1QixjQUdyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxLQUFLO3dCQUNMLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsSUFBSTt3QkFDSixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjtvRkFHMEIsVUFBVTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsaUJBQWlCO3NCQUEzQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxVQUFVO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENka0RyYWcsXG4gIENka0RyYWdEcm9wLFxuICBDZGtEcmFnSGFuZGxlLFxuICBDZGtEcm9wTGlzdCxcbiAgbW92ZUl0ZW1JbkFycmF5XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBNYXRBdXRvY29tcGxldGUsXG4gIE1hdEF1dG9jb21wbGV0ZU1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdE9wdGlvbiwgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IElnb0xhbmd1YWdlTW9kdWxlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5cbmltcG9ydCAqIGFzIG9sT2JzZXJ2YWJsZSBmcm9tICdvbC9PYnNlcnZhYmxlJztcbmltcG9ydCB7IENvb3JkaW5hdGUgfSBmcm9tICdvbC9jb29yZGluYXRlJztcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCBwb2ludE9uRmVhdHVyZSBmcm9tICdAdHVyZi9wb2ludC1vbi1mZWF0dXJlJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnZ2VvanNvbic7XG5cbmltcG9ydCB7XG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVHZW9tZXRyeVxufSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgcm91bmRDb29yZFRvLCByb3VuZENvb3JkVG9TdHJpbmcgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XG5pbXBvcnQgeyBTdG9wIH0gZnJvbSAnLi4vc2hhcmVkL2RpcmVjdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIGFkZFN0b3BUb1N0b3JlLFxuICBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbixcbiAgcmVtb3ZlU3RvcEZyb21TdG9yZSxcbiAgdXBkYXRlU3RvcmVTb3J0aW5nXG59IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnV0aWxzJztcbmltcG9ydCB7IFN0b3BzRmVhdHVyZVN0b3JlLCBTdG9wc1N0b3JlIH0gZnJvbSAnLi4vc2hhcmVkL3N0b3JlJztcbmltcG9ydCB7IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlIH0gZnJvbSAnLi8uLi9zaGFyZWQvZGlyZWN0aW9ucy5lbnVtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWRpcmVjdGlvbnMtaW5wdXRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENka0Ryb3BMaXN0LFxuICAgIE5nRm9yLFxuICAgIENka0RyYWcsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgQ2RrRHJhZ0hhbmRsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEaXJlY3Rpb25zSW5wdXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3RvcHNTdG9yZTogU3RvcHNTdG9yZTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3RvcHNGZWF0dXJlU3RvcmU6IFN0b3BzRmVhdHVyZVN0b3JlO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwcm9qZWN0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvb3JkUm91bmRlZERlY2ltYWxzID0gNjtcbiAgQElucHV0KCkgZGVib3VuY2UgPSAyMDA7XG4gIEBJbnB1dCgpIGxlbmd0aCA9IDI7XG4gIEBPdXRwdXQoKSBzdG9wSW5wdXRIYXNGb2N1czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRLZXlzOiBzdHJpbmdbXSA9IFsnQ29udHJvbCcsICdTaGlmdCcsICdBbHQnXTtcbiAgcHJpdmF0ZSBvbk1hcENsaWNrRXZlbnRLZXlzID0gW107XG4gIHB1YmxpYyBzdG9wV2l0aEhvdmVyOiBTdG9wO1xuICBwdWJsaWMgc3RvcElzRHJhZ2dlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIHByb3BlcnR5IG9mIHRoZSBnZW9sb2NhdGlvbkNvbnRyb2xsZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0JlaGF2aW9yU3ViamVjdDxib29sZWFuPiB8IHVuZGVmaW5lZH0gVGhlIHBvc2l0aW9uIHByb3BlcnR5IG9mXG4gICAqIHRoZSBnZW9sb2NhdGlvbkNvbnRyb2xsZXIuXG4gICAqL1xuICBnZXQgY3VycmVudFBvc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlPy5tYXA/Lmdlb2xvY2F0aW9uQ29udHJvbGxlcj8ucG9zaXRpb24kPy52YWx1ZVxuICAgICAgICA/LnBvc2l0aW9uICYmXG4gICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlPy5tYXA/Lmdlb2xvY2F0aW9uQ29udHJvbGxlcj8udHJhY2tpbmdcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0b3Agd2l0aCBob3ZlciB0byB0aGUgZ2l2ZW4gc3RvcC5cbiAgICpcbiAgICogQHBhcmFtIHtTdG9wfSBzdG9wIC0gVGhlIHN0b3AgdG8gc2V0IGFzIHRoZSBzdG9wIHdpdGggaG92ZXIuXG4gICAqL1xuICBvblN0b3BFbnRlcihzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wV2l0aEhvdmVyID0gc3RvcDtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgc3RvcCB3aXRoIGhvdmVyIHRvIHVuZGVmaW5lZC5cbiAgICpcbiAgICovXG4gIG9uU3RvcExlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFdpdGhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RvcCB0byB0aGUgc3RvcHMgc3RvcmUuXG4gICAqXG4gICAqL1xuICBhZGRTdG9wKCk6IHZvaWQge1xuICAgIGFkZFN0b3BUb1N0b3JlKHRoaXMuc3RvcHNTdG9yZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIG9wdGlvbiBpZiBpdCBpcyBhbiBvYmplY3QgYW5kIGhhcyBhIG1ldGEgcHJvcGVydHkgd2l0aCBhIHRpdGxlLFxuICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgb3B0aW9uIGl0c2VsZi5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IG9wdGlvbiAtIFRoZSBvcHRpb24gdG8gZ2V0IHRoZSB0ZXh0IGZyb20uXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRpdGxlIG9mIHRoZSBvcHRpb24gaWYgaXQgaXMgYW4gb2JqZWN0IGFuZCBoYXMgYSBtZXRhIHByb3BlcnR5IHdpdGggYSB0aXRsZSxcbiAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIG9wdGlvbiBpdHNlbGYuXG4gICAqL1xuICBnZXRPcHRpb25UZXh0KG9wdGlvbjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBjb25zdCB7IG1ldGEgfSA9IG9wdGlvbjtcbiAgICAgIHJldHVybiBtZXRhPy50aXRsZSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaG9vc2VzIGFuIG9wdGlvbiBmcm9tIGEgTWF0QXV0b2NvbXBsZXRlIGFuZCB1cGRhdGVzIHRoZSBzdG9wIGNvb3JkaW5hdGVzIGFuZCB0ZXh0XG4gICAqIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBmZWF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE1hdEF1dG9jb21wbGV0ZSBhbmQgTWF0T3B0aW9uLlxuICAgKiBAcGFyYW0ge01hdEF1dG9jb21wbGV0ZX0gZXZlbnQuc291cmNlIC0gVGhlIE1hdEF1dG9jb21wbGV0ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB7TWF0T3B0aW9ufSBldmVudC5vcHRpb24gLSBUaGUgc2VsZWN0ZWQgTWF0T3B0aW9uLlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCBvYmplY3QgdG8gdXBkYXRlLlxuICAgKi9cbiAgY2hvb3NlT3B0aW9uKFxuICAgIGV2ZW50OiB7IHNvdXJjZTogTWF0QXV0b2NvbXBsZXRlOyBvcHRpb246IE1hdE9wdGlvbiB9LFxuICAgIHN0b3A6IFN0b3BcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZTogRmVhdHVyZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgbGV0IGNvb3JkczogQ29vcmRpbmF0ZTtcbiAgICAgIGNvbnN0IGdlb21ldHJ5OiBGZWF0dXJlR2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXMgYXMgUG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50T25GZWF0dXJlKGZlYXR1cmUuZ2VvbWV0cnkpO1xuICAgICAgICBjb29yZHMgPSBbcG9pbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIHBvaW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgc3RvcC5jb29yZGluYXRlcyA9IGNvb3JkcztcbiAgICAgICAgc3RvcC50ZXh0ID0gZmVhdHVyZS5tZXRhLnRpdGxlO1xuICAgICAgICB0aGlzLnN0b3BzU3RvcmUudXBkYXRlKHN0b3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0IG9mIGEgc3RvcCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUga2V5Ym9hcmQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSBpbnB1dCBmaWVsZC5cbiAgICogQHBhcmFtIHtTdG9wfSBzdG9wIC0gVGhlIHN0b3Agb2JqZWN0IHRvIHVwZGF0ZS5cbiAgICovXG4gIHNldFN0b3BUZXh0KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gICAgY29uc3Qgc2VhcmNoVGVybTogc3RyaW5nID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBpZiAoc2VhcmNoVGVybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJTdG9wSW5wdXQoc3RvcCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRlU2VhcmNoVGVybShzZWFyY2hUZXJtKSkge1xuICAgICAgc3RvcC50ZXh0ID0gc2VhcmNoVGVybTtcbiAgICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHNlYXJjaCB0ZXJtIGJ5IGNoZWNraW5nIGlmIGl0IGNvbnRhaW5zIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kIGlmIGl0cyBsZW5ndGggaXMgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hUZXJtIC0gVGhlIHNlYXJjaCB0ZXJtIHRvIGJlIHZhbGlkYXRlZC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWFyY2ggdGVybSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhcmFjdGVyc0FyZVZhbGlkOiBib29sZWFuID1cbiAgICAgIHRoaXMuaW52YWxpZEtleXMuaW5kZXhPZihzZWFyY2hUZXJtKSA9PT0gLTE7XG4gICAgY29uc3QgbGVuZ3RoSXNWYWxpZDogYm9vbGVhbiA9XG4gICAgICBzZWFyY2hUZXJtLmxlbmd0aCA+PSB0aGlzLmxlbmd0aCB8fCBzZWFyY2hUZXJtLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gY2hhcmFjdGVyc0FyZVZhbGlkICYmIGxlbmd0aElzVmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBzdG9wIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCBjb250YWluaW5nIHJlbGF0aXZlUG9zaXRpb24gYW5kIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBsYWJlbCBmb3IgdGhlIHN0b3AgaW5wdXQuXG4gICAqL1xuICBnZXRJbnB1dExhYmVsKHN0b3A6IFN0b3ApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQb3NpdGlvbiwgcG9zaXRpb24gfSA9IHN0b3A7XG4gICAgY29uc3QgbGFiZWw6IHN0cmluZyA9IHJlbGF0aXZlUG9zaXRpb25cbiAgICAgID8gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC4ke3JlbGF0aXZlUG9zaXRpb259YFxuICAgICAgICApXG4gICAgICA6ICcnO1xuICAgIHJldHVybiByZWxhdGl2ZVBvc2l0aW9uID09PSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5JbnRlcm1lZGlhdGVcbiAgICAgID8gYCR7bGFiZWx9ICMke3Bvc2l0aW9ufWBcbiAgICAgIDogbGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHN0b3AgZnJvbSB0aGUgc3RvcHMgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIG9iamVjdCB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlU3RvcChzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgcmVtb3ZlU3RvcEZyb21TdG9yZSh0aGlzLnN0b3BzU3RvcmUsIHN0b3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIHN0b3AgaW4gdGhlIHN0b3BzIHN0b3JlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byBiZSBjbGVhcmVkLlxuICAgKi9cbiAgY2xlYXJTdG9wSW5wdXQoc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoe1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiBzdG9wLnJlbGF0aXZlUG9zaXRpb24sXG4gICAgICBwb3NpdGlvbjogc3RvcC5wb3NpdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcyBhIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIHVwZGF0ZSB3aXRoIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgKi9cbiAgdXNlQ3VycmVudFBvc2l0aW9uKHN0b3A6IFN0b3ApOiB2b2lkIHtcbiAgICB0aGlzLnVzZUNvb3JkaW5hdGVzQXNTdG9wKFxuICAgICAgdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5tYXAuZ2VvbG9jYXRpb25Db250cm9sbGVyLnBvc2l0aW9uJC52YWx1ZS5wb3NpdGlvbixcbiAgICAgIHN0b3BcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgc3RvcCBpbiB0aGUgbGlzdCBvZiBzdG9wcy4uXG4gICAqXG4gICAqIEBwYXJhbSB7Q2RrRHJhZ0Ryb3A8c3RyaW5nW10+fSBldmVudCAtIFRoZSBldmVudCBjb250YWluaW5nIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBpbmRleCBvZiB0aGUgZHJvcHBlZCBzdG9wLlxuICAgKi9cbiAgZHJvcFN0b3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPik6IHZvaWQge1xuICAgIHRoaXMubW92ZVN0b3BzKGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSBzdG9wIGluIHRoZSBsaXN0IG9mIHN0b3BzIGZyb20gb25lIGluZGV4IHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggLSBUaGUgaW5kZXggdG8gbW92ZSB0aGUgc3RvcCBmcm9tLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCAtIFRoZSBpbmRleCB0byBtb3ZlIHRoZSBzdG9wIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlU3RvcHMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmcm9tSW5kZXggIT09IHRvSW5kZXgpIHtcbiAgICAgIGNvbnN0IHN0b3BzOiBTdG9wW10gPSBbLi4udGhpcy5zdG9wc1N0b3JlLnZpZXcuYWxsKCldO1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KHN0b3BzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgc3RvcHMubWFwKChzdG9wLCBzdG9wSW5kZXgpID0+IHtcbiAgICAgICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICAgICAgc3RvcEluZGV4LFxuICAgICAgICAgIHN0b3BzLmxlbmd0aCAtIDFcbiAgICAgICAgKTtcbiAgICAgICAgc3RvcC5wb3NpdGlvbiA9IHN0b3BJbmRleDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZU1hbnkoc3RvcHMpO1xuICAgICAgdXBkYXRlU3RvcmVTb3J0aW5nKHRoaXMuc3RvcHNTdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGZvY3VzIGV2ZW50IG9uIGFuIGlucHV0IGZpZWxkIGZvciBhIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRoYXQgdGhlIGlucHV0IGZpZWxkIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIG9uSW5wdXRGb2N1cyhzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gICAgdGhpcy5zdG9wSW5wdXRIYXNGb2N1cy5lbWl0KHRydWUpO1xuICAgIHRoaXMubGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgYSBzaW5nbGUgY2xpY2sgZXZlbnQgb24gdGhlIG1hcCBhbmQgdXNlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNsaWNrXG4gICAqIHRvIHNldCB0aGUgZ2l2ZW4gc3RvcCdzIGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byB1cGRhdGUgd2l0aCB0aGUgY2xpY2tlZCBjb29yZGluYXRlcy5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIGNvbnN0IGtleTogRXZlbnRzS2V5ID0gdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAub2wub25jZShcbiAgICAgICdzaW5nbGVjbGljaycsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy51c2VDb29yZGluYXRlc0FzU3RvcChldmVudC5jb29yZGluYXRlLCBzdG9wKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVW5saXN0ZW5zIGZvciBtYXAgc2luZ2xlIGNsaWNrIGV2ZW50cyBhbmQgY2xlYXJzIHRoZSBsaXN0IG9mIGV2ZW50IGtleXMuXG4gICAqL1xuICBwcml2YXRlIHVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbk1hcENsaWNrRXZlbnRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBvbE9ic2VydmFibGUudW5CeUtleShrZXkpO1xuICAgIH0pO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4gc3RvcC5cbiAgICpcbiAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZGluYXRlcyAtIFRoZSBjb29yZGluYXRlcyB0byB0cmFuc2Zvcm0gYW5kIHJvdW5kLlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byB1cGRhdGUgd2l0aCB0aGUgbmV3IGNvb3JkaW5hdGVzIGFuZCB0ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VDb29yZGluYXRlc0FzU3RvcChjb29yZGluYXRlczogQ29vcmRpbmF0ZSwgc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIGNvbnN0IHByb2plY3RlZENvb3JkaW5hdGVzOiBDb29yZGluYXRlID0gb2xQcm9qLnRyYW5zZm9ybShcbiAgICAgIGNvb3JkaW5hdGVzLFxuICAgICAgdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAucHJvamVjdGlvbixcbiAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICk7XG4gICAgY29uc3Qgcm91bmRlZENvb3JkaW5hdGVzOiBDb29yZGluYXRlID0gcm91bmRDb29yZFRvKFxuICAgICAgcHJvamVjdGVkQ29vcmRpbmF0ZXMsXG4gICAgICB0aGlzLmNvb3JkUm91bmRlZERlY2ltYWxzXG4gICAgKTtcblxuICAgIHN0b3AudGV4dCA9IHJvdW5kQ29vcmRUb1N0cmluZyhcbiAgICAgIHByb2plY3RlZENvb3JkaW5hdGVzLFxuICAgICAgdGhpcy5jb29yZFJvdW5kZWREZWNpbWFsc1xuICAgICkuam9pbignLCAnKTtcbiAgICBzdG9wLmNvb3JkaW5hdGVzID0gcm91bmRlZENvb3JkaW5hdGVzO1xuICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BJbnB1dEhhc0ZvY3VzLmVtaXQoZmFsc2UpO1xuICAgIH0sIDUwMCk7XG4gIH1cbn1cbiIsIjxkaXYgY2RrRHJvcExpc3QgY2xhc3M9XCJzdG9wcy1saXN0XCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wU3RvcCgkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICAqbmdGb3I9XCJsZXQgc3RvcCBvZiBzdG9wc1N0b3JlLnZpZXcuYWxsJCgpIHwgYXN5bmM7IGxldCBzdG9wSW5kZXggPSBpbmRleFwiXG4gICAgY2xhc3M9XCJzdG9wXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgICh0b3VjaGVudGVyKT1cIm9uU3RvcEVudGVyKHN0b3ApXCJcbiAgICAgICh0b3VjaGxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgICAgKG1vdXNlb3Zlcik9XCJvblN0b3BFbnRlcihzdG9wKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJvblN0b3BMZWF2ZSgpXCJcbiAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gdHJ1ZVwiXG4gICAgICAoY2RrRHJhZ0VuZGVkKT1cInN0b3BJc0RyYWdnZWQgPSBmYWxzZVwiXG4gICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgIGNsYXNzPVwic3RvcC1ib3hcIlxuICAgICAgY2RrRHJhZ1xuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmVmaXgtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJzd2lwZS12ZXJ0aWNhbFwiXG4gICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQubW92ZVN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPnt7IGdldElucHV0TGFiZWwoc3RvcCkgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtpZF09XCJzdG9wLmlkXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LnBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cyhzdG9wKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0b3AudGV4dFwiXG4gICAgICAgICAgICAoa2V5dXApPVwic2V0U3RvcFRleHQoJGV2ZW50LCBzdG9wKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50UG9zaXRpb25cIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBtYXRQcmVmaXhcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LmN1cnJlbnRQb3NpdGlvbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXNlQ3VycmVudFBvc2l0aW9uKHN0b3ApOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5teV9sb2NhdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzdG9wLnRleHQgfHwgc3RvcC5jb29yZGluYXRlc1wiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC5jbGVhclN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTdG9wSW5wdXQoc3RvcClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImdldE9wdGlvblRleHRcIlxuICAgICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cImNob29zZU9wdGlvbigkZXZlbnQsIHN0b3ApXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LW9wdGdyb3VwXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzb3VyY2Ugb2Ygc3RvcC5zZWFyY2hQcm9wb3NhbHNcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwic291cmNlLnNvdXJjZS50aXRsZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc291cmNlLnNvdXJjZS5lbmFibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcmVzdWx0IG9mIHNvdXJjZS5yZXN1bHRzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicmVzdWx0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJyB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJkZWxldGUtYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCIoc3RvcHNTdG9yZS5jb3VudCQgfCBhc3luYykgPiAyXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQucmVtb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAoY2xpY2spPVwicmVtb3ZlU3RvcChzdG9wKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHJlZml4LWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgKHN0b3BzU3RvcmUuY291bnQkIHwgYXN5bmMpICE9PSAoc3RvcHNGZWF0dXJlU3RvcmUuY291bnQkIHwgYXN5bmMpIHx8XG4gICAgICAgIHN0b3BJc0RyYWdnZWRcbiAgICAgIFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LmFkZFN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAoY2xpY2spPVwiYWRkU3RvcCgpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+YWRkX2xvY2F0aW9uX2FsdDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=