@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
@@ -1,5 +1,6 @@
1
+ import { FlatTreeControl } from '@angular/cdk/tree';
1
2
  import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Input, Output } from '@angular/core';
3
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
4
  import { FormsModule } from '@angular/forms';
4
5
  import { MatBadgeModule } from '@angular/material/badge';
5
6
  import { MatButtonModule } from '@angular/material/button';
@@ -9,833 +10,223 @@ import { MatIconModule } from '@angular/material/icon';
9
10
  import { MatMenuModule } from '@angular/material/menu';
10
11
  import { MatSliderModule } from '@angular/material/slider';
11
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
+ import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';
14
+ import { TreeDragDropDirective } from '@igo2/common/drag-drop';
15
+ import { IgoIconComponent, VECTOR_SQUARE_ICON } from '@igo2/common/icon';
12
16
  import { ListComponent, ListItemDirective } from '@igo2/common/list';
13
17
  import { PanelComponent } from '@igo2/common/panel';
14
18
  import { IgoLanguageModule } from '@igo2/core/language';
15
- import * as olextent from 'ol/extent';
16
- import { BehaviorSubject, EMPTY, ReplaySubject, timer } from 'rxjs';
17
- import { debounce } from 'rxjs/operators';
18
- import scrollIntoView from 'scroll-into-view-if-needed';
19
- import { getAllChildLayersByProperty, getRootParentByProperty } from '../../map/shared/linkedLayers.utils';
20
- import { IgoMap } from '../../map/shared/map';
21
- import { LayerItemComponent } from '../layer-item/layer-item.component';
22
- import { LayerListToolComponent } from '../layer-list-tool/layer-list-tool.component';
23
- import { LayerService } from '../shared/layer.service';
24
- import { LinkedProperties } from '../shared/layers/layer.interface';
25
- import { LayerListControlsEnum, LayerListDisplacement } from './layer-list.enum';
26
- import { LayerListSelectVisibleEnum } from './layer-list.enum';
19
+ import { MessageService } from '@igo2/core/message';
20
+ import { LayerGroupComponent } from '../layer-group';
21
+ import { LayerItemComponent } from '../layer-item';
22
+ import { LayerListToolComponent } from '../layer-list-tool';
23
+ import { isLayerGroup, isLayerItem } from '../utils/layer.utils';
27
24
  import * as i0 from "@angular/core";
28
- import * as i1 from "../shared/layer.service";
29
- import * as i2 from "@angular/material/checkbox";
30
- import * as i3 from "@angular/material/divider";
31
- import * as i4 from "@angular/material/button";
32
- import * as i5 from "@angular/material/tooltip";
33
- import * as i6 from "@angular/material/icon";
34
- import * as i7 from "@angular/material/badge";
35
- import * as i8 from "@angular/material/menu";
36
- import * as i9 from "@angular/material/slider";
37
- import * as i10 from "@angular/forms";
38
- import * as i11 from "@ngx-translate/core";
39
- // TODO: This class could use a clean up. Also, some methods could be moved ealsewhere
25
+ import * as i1 from "@igo2/core/message";
26
+ import * as i2 from "@angular/material/button";
27
+ import * as i3 from "@angular/material/icon";
28
+ import * as i4 from "@angular/material/tree";
40
29
  export class LayerListComponent {
41
- elRef;
42
- layerService;
43
- orderable = true;
44
- thresholdToFilterAndSort = 5;
45
- layers$ = new BehaviorSubject([]);
46
- change$ = new ReplaySubject(1);
47
- showToolbar$ = new BehaviorSubject(false);
48
- layerTool;
49
- hideSelectedLayers = true;
50
- activeLayer$ = new BehaviorSubject(undefined);
51
- layersChecked = [];
52
- selection;
53
- change$$;
54
- layers$$;
55
- layerItemChangeDetection$ = new BehaviorSubject(undefined);
56
- templateLayerToolbar;
57
- layersAreAllVisible = true;
58
- ogcButton = true;
59
- timeButton = true;
60
- get map() {
61
- return this._map;
62
- }
63
- set map(value) {
64
- this._map = value;
65
- }
66
- _map;
67
- set layers(value) {
68
- this._layers = this.removeProblemLayerInList(value);
69
- this.next();
30
+ messageService;
31
+ toggleOpacity = false;
32
+ isInit;
33
+ controller;
34
+ set layers(layers) {
35
+ this._layers = layers;
36
+ this.updateDatasource(layers ?? []);
70
37
  }
71
38
  get layers() {
72
39
  return this._layers;
73
40
  }
74
41
  _layers;
75
- set activeLayer(value) {
76
- this._activeLayer = value;
77
- this.activeLayer$.next(value);
78
- }
79
- get activeLayer() {
80
- return this._activeLayer;
81
- }
82
- _activeLayer;
83
- floatLabel = 'auto';
84
- layerFilterAndSortOptions = {};
85
- excludeBaseLayers = false;
86
- toggleLegendOnVisibilityChange = false;
87
- expandLegendOfVisibleLayers = false;
88
- updateLegendOnResolutionChange = false;
89
- queryBadge = false;
90
- appliedFilterAndSort = new EventEmitter();
91
- get keyword() {
92
- return this._keyword;
93
- }
94
- set keyword(value) {
95
- this._keyword = value;
96
- this.next();
97
- }
98
- _keyword = undefined;
99
- get onlyVisible() {
100
- return this._onlyVisible;
101
- }
102
- set onlyVisible(value) {
103
- this._onlyVisible = value;
104
- this.next();
105
- }
106
- _onlyVisible = false;
107
- get sortAlpha() {
108
- return this._sortedAlpha;
109
- }
110
- set sortAlpha(value) {
111
- this._sortedAlpha = value;
112
- this.next();
113
- }
114
- _sortedAlpha = false;
115
- get opacity() {
116
- return Math.round(this.activeLayer$.getValue().opacity * 100);
117
- }
118
- set opacity(opacity) {
119
- this.activeLayer$.getValue().opacity = opacity / 100;
120
- }
121
- get badgeOpacity() {
122
- if (this.opacity === 100) {
123
- return;
124
- }
125
- return this.opacity;
126
- }
127
- get raiseDisabled() {
128
- if (!this.orderable ||
129
- this.activeLayer.baseLayer ||
130
- this.getUpperLayer().id === this.activeLayer.id ||
131
- this.isUpperBaselayer(this.activeLayer)) {
132
- return true;
133
- }
134
- return false;
135
- }
136
- get lowerDisabled() {
137
- if (!this.orderable ||
138
- this.activeLayer.baseLayer ||
139
- this.getLowerLayer().id === this.activeLayer.id ||
140
- this.isLowerBaselayer(this.activeLayer)) {
141
- return true;
142
- }
143
- return false;
144
- }
145
- get raiseDisabledSelection() {
146
- if (this.layersChecked.length === 0 ||
147
- !this.orderable ||
148
- !this.raisableLayers(this.layersChecked) ||
149
- this.selectAllCheck === true) {
150
- return true;
151
- }
152
- return false;
153
- }
154
- get lowerDisabledSelection() {
155
- if (this.layersChecked.length === 0 ||
156
- !this.orderable ||
157
- !this.lowerableLayers(this.layersChecked) ||
158
- this.selectAllCheck === true) {
159
- return true;
160
- }
161
- return false;
162
- }
163
- get checkOpacity() {
164
- return this.layersCheckedOpacity() * 100;
165
- }
166
- set checkOpacity(opacity) {
167
- for (const layer of this.layersChecked) {
168
- layer.opacity = opacity / 100;
169
- }
170
- }
171
- get layerListDisplacement() {
172
- return LayerListDisplacement;
173
- }
174
- get unavailableLayers() {
175
- return this.layerService.unavailableLayers;
176
- }
177
- toggleOpacity = false;
178
- selectAllCheck;
179
- selectAllCheck$ = new BehaviorSubject(undefined);
180
- selectAllCheck$$;
181
- constructor(elRef, layerService) {
182
- this.elRef = elRef;
183
- this.layerService = layerService;
184
- }
185
- /**
186
- * Subscribe to the search term stream and trigger researches
187
- * @internal
188
- */
189
- ngOnInit() {
190
- this.change$$ = this.change$
191
- .pipe(debounce(() => {
192
- return this.layers.length === 0 ? EMPTY : timer(50);
193
- }))
194
- .subscribe(() => {
195
- this.showToolbar$.next(this.computeShowToolbar());
196
- this.layers$.next(this.computeLayers(this.layers.slice(0)));
197
- this.appliedFilterAndSort.emit({
198
- keyword: this.keyword,
199
- sortAlpha: this.sortAlpha,
200
- onlyVisible: this.onlyVisible
201
- });
202
- });
203
- this.selectAllCheck$$ = this.selectAllCheck$.subscribe((value) => {
204
- this.selectAllCheck = value;
205
- });
206
- this.layers$$ = this.layers$.subscribe(() => {
207
- if (this.layers) {
208
- let checks = 0;
209
- for (const layer of this.layers) {
210
- layer.status$.subscribe((valStatus) => {
211
- if (valStatus === 0) {
212
- this.map.removeLayer(layer);
213
- }
214
- });
215
- if (layer.options.active) {
216
- this.activeLayer = layer;
217
- this.layerTool = true;
218
- }
219
- if (layer.options.check) {
220
- checks += 1;
221
- }
222
- }
223
- if (this.excludeBaseLayers) {
224
- this.selectAllCheck =
225
- checks ===
226
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length
227
- ? true
228
- : false;
229
- }
230
- else {
231
- this.selectAllCheck =
232
- checks === this.layers.filter((lay) => lay.showInLayerList).length
233
- ? true
234
- : false;
235
- }
236
- }
237
- });
238
- }
239
- ngOnDestroy() {
240
- this.change$$.unsubscribe();
241
- this.selectAllCheck$$.unsubscribe();
242
- this.layers$$.unsubscribe();
243
- }
244
- activeLayerExtentIsValid(layer) {
245
- let valid = false;
246
- if (layer.options.showButtonZoomToExtent === false) {
247
- return false;
248
- }
249
- const layerExtent = layer.options.extent;
250
- const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
251
- if (layerExtent) {
252
- if (maxLayerZoomExtent) {
253
- valid = olextent.containsExtent(maxLayerZoomExtent, layerExtent);
254
- }
255
- else {
256
- valid = true;
257
- }
258
- }
259
- return valid;
260
- }
261
- activeLayersExtentAreValid(layers) {
262
- let valid = false;
263
- const layersExtent = olextent.createEmpty();
264
- const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
265
- for (const layer of layers) {
266
- const layerExtent = layer.options.extent;
267
- if (layerExtent && !layerExtent.includes(Infinity)) {
268
- olextent.extend(layersExtent, layerExtent);
269
- }
270
- }
271
- if (!olextent.isEmpty(layersExtent)) {
272
- if (maxLayerZoomExtent) {
273
- valid = olextent.containsExtent(maxLayerZoomExtent, layersExtent);
274
- }
275
- else {
276
- valid = true;
277
- }
278
- }
279
- return valid;
280
- }
281
- zoomLayerExtents(layer) {
282
- this.map.viewController.zoomToExtent(layer.options.extent);
283
- }
284
- zoomLayersExtents(layers) {
285
- const layersExtent = olextent.createEmpty();
286
- for (const layer of layers) {
287
- const layerExtent = layer.options.extent;
288
- if (layerExtent) {
289
- olextent.extend(layersExtent, layerExtent);
290
- }
291
- }
292
- this.map.viewController.zoomToExtent(layersExtent);
293
- }
294
- changeOpacity(event) {
295
- this.opacity = event.value;
296
- }
297
- clearKeyword() {
298
- this.keyword = undefined;
299
- }
300
- getLowerLayer() {
301
- return this.layers
302
- .filter((l) => !l.baseLayer)
303
- .reduce((prev, current) => {
304
- return prev.zIndex < current.zIndex ? prev : current;
305
- }, { zIndex: undefined, id: undefined });
306
- }
307
- isLowerBaselayer(layer) {
308
- const index = this.layers.findIndex((lay) => layer.id === lay.id);
309
- if (this.layers &&
310
- this.layers[index + 1] &&
311
- this.layers[index + 1].baseLayer === true) {
312
- return true;
313
- }
314
- return false;
315
- }
316
- getUpperLayer() {
317
- return this.layers
318
- .filter((l) => !l.baseLayer)
319
- .reduce((prev, current) => {
320
- return prev.zIndex > current.zIndex ? prev : current;
321
- }, { zIndex: undefined, id: undefined });
322
- }
323
- isUpperBaselayer(layer) {
324
- const index = this.layers.findIndex((lay) => layer.id === lay.id);
325
- if (this.layers &&
326
- this.layers[index - 1] &&
327
- this.layers[index - 1].baseLayer === true) {
328
- return true;
329
- }
330
- return false;
331
- }
332
- moveActiveLayer(activeLayer, actiontype, fromUi = false) {
333
- const sortedLayersToMove = [];
334
- getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
335
- let rootParentByProperty = getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
336
- if (!rootParentByProperty) {
337
- rootParentByProperty = activeLayer;
338
- }
339
- const layersToMove = [rootParentByProperty];
340
- getAllChildLayersByProperty(this.map, rootParentByProperty, layersToMove, LinkedProperties.ZINDEX);
341
- this.layers.map((layer) => {
342
- if (layersToMove.indexOf(layer) !== -1) {
343
- sortedLayersToMove.push(layer);
344
- }
345
- });
346
- if (actiontype === LayerListDisplacement.Raise) {
347
- this.raiseLayers(sortedLayersToMove, fromUi);
348
- }
349
- else if (actiontype === LayerListDisplacement.Lower) {
350
- this.lowerLayers(sortedLayersToMove, fromUi);
351
- }
352
- }
353
- /*
354
- * For selection mode disabled attribute
355
- */
356
- raisableLayers(layers) {
357
- let response = false;
358
- let base = 0;
359
- for (const layer of layers) {
360
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
361
- const currentLayer = this.layers[mapIndex];
362
- if (currentLayer.baseLayer) {
363
- base += 1;
364
- }
365
- const previousLayer = this.layers[mapIndex - 1];
366
- if (previousLayer &&
367
- previousLayer.baseLayer !== true &&
368
- !layers.find((lay) => previousLayer.id === lay.id) &&
369
- currentLayer.baseLayer !== true) {
370
- response = true;
371
- }
372
- }
373
- if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
374
- base === this.layersChecked.length) {
375
- response = false;
376
- }
377
- return response;
378
- }
379
- /*
380
- * When multiple layers is selected but some may be allow to move
381
- */
382
- raisableLayer(index) {
383
- if (index < 1) {
384
- return false;
385
- }
386
- if (this.layers[index - 1].options.check) {
387
- return this.raisableLayer(index - 1);
388
- }
389
- return true;
390
- }
391
- raiseLayers(layers, fromUi = true) {
392
- const layersToRaise = [];
393
- for (const layer of layers) {
394
- const index = this.layers.findIndex((lay) => lay.id === layer.id);
395
- if (this.raisableLayer(index)) {
396
- layersToRaise.push(layer);
397
- }
398
- }
399
- this.map.raiseLayers(layersToRaise);
400
- if (fromUi) {
401
- setTimeout(() => {
402
- const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
403
- const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
404
- let targetToScroll;
405
- if (checkItems.length) {
406
- targetToScroll = checkItems[0];
407
- }
408
- if (itemFocused.length) {
409
- targetToScroll = itemFocused[0];
410
- }
411
- if (targetToScroll) {
412
- scrollIntoView(targetToScroll, {
413
- scrollMode: 'if-needed',
414
- behavior: 'smooth',
415
- block: 'end',
416
- inline: 'nearest'
417
- });
418
- }
419
- }, 100);
42
+ isDesktop;
43
+ isDragDropDisabled;
44
+ selectAll;
45
+ viewerOptions;
46
+ activeChange = new EventEmitter();
47
+ _transformer = (layer, level) => {
48
+ return {
49
+ id: layer.id || layer.options.name,
50
+ isGroup: !!isLayerGroup(layer),
51
+ descendantLevels: isLayerGroup(layer)
52
+ ? layer.descendantsLevel
53
+ : undefined,
54
+ level: level,
55
+ data: layer,
56
+ disabled: false
57
+ };
58
+ };
59
+ treeControl = new FlatTreeControl((node) => node.level, (node) => node.isGroup);
60
+ treeFlattener = new MatTreeFlattener(this._transformer, (node) => node.level, (node) => node.isGroup, (node) => node.children
61
+ .filter((layer) => layer.showInLayerList)
62
+ .sort((a, b) => a.zIndex + b.zIndex));
63
+ dataSource;
64
+ constructor(messageService) {
65
+ this.messageService = messageService;
66
+ this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener, []);
67
+ }
68
+ isGroup = (_, node) => node.isGroup;
69
+ isLayerGroup = isLayerGroup;
70
+ isLayerItem = isLayerItem;
71
+ isSelected = (layer) => this.controller.isSelected(layer);
72
+ isDescendantSelection = (layer) => this.controller.isDescendantSelection(layer);
73
+ toggleActive(layer) {
74
+ const isSelected = this.controller.isSelected(layer);
75
+ this.controller.clearSelection();
76
+ if (!isSelected) {
77
+ this.controller.select(layer);
78
+ }
79
+ this.activeChange.emit(layer);
80
+ }
81
+ handleSelect(checked, layer) {
82
+ checked ? this.controller.select(layer) : this.controller.deselect(layer);
83
+ }
84
+ getLayerType(layer) {
85
+ return layer.type === 'raster'
86
+ ? 'raster'
87
+ : layer.id.includes('measure')
88
+ ? 'measure'
89
+ : layer.id.includes('draw')
90
+ ? 'draw'
91
+ : 'vector';
92
+ }
93
+ getLayerIcon(layer) {
94
+ const type = this.getLayerType(layer);
95
+ return type === 'raster'
96
+ ? layer.baseLayer
97
+ ? 'wallpaper'
98
+ : 'image'
99
+ : type === 'measure'
100
+ ? 'square_foot'
101
+ : type === 'draw'
102
+ ? 'draw'
103
+ : VECTOR_SQUARE_ICON;
104
+ }
105
+ dropNode({ node, ref, position }) {
106
+ let nodesToDrop = [node.data];
107
+ if (this.controller.hasSelection) {
108
+ // The selection could contains data from the outside the TreeController
109
+ nodesToDrop = this.controller.selected.filter((layer) => !!this.findNodeByLayerId(layer.id));
110
+ }
111
+ if (node.isGroup) {
112
+ nodesToDrop = nodesToDrop.filter((nodeDrop) => !node.data.isDescendant(nodeDrop));
113
+ }
114
+ if (ref.isGroup) {
115
+ const isSelected = nodesToDrop.some((nodeDrop) => nodeDrop.id === ref.id);
116
+ if (isSelected) {
117
+ nodesToDrop = nodesToDrop.filter((nodeDrop) => nodeDrop.id !== ref.id);
118
+ }
119
+ }
120
+ if (!nodesToDrop.includes(node.data)) {
121
+ nodesToDrop.push(node.data);
122
+ }
123
+ switch (position) {
124
+ case 'above':
125
+ this.controller.moveAbove(ref.data, ...nodesToDrop);
126
+ break;
127
+ case 'inside':
128
+ this.controller.moveInside(ref.data, ...nodesToDrop);
129
+ break;
130
+ default:
131
+ this.controller.moveBelow(ref.data, ...nodesToDrop);
132
+ break;
420
133
  }
421
134
  }
422
- /*
423
- * For selection mode disabled attribute
424
- */
425
- lowerableLayers(layers) {
426
- let response = false;
427
- let base = 0;
428
- for (const layer of layers) {
429
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
430
- const currentLayer = this.layers[mapIndex];
431
- if (currentLayer.baseLayer) {
432
- base += 1;
433
- }
434
- const nextLayer = this.layers[mapIndex + 1];
435
- if (nextLayer &&
436
- nextLayer.baseLayer !== true &&
437
- !layers.find((lay) => nextLayer.id === lay.id)) {
438
- response = true;
439
- }
440
- }
441
- if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
442
- base === this.layersChecked.length) {
443
- response = false;
444
- }
445
- return response;
135
+ dropNodeError(details) {
136
+ this.messageService.alert(details.message, 'igo.geo.layer.layer', null, details.params);
446
137
  }
447
- /*
448
- * When multiple layers is selected but some may be allow to move
449
- */
450
- lowerableLayer(index) {
451
- if (index >
452
- this.layers.filter((lay) => lay.baseLayer !== true).length - 2) {
453
- return false;
454
- }
455
- if (this.layers[index + 1].options.check) {
456
- return this.lowerableLayer(index + 1);
138
+ dragStart() {
139
+ if (this.viewerOptions.mode === 'selection') {
140
+ return;
457
141
  }
458
- return true;
142
+ this.controller.clearSelection();
459
143
  }
460
- lowerLayers(layers, fromUi = true) {
461
- const layersToLower = [];
462
- for (const layer of layers) {
463
- const index = this.layers.findIndex((lay) => lay.id === layer.id);
464
- if (this.lowerableLayer(index)) {
465
- layersToLower.push(layer);
466
- }
467
- }
468
- this.map.lowerLayers(layersToLower);
469
- if (fromUi) {
470
- setTimeout(() => {
471
- const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
472
- const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
473
- let targetToScroll;
474
- if (checkItems.length) {
475
- targetToScroll = checkItems[checkItems.length - 1];
476
- }
477
- if (itemFocused.length) {
478
- targetToScroll = itemFocused[0];
479
- }
480
- if (targetToScroll) {
481
- scrollIntoView(targetToScroll, {
482
- scrollMode: 'if-needed',
483
- behavior: 'smooth',
484
- block: 'end',
485
- inline: 'nearest'
486
- });
487
- }
488
- }, 100);
489
- }
144
+ handleNodeToggle(node) {
145
+ node.data.expanded = this.treeControl.isExpanded(node);
490
146
  }
491
- next() {
492
- this.change$.next();
147
+ findNodeByLayerId(id) {
148
+ return this.treeControl.dataNodes.find((node) => node.id === id);
493
149
  }
494
- computeLayers(layers) {
495
- let layersOut = this.filterLayers(layers);
496
- if (this.sortAlpha) {
497
- layersOut = this.sortLayersByTitle(layersOut);
498
- }
499
- else {
500
- layersOut = this.sortLayersByZindex(layersOut);
150
+ updateDatasource(layers) {
151
+ const expansionModel = this.treeControl.expansionModel;
152
+ this.dataSource.data = layers;
153
+ this.isInit
154
+ ? this.restoreModel(expansionModel, (node) => this.treeControl.expand(node))
155
+ : this.expandGroup(layers);
156
+ if (!this.isInit && layers.length) {
157
+ this.isInit = true;
501
158
  }
502
- return layersOut;
503
- }
504
- onKeywordChange(term) {
505
- this.keyword = term;
506
159
  }
507
- onAppliedFilterAndSortChange(appliedFilter) {
508
- this.keyword = appliedFilter.keyword;
509
- this.onlyVisible = appliedFilter.onlyVisible;
510
- this.sortAlpha = appliedFilter.sortAlpha;
511
- }
512
- filterLayers(layers) {
513
- if (this.layerFilterAndSortOptions.showToolbar === LayerListControlsEnum.never) {
514
- return layers;
515
- }
516
- if (!this.keyword && !this.onlyVisible) {
517
- return layers;
518
- }
519
- const keepLayerIds = layers.map((layer) => layer.id);
160
+ /** Recursive */
161
+ expandGroup(layers) {
520
162
  layers.forEach((layer) => {
521
- const layerOptions = layer.options || {};
522
- const dataSourceOptions = layer.dataSource.options || {};
523
- const metadata = layerOptions.metadata || {};
524
- const keywords = metadata.keywordList || [];
525
- const layerKeywords = keywords.map((kw) => {
526
- return kw.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
527
- });
528
- if (this.keyword && layer.title) {
529
- const localKeyword = this.keyword
530
- .normalize('NFD')
531
- .replace(/[\u0300-\u036f]/g, '');
532
- const layerTitle = layer.title
533
- .normalize('NFD')
534
- .replace(/[\u0300-\u036f]/g, '');
535
- const dataSourceType = dataSourceOptions.type || '';
536
- const keywordRegex = new RegExp(localKeyword, 'gi');
537
- const keywordInList = layerKeywords.find((kw) => keywordRegex.test(kw)) !==
538
- undefined;
539
- if (!keywordRegex.test(layerTitle) &&
540
- !(this.keyword.toLowerCase() === dataSourceType.toLowerCase()) &&
541
- !keywordInList) {
542
- const index = keepLayerIds.indexOf(layer.id);
543
- if (index > -1) {
544
- keepLayerIds.splice(index, 1);
545
- }
546
- }
163
+ if (!isLayerGroup(layer)) {
164
+ return;
547
165
  }
548
- if (this.onlyVisible && layer.visible === false) {
549
- const index = keepLayerIds.indexOf(layer.id);
550
- if (index > -1) {
551
- keepLayerIds.splice(index, 1);
166
+ if (layer.expanded) {
167
+ const node = this.findNodeByLayerId(layer.id);
168
+ if (!node) {
169
+ return;
552
170
  }
171
+ this.treeControl.expand(node);
553
172
  }
173
+ this.expandGroup(layer.children);
554
174
  });
555
- return layers.filter((layer) => keepLayerIds.indexOf(layer.id) !== -1);
556
- }
557
- sortLayersByZindex(layers) {
558
- return layers.sort((layer1, layer2) => layer2.zIndex - layer1.zIndex);
559
175
  }
560
- sortLayersByTitle(layers) {
561
- return layers.sort((a, b) => {
562
- if (this.normalize(a.title) < this.normalize(b.title)) {
563
- return -1;
564
- }
565
- if (this.normalize(a.title) > this.normalize(b.title)) {
566
- return 1;
176
+ restoreModel(model, callback) {
177
+ const ids = Array.from(model['_selection']).map((value) => value['id']);
178
+ model.clear();
179
+ this.treeControl.dataNodes.forEach((node) => {
180
+ if (model.isSelected(node) || ids.includes(node.id)) {
181
+ callback(node);
567
182
  }
568
- return 0;
569
183
  });
570
184
  }
571
- normalize(str) {
572
- return str
573
- .normalize('NFD')
574
- .replace(/[\u0300-\u036f]/g, '')
575
- .toLowerCase();
576
- }
577
- computeShowToolbar() {
578
- switch (this.layerFilterAndSortOptions.showToolbar) {
579
- case LayerListControlsEnum.always:
580
- return true;
581
- case LayerListControlsEnum.never:
582
- return false;
583
- default:
584
- if (this.layers.length >= this.thresholdToFilterAndSort ||
585
- this.keyword ||
586
- this.onlyVisible) {
587
- return true;
588
- }
589
- return false;
590
- }
591
- }
592
- toggleLayerTool(layer) {
593
- this.toggleOpacity = false;
594
- if (this.layerTool && layer === this.activeLayer) {
595
- this.layerTool = false;
596
- }
597
- else {
598
- this.layerTool = true;
599
- }
600
- for (const lay of this.layers) {
601
- lay.options.active = false;
602
- }
603
- layer.options.active = true;
604
- this.activeLayer = layer;
605
- }
606
- removeLayers(layers) {
607
- if (layers && layers.length > 0) {
608
- this.layersChecked = [];
609
- for (const layer of layers) {
610
- if (layer.options.removable !== false) {
611
- layer.map.removeLayer(layer);
612
- }
613
- else {
614
- this.layersChecked.push(layer);
615
- }
616
- }
617
- }
618
- else if (!layers && this.activeLayer.options.removable !== false) {
619
- this.activeLayer.map.removeLayer(this.activeLayer);
620
- this.layerTool = false;
621
- }
622
- }
623
- toggleVisibility(layers) {
624
- if (layers && layers.length > 0) {
625
- for (const layer of layers) {
626
- layer.visible = this.hideSelectedLayers;
627
- }
628
- }
629
- this.layerItemChangeDetection$.next(true);
630
- }
631
- isLayerRemovable(layer) {
632
- return layer.options.removable !== false;
633
- }
634
- isAllLayersRemovable(layers) {
635
- return layers.every((l) => this.isLayerRemovable(l));
636
- }
637
- get statusSelectedLayersCheck() {
638
- let statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
639
- let findTrue = false;
640
- let findFalse = false;
641
- if (this.layersChecked.length === 0) {
642
- statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
643
- }
644
- else {
645
- statusSelectedLayers = LayerListSelectVisibleEnum.MIXED;
646
- this.hideSelectedLayers = false;
647
- for (const layer2 of this.layersChecked) {
648
- if (layer2.visible === true) {
649
- findTrue = true;
650
- }
651
- if (layer2.visible === false) {
652
- findFalse = true;
653
- }
654
- }
655
- if (findTrue === true && findFalse === false) {
656
- statusSelectedLayers = LayerListSelectVisibleEnum.ALL_VISIBLE;
657
- }
658
- if (findTrue === false && findFalse === true) {
659
- statusSelectedLayers = LayerListSelectVisibleEnum.ALL_HIDDEN;
660
- this.hideSelectedLayers = true;
661
- }
662
- }
663
- return statusSelectedLayers;
664
- }
665
- layersCheck(event) {
666
- event.layer.options.check = event.check;
667
- if (event.check === true) {
668
- const eventMapIndex = this.layers.findIndex((layer) => event.layer.id === layer.id);
669
- for (const layer of this.layersChecked) {
670
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
671
- if (eventMapIndex < mapIndex) {
672
- this.layersChecked.splice(this.layersChecked.findIndex((lay) => layer.id === lay.id), 0, event.layer);
673
- if (this.excludeBaseLayers) {
674
- if (this.layersChecked.length ===
675
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
676
- this.selectAllCheck = true;
677
- }
678
- else {
679
- this.selectAllCheck = false;
680
- }
681
- }
682
- else if (!this.excludeBaseLayers) {
683
- if (this.layersChecked.length ===
684
- this.layers.filter((lay) => lay.showInLayerList).length) {
685
- this.selectAllCheck = true;
686
- }
687
- else {
688
- this.selectAllCheck = false;
689
- }
690
- }
691
- return;
692
- }
693
- }
694
- this.layersChecked.push(event.layer);
695
- }
696
- else {
697
- const index = this.layersChecked.findIndex((layer) => event.layer.id === layer.id);
698
- this.layersChecked.splice(index, 1);
699
- }
700
- if (this.excludeBaseLayers) {
701
- if (this.layersChecked.length ===
702
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
703
- this.selectAllCheck = true;
704
- }
705
- else {
706
- this.selectAllCheck = false;
707
- }
708
- }
709
- else if (!this.excludeBaseLayers) {
710
- if (this.layersChecked.length ===
711
- this.layers.filter((lay) => lay.showInLayerList).length) {
712
- this.selectAllCheck = true;
713
- }
714
- else {
715
- this.selectAllCheck = false;
716
- }
717
- }
718
- }
719
- toggleSelectionMode(value) {
720
- this.selection = value;
721
- this.activeLayer = undefined;
722
- if (value === true) {
723
- this.layerTool = false;
724
- for (const layer of this.layers) {
725
- if (layer.options.check) {
726
- this.layersChecked.push(layer);
727
- }
728
- }
729
- }
730
- }
731
- layersCheckedOpacity() {
732
- if (this.layersChecked.length > 1) {
733
- return 1;
734
- }
735
- else {
736
- const opacity = [];
737
- for (const layer of this.layersChecked) {
738
- opacity.push(layer.opacity);
739
- }
740
- return opacity;
741
- }
742
- }
743
- selectAll() {
744
- if (!this.selectAllCheck) {
745
- for (const layer of this.layers) {
746
- if (this.excludeBaseLayers &&
747
- layer.baseLayer !== true &&
748
- layer.showInLayerList) {
749
- layer.options.check = true;
750
- this.layersChecked.push(layer);
751
- }
752
- else if (!this.excludeBaseLayers && layer.showInLayerList) {
753
- layer.options.check = true;
754
- this.layersChecked.push(layer);
755
- }
756
- }
757
- this.selectAllCheck$.next(true);
758
- }
759
- else {
760
- for (const layer of this.layers) {
761
- layer.options.check = false;
762
- }
763
- this.layersChecked = [];
764
- this.selectAllCheck$.next(false);
765
- }
766
- }
767
- isScrolledIntoView(elemSource, elem) {
768
- const docViewTop = elemSource.scrollTop;
769
- const docViewBottom = docViewTop + elemSource.clientHeight;
770
- const elemTop = elem.offsetTop;
771
- const elemBottom = elemTop + elem.clientHeight;
772
- return elemBottom <= docViewBottom && elemTop >= docViewTop;
773
- }
774
- removeProblemLayerInList(layersList) {
775
- for (const layer of layersList) {
776
- if (layer.olLoadingProblem === true) {
777
- this.map.removeLayer(layer);
778
- }
779
- }
780
- return layersList;
781
- }
782
- deleteUnavailableLayer(anyLayerOptions) {
783
- this.layerService.deleteUnavailableLayers(anyLayerOptions);
784
- }
785
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i0.ElementRef }, { token: i1.LayerService }], target: i0.ɵɵFactoryTarget.Component });
786
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { layersAreAllVisible: "layersAreAllVisible", ogcButton: "ogcButton", timeButton: "timeButton", map: "map", layers: "layers", floatLabel: "floatLabel", layerFilterAndSortOptions: "layerFilterAndSortOptions", excludeBaseLayers: "excludeBaseLayers", toggleLegendOnVisibilityChange: "toggleLegendOnVisibilityChange", expandLegendOfVisibleLayers: "expandLegendOfVisibleLayers", updateLegendOnResolutionChange: "updateLegendOnResolutionChange", queryBadge: "queryBadge" }, outputs: { appliedFilterAndSort: "appliedFilterAndSort" }, queries: [{ propertyName: "templateLayerToolbar", first: true, predicate: ["igoLayerItemToolbar"], descendants: true }], ngImport: i0, template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-unavailableLayer [ngForOf]=\"unavailableLayers\">\n <igo-layer-item\n igoListItem\n [unavailableLayer]=\"unavailableLayer\"\n (action)=\"deleteUnavailableLayer($event)\"\n >\n </igo-layer-item>\n </ng-template>\n\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LayerListToolComponent, selector: "igo-layer-list-tool", inputs: ["layersAreAllVisible", "floatLabel", "onlyVisible", "sortAlpha", "term"], outputs: ["appliedFilterAndSort", "selection"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["activeLayer", "selectAll", "layerCheck", "layer", "toggleLegendOnVisibilityChange", "expandLegendIfVisible", "updateLegendOnResolutionChange", "orderable", "lowerDisabled", "raiseDisabled", "queryBadge", "selectionMode", "changeDetection", "unavailableLayer"], outputs: ["action", "checkbox"] }, { kind: "directive", type: ListItemDirective, selector: "[igoListItem]", inputs: ["color", "focused", "selected", "disabled"], outputs: ["beforeSelect", "beforeFocus", "beforeUnselect", "beforeUnfocus", "beforeDisable", "beforeEnable", "focus", "unfocus", "select", "unselect", "disable", "enable"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i7.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i9.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i9.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i1.MessageService }], target: i0.ɵɵFactoryTarget.Component });
186
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { controller: "controller", layers: "layers", isDesktop: "isDesktop", isDragDropDisabled: "isDragDropDisabled", selectAll: "selectAll", viewerOptions: "viewerOptions" }, outputs: { activeChange: "activeChange" }, ngImport: i0, template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: TreeDragDropDirective, selector: "[igoTreeDragDrop]", inputs: ["treeControl", "maxLevel", "treeDragDropIsDisabled"], outputs: ["dragStart", "onDrop", "onDropError"] }, { kind: "component", type: LayerGroupComponent, selector: "igo-layer-group", inputs: ["layer", "viewerOptions", "selected", "selectionDisabled"], outputs: ["action", "visibilityChange", "expand", "selectChange"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["layer", "visible", "selected", "selectionDisabled", "viewerOptions"], outputs: ["action", "selectChange", "visibilityChange"] }, { kind: "ngmodule", type: IgoLanguageModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
787
187
  }
788
188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, decorators: [{
789
189
  type: Component,
790
190
  args: [{ selector: 'igo-layer-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
791
191
  NgIf,
792
- LayerListToolComponent,
192
+ NgFor,
193
+ NgTemplateOutlet,
194
+ FormsModule,
195
+ AsyncPipe,
196
+ MatBadgeModule,
197
+ MatButtonModule,
793
198
  MatCheckboxModule,
794
199
  MatDividerModule,
200
+ MatIconModule,
201
+ MatMenuModule,
202
+ MatSliderModule,
203
+ MatTreeModule,
204
+ MatTooltipModule,
205
+ TreeDragDropDirective,
206
+ LayerListToolComponent,
207
+ LayerGroupComponent,
795
208
  ListComponent,
796
- NgFor,
797
209
  LayerItemComponent,
798
210
  ListItemDirective,
799
211
  PanelComponent,
800
- MatButtonModule,
801
- MatTooltipModule,
802
- MatIconModule,
803
- MatBadgeModule,
804
- MatMenuModule,
805
- MatSliderModule,
806
- NgTemplateOutlet,
807
- FormsModule,
808
- AsyncPipe,
809
- IgoLanguageModule
810
- ], template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-unavailableLayer [ngForOf]=\"unavailableLayers\">\n <igo-layer-item\n igoListItem\n [unavailableLayer]=\"unavailableLayer\"\n (action)=\"deleteUnavailableLayer($event)\"\n >\n </igo-layer-item>\n </ng-template>\n\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"] }]
811
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.LayerService }], propDecorators: { templateLayerToolbar: [{
812
- type: ContentChild,
813
- args: ['igoLayerItemToolbar', /* TODO: add static flag */ {}]
814
- }], layersAreAllVisible: [{
815
- type: Input
816
- }], ogcButton: [{
817
- type: Input
818
- }], timeButton: [{
819
- type: Input
820
- }], map: [{
821
- type: Input
212
+ IgoLanguageModule,
213
+ IgoIconComponent
214
+ ], template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"] }]
215
+ }], ctorParameters: () => [{ type: i1.MessageService }], propDecorators: { controller: [{
216
+ type: Input,
217
+ args: [{ required: true }]
822
218
  }], layers: [{
219
+ type: Input,
220
+ args: [{ required: true }]
221
+ }], isDesktop: [{
823
222
  type: Input
824
- }], floatLabel: [{
825
- type: Input
826
- }], layerFilterAndSortOptions: [{
827
- type: Input
828
- }], excludeBaseLayers: [{
829
- type: Input
830
- }], toggleLegendOnVisibilityChange: [{
831
- type: Input
832
- }], expandLegendOfVisibleLayers: [{
223
+ }], isDragDropDisabled: [{
833
224
  type: Input
834
- }], updateLegendOnResolutionChange: [{
225
+ }], selectAll: [{
835
226
  type: Input
836
- }], queryBadge: [{
227
+ }], viewerOptions: [{
837
228
  type: Input
838
- }], appliedFilterAndSort: [{
229
+ }], activeChange: [{
839
230
  type: Output
840
231
  }] } });
841
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFP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WCxTQUFTLDZDQUNULGlCQUFpQjs7NEZBR1Isa0JBQWtCO2tCQTVCOUIsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsSUFBSTt3QkFDSixzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLEtBQUs7d0JBQ0wsa0JBQWtCO3dCQUNsQixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixXQUFXO3dCQUNYLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjswR0F5QkQsb0JBQW9CO3NCQURuQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLDJCQUEyQixDQUFDLEVBQUU7Z0JBRzFELG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0YsR0FBRztzQkFETixLQUFLO2dCQVVGLE1BQU07c0JBRFQsS0FBSztnQkFtQkcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBRUcsOEJBQThCO3NCQUF0QyxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJhZGdlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYmFkZ2UnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgRmxvYXRMYWJlbFR5cGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFNsaWRlckNoYW5nZSwgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAaWdvMi9jb21tb24vbGlzdCc7XG5pbXBvcnQgeyBQYW5lbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9wYW5lbCc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuXG5pbXBvcnQgKiBhcyBvbGV4dGVudCBmcm9tICdvbC9leHRlbnQnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIEVNUFRZLFxuICBSZXBsYXlTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHRpbWVyXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgc2Nyb2xsSW50b1ZpZXcgZnJvbSAnc2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWQnO1xuXG5pbXBvcnQge1xuICBnZXRBbGxDaGlsZExheWVyc0J5UHJvcGVydHksXG4gIGdldFJvb3RQYXJlbnRCeVByb3BlcnR5XG59IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbGlua2VkTGF5ZXJzLnV0aWxzJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcbmltcG9ydCB7XG4gIE1ldGFkYXRhTGF5ZXJPcHRpb25zLFxuICBNZXRhZGF0YU9wdGlvbnNcbn0gZnJvbSAnLi4vLi4vbWV0YWRhdGEvc2hhcmVkL21ldGFkYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMYXllckl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9sYXllci1pdGVtL2xheWVyLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IExheWVyTGlzdFRvb2xDb21wb25lbnQgfSBmcm9tICcuLi9sYXllci1saXN0LXRvb2wvbGF5ZXItbGlzdC10b29sLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYXllckxpc3RDb250cm9sc09wdGlvbnMgfSBmcm9tICcuLi9sYXllci1saXN0LXRvb2wvbGF5ZXItbGlzdC10b29sLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMYXllclNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBbnlMYXllck9wdGlvbnMgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vc2hhcmVkL2xheWVycy9sYXllcic7XG5pbXBvcnQgeyBMaW5rZWRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vc2hhcmVkL2xheWVycy9sYXllci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgTGF5ZXJMaXN0Q29udHJvbHNFbnVtLFxuICBMYXllckxpc3REaXNwbGFjZW1lbnRcbn0gZnJvbSAnLi9sYXllci1saXN0LmVudW0nO1xuaW1wb3J0IHsgTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0gfSBmcm9tICcuL2xheWVyLWxpc3QuZW51bSc7XG5cbi8vIFRPRE86IFRoaXMgY2xhc3MgY291bGQgdXNlIGEgY2xlYW4gdXAuIEFsc28sIHNvbWUgbWV0aG9kcyBjb3VsZCBiZSBtb3ZlZCBlYWxzZXdoZXJlXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tbGF5ZXItbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sYXllci1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGF5ZXItbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nSWYsXG4gICAgTGF5ZXJMaXN0VG9vbENvbXBvbmVudCxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXREaXZpZGVyTW9kdWxlLFxuICAgIExpc3RDb21wb25lbnQsXG4gICAgTmdGb3IsXG4gICAgTGF5ZXJJdGVtQ29tcG9uZW50LFxuICAgIExpc3RJdGVtRGlyZWN0aXZlLFxuICAgIFBhbmVsQ29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0QmFkZ2VNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRTbGlkZXJNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMYXllckxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIG9yZGVyYWJsZSA9IHRydWU7XG4gIHRocmVzaG9sZFRvRmlsdGVyQW5kU29ydCA9IDU7XG5cbiAgbGF5ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGF5ZXJbXT4oW10pO1xuXG4gIGNoYW5nZSQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcblxuICBzaG93VG9vbGJhciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgbGF5ZXJUb29sOiBib29sZWFuO1xuXG4gIHB1YmxpYyBoaWRlU2VsZWN0ZWRMYXllcnMgPSB0cnVlO1xuICBhY3RpdmVMYXllciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExheWVyPih1bmRlZmluZWQpO1xuXG4gIGxheWVyc0NoZWNrZWQ6IExheWVyW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogYm9vbGVhbjtcblxuICBwcml2YXRlIGNoYW5nZSQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbGF5ZXJzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGxheWVySXRlbUNoYW5nZURldGVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XG5cbiAgQENvbnRlbnRDaGlsZCgnaWdvTGF5ZXJJdGVtVG9vbGJhcicsIC8qIFRPRE86IGFkZCBzdGF0aWMgZmxhZyAqLyB7fSlcbiAgdGVtcGxhdGVMYXllclRvb2xiYXI6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgbGF5ZXJzQXJlQWxsVmlzaWJsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgb2djQnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSB0aW1lQnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBnZXQgbWFwKCk6IElnb01hcCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgfVxuICBzZXQgbWFwKHZhbHVlOiBJZ29NYXApIHtcbiAgICB0aGlzLl9tYXAgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9tYXA6IElnb01hcDtcblxuICBASW5wdXQoKVxuICBzZXQgbGF5ZXJzKHZhbHVlOiBMYXllcltdKSB7XG4gICAgdGhpcy5fbGF5ZXJzID0gdGhpcy5yZW1vdmVQcm9ibGVtTGF5ZXJJbkxpc3QodmFsdWUpO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIGdldCBsYXllcnMoKTogTGF5ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVycztcbiAgfVxuICBwcml2YXRlIF9sYXllcnM6IExheWVyW107XG5cbiAgc2V0IGFjdGl2ZUxheWVyKHZhbHVlOiBMYXllcikge1xuICAgIHRoaXMuX2FjdGl2ZUxheWVyID0gdmFsdWU7XG4gICAgdGhpcy5hY3RpdmVMYXllciQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZUxheWVyKCk6IExheWVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlTGF5ZXI7XG4gIH1cbiAgcHJpdmF0ZSBfYWN0aXZlTGF5ZXI6IExheWVyO1xuXG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuXG4gIEBJbnB1dCgpIGxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnM6IExheWVyTGlzdENvbnRyb2xzT3B0aW9ucyA9IHt9O1xuXG4gIEBJbnB1dCgpIGV4Y2x1ZGVCYXNlTGF5ZXJzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdG9nZ2xlTGVnZW5kT25WaXNpYmlsaXR5Q2hhbmdlID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZXhwYW5kTGVnZW5kT2ZWaXNpYmxlTGF5ZXJzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdXBkYXRlTGVnZW5kT25SZXNvbHV0aW9uQ2hhbmdlID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcXVlcnlCYWRnZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBhcHBsaWVkRmlsdGVyQW5kU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8TGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zPigpO1xuXG4gIGdldCBrZXl3b3JkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmQ7XG4gIH1cbiAgc2V0IGtleXdvcmQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2tleXdvcmQgPSB2YWx1ZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9rZXl3b3JkID0gdW5kZWZpbmVkO1xuXG4gIGdldCBvbmx5VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb25seVZpc2libGU7XG4gIH1cbiAgc2V0IG9ubHlWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fb25seVZpc2libGUgPSB2YWx1ZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9vbmx5VmlzaWJsZSA9IGZhbHNlO1xuXG4gIGdldCBzb3J0QWxwaGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlZEFscGhhO1xuICB9XG4gIHNldCBzb3J0QWxwaGEodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zb3J0ZWRBbHBoYSA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3NvcnRlZEFscGhhID0gZmFsc2U7XG5cbiAgZ2V0IG9wYWNpdHkoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5hY3RpdmVMYXllciQuZ2V0VmFsdWUoKS5vcGFjaXR5ICogMTAwKTtcbiAgfVxuICBzZXQgb3BhY2l0eShvcGFjaXR5OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZUxheWVyJC5nZXRWYWx1ZSgpLm9wYWNpdHkgPSBvcGFjaXR5IC8gMTAwO1xuICB9XG5cbiAgZ2V0IGJhZGdlT3BhY2l0eSgpIHtcbiAgICBpZiAodGhpcy5vcGFjaXR5ID09PSAxMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3BhY2l0eTtcbiAgfVxuXG4gIGdldCByYWlzZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLm9yZGVyYWJsZSB8fFxuICAgICAgdGhpcy5hY3RpdmVMYXllci5iYXNlTGF5ZXIgfHxcbiAgICAgIHRoaXMuZ2V0VXBwZXJMYXllcigpLmlkID09PSB0aGlzLmFjdGl2ZUxheWVyLmlkIHx8XG4gICAgICB0aGlzLmlzVXBwZXJCYXNlbGF5ZXIodGhpcy5hY3RpdmVMYXllcilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgbG93ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5vcmRlcmFibGUgfHxcbiAgICAgIHRoaXMuYWN0aXZlTGF5ZXIuYmFzZUxheWVyIHx8XG4gICAgICB0aGlzLmdldExvd2VyTGF5ZXIoKS5pZCA9PT0gdGhpcy5hY3RpdmVMYXllci5pZCB8fFxuICAgICAgdGhpcy5pc0xvd2VyQmFzZWxheWVyKHRoaXMuYWN0aXZlTGF5ZXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJhaXNlRGlzYWJsZWRTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIXRoaXMub3JkZXJhYmxlIHx8XG4gICAgICAhdGhpcy5yYWlzYWJsZUxheWVycyh0aGlzLmxheWVyc0NoZWNrZWQpIHx8XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxvd2VyRGlzYWJsZWRTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIXRoaXMub3JkZXJhYmxlIHx8XG4gICAgICAhdGhpcy5sb3dlcmFibGVMYXllcnModGhpcy5sYXllcnNDaGVja2VkKSB8fFxuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBjaGVja09wYWNpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXJzQ2hlY2tlZE9wYWNpdHkoKSAqIDEwMDtcbiAgfVxuICBzZXQgY2hlY2tPcGFjaXR5KG9wYWNpdHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICBsYXllci5vcGFjaXR5ID0gb3BhY2l0eSAvIDEwMDtcbiAgICB9XG4gIH1cblxuICBnZXQgbGF5ZXJMaXN0RGlzcGxhY2VtZW50KCk6IHR5cGVvZiBMYXllckxpc3REaXNwbGFjZW1lbnQge1xuICAgIHJldHVybiBMYXllckxpc3REaXNwbGFjZW1lbnQ7XG4gIH1cblxuICBnZXQgdW5hdmFpbGFibGVMYXllcnMoKTogQW55TGF5ZXJPcHRpb25zW10ge1xuICAgIHJldHVybiB0aGlzLmxheWVyU2VydmljZS51bmF2YWlsYWJsZUxheWVycztcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVPcGFjaXR5ID0gZmFsc2U7XG5cbiAgcHVibGljIHNlbGVjdEFsbENoZWNrOiBib29sZWFuO1xuICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2skID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHNlbGVjdEFsbENoZWNrJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNlYXJjaCB0ZXJtIHN0cmVhbSBhbmQgdHJpZ2dlciByZXNlYXJjaGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UkJCA9IHRoaXMuY2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sYXllcnMubGVuZ3RoID09PSAwID8gRU1QVFkgOiB0aW1lcig1MCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciQubmV4dCh0aGlzLmNvbXB1dGVTaG93VG9vbGJhcigpKTtcbiAgICAgICAgdGhpcy5sYXllcnMkLm5leHQodGhpcy5jb21wdXRlTGF5ZXJzKHRoaXMubGF5ZXJzLnNsaWNlKDApKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlckFuZFNvcnQuZW1pdCh7XG4gICAgICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgICAgIHNvcnRBbHBoYTogdGhpcy5zb3J0QWxwaGEsXG4gICAgICAgICAgb25seVZpc2libGU6IHRoaXMub25seVZpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skJCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2skLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5ZXJzJCQgPSB0aGlzLmxheWVycyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmxheWVycykge1xuICAgICAgICBsZXQgY2hlY2tzID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgIGxheWVyLnN0YXR1cyQuc3Vic2NyaWJlKCh2YWxTdGF0dXMpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWxTdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYXllci5vcHRpb25zLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVMYXllciA9IGxheWVyO1xuICAgICAgICAgICAgdGhpcy5sYXllclRvb2wgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF5ZXIub3B0aW9ucy5jaGVjaykge1xuICAgICAgICAgICAgY2hlY2tzICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09XG4gICAgICAgICAgICB0aGlzLmxheWVycy5maWx0ZXIoXG4gICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09IHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlbGVjdEFsbENoZWNrJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmxheWVycyQkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhY3RpdmVMYXllckV4dGVudElzVmFsaWQobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgaWYgKGxheWVyLm9wdGlvbnMuc2hvd0J1dHRvblpvb21Ub0V4dGVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBpZiAobGF5ZXJFeHRlbnQpIHtcbiAgICAgIGlmIChtYXhMYXllclpvb21FeHRlbnQpIHtcbiAgICAgICAgdmFsaWQgPSBvbGV4dGVudC5jb250YWluc0V4dGVudChtYXhMYXllclpvb21FeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgYWN0aXZlTGF5ZXJzRXh0ZW50QXJlVmFsaWQobGF5ZXJzOiBMYXllcltdKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgY29uc3QgbGF5ZXJzRXh0ZW50ID0gb2xleHRlbnQuY3JlYXRlRW1wdHkoKTtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50ICYmICFsYXllckV4dGVudC5pbmNsdWRlcyhJbmZpbml0eSkpIHtcbiAgICAgICAgb2xleHRlbnQuZXh0ZW5kKGxheWVyc0V4dGVudCwgbGF5ZXJFeHRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb2xleHRlbnQuaXNFbXB0eShsYXllcnNFeHRlbnQpKSB7XG4gICAgICBpZiAobWF4TGF5ZXJab29tRXh0ZW50KSB7XG4gICAgICAgIHZhbGlkID0gb2xleHRlbnQuY29udGFpbnNFeHRlbnQobWF4TGF5ZXJab29tRXh0ZW50LCBsYXllcnNFeHRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICB6b29tTGF5ZXJFeHRlbnRzKGxheWVyOiBMYXllcikge1xuICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnpvb21Ub0V4dGVudChsYXllci5vcHRpb25zLmV4dGVudCk7XG4gIH1cblxuICB6b29tTGF5ZXJzRXh0ZW50cyhsYXllcnM6IExheWVyW10pIHtcbiAgICBjb25zdCBsYXllcnNFeHRlbnQgPSBvbGV4dGVudC5jcmVhdGVFbXB0eSgpIGFzIFtcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50KSB7XG4gICAgICAgIG9sZXh0ZW50LmV4dGVuZChsYXllcnNFeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuem9vbVRvRXh0ZW50KGxheWVyc0V4dGVudCk7XG4gIH1cblxuICBjaGFuZ2VPcGFjaXR5KGV2ZW50OiBNYXRTbGlkZXJDaGFuZ2UpIHtcbiAgICB0aGlzLm9wYWNpdHkgPSBldmVudC52YWx1ZTtcbiAgfVxuXG4gIGNsZWFyS2V5d29yZCgpIHtcbiAgICB0aGlzLmtleXdvcmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRMb3dlckxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLmxheWVyc1xuICAgICAgLmZpbHRlcigobCkgPT4gIWwuYmFzZUxheWVyKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJldi56SW5kZXggPCBjdXJyZW50LnpJbmRleCA/IHByZXYgOiBjdXJyZW50O1xuICAgICAgICB9LFxuICAgICAgICB7IHpJbmRleDogdW5kZWZpbmVkLCBpZDogdW5kZWZpbmVkIH1cbiAgICAgICk7XG4gIH1cblxuICBpc0xvd2VyQmFzZWxheWVyKGxheWVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXllcnMgJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0gJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0uYmFzZUxheWVyID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0VXBwZXJMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgIC5maWx0ZXIoKGwpID0+ICFsLmJhc2VMYXllcilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZXYuekluZGV4ID4gY3VycmVudC56SW5kZXggPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgfSxcbiAgICAgICAgeyB6SW5kZXg6IHVuZGVmaW5lZCwgaWQ6IHVuZGVmaW5lZCB9XG4gICAgICApO1xuICB9XG5cbiAgaXNVcHBlckJhc2VsYXllcihsYXllcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgIGlmIChcbiAgICAgIHRoaXMubGF5ZXJzICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdLmJhc2VMYXllciA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1vdmVBY3RpdmVMYXllcihcbiAgICBhY3RpdmVMYXllcjogTGF5ZXIsXG4gICAgYWN0aW9udHlwZTogTGF5ZXJMaXN0RGlzcGxhY2VtZW50LFxuICAgIGZyb21VaSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IHNvcnRlZExheWVyc1RvTW92ZSA9IFtdO1xuICAgIGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KHRoaXMubWFwLCBhY3RpdmVMYXllciwgTGlua2VkUHJvcGVydGllcy5aSU5ERVgpO1xuICAgIGxldCByb290UGFyZW50QnlQcm9wZXJ0eSA9IGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KFxuICAgICAgdGhpcy5tYXAsXG4gICAgICBhY3RpdmVMYXllcixcbiAgICAgIExpbmtlZFByb3BlcnRpZXMuWklOREVYXG4gICAgKTtcbiAgICBpZiAoIXJvb3RQYXJlbnRCeVByb3BlcnR5KSB7XG4gICAgICByb290UGFyZW50QnlQcm9wZXJ0eSA9IGFjdGl2ZUxheWVyO1xuICAgIH1cbiAgICBjb25zdCBsYXllcnNUb01vdmUgPSBbcm9vdFBhcmVudEJ5UHJvcGVydHldO1xuICAgIGdldEFsbENoaWxkTGF5ZXJzQnlQcm9wZXJ0eShcbiAgICAgIHRoaXMubWFwLFxuICAgICAgcm9vdFBhcmVudEJ5UHJvcGVydHksXG4gICAgICBsYXllcnNUb01vdmUsXG4gICAgICBMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWFxuICAgICk7XG5cbiAgICB0aGlzLmxheWVycy5tYXAoKGxheWVyKSA9PiB7XG4gICAgICBpZiAobGF5ZXJzVG9Nb3ZlLmluZGV4T2YobGF5ZXIpICE9PSAtMSkge1xuICAgICAgICBzb3J0ZWRMYXllcnNUb01vdmUucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYWN0aW9udHlwZSA9PT0gTGF5ZXJMaXN0RGlzcGxhY2VtZW50LlJhaXNlKSB7XG4gICAgICB0aGlzLnJhaXNlTGF5ZXJzKHNvcnRlZExheWVyc1RvTW92ZSwgZnJvbVVpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbnR5cGUgPT09IExheWVyTGlzdERpc3BsYWNlbWVudC5Mb3dlcikge1xuICAgICAgdGhpcy5sb3dlckxheWVycyhzb3J0ZWRMYXllcnNUb01vdmUsIGZyb21VaSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogRm9yIHNlbGVjdGlvbiBtb2RlIGRpc2FibGVkIGF0dHJpYnV0ZVxuICAgKi9cbiAgcmFpc2FibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4IC0gMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzTGF5ZXIgJiZcbiAgICAgICAgcHJldmlvdXNMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IHByZXZpb3VzTGF5ZXIuaWQgPT09IGxheS5pZCkgJiZcbiAgICAgICAgY3VycmVudExheWVyLmJhc2VMYXllciAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIHJhaXNhYmxlTGF5ZXIoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXllcnNbaW5kZXggLSAxXS5vcHRpb25zLmNoZWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYWlzYWJsZUxheWVyKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmFpc2VMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9SYWlzZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLnJhaXNhYmxlTGF5ZXIoaW5kZXgpKSB7XG4gICAgICAgIGxheWVyc1RvUmFpc2UucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWFwLnJhaXNlTGF5ZXJzKGxheWVyc1RvUmFpc2UpO1xuICAgIGlmIChmcm9tVWkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0l0ZW1zID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgJ21hdC1jaGVja2JveC1jaGVja2VkJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdGVtRm9jdXNlZCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdpZ28tbGF5ZXItaXRlbS1mb2N1c2VkJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgdGFyZ2V0VG9TY3JvbGw7XG4gICAgICAgIGlmIChjaGVja0l0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIHRhcmdldFRvU2Nyb2xsID0gY2hlY2tJdGVtc1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICAvKlxuICAgKiBGb3Igc2VsZWN0aW9uIG1vZGUgZGlzYWJsZWQgYXR0cmlidXRlXG4gICAqL1xuICBsb3dlcmFibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dExheWVyID0gdGhpcy5sYXllcnNbbWFwSW5kZXggKyAxXTtcbiAgICAgIGlmIChcbiAgICAgICAgbmV4dExheWVyICYmXG4gICAgICAgIG5leHRMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IG5leHRMYXllci5pZCA9PT0gbGF5LmlkKVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIGxvd2VyYWJsZUxheWVyKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICBpbmRleCA+XG4gICAgICB0aGlzLmxheWVycy5maWx0ZXIoKGxheSkgPT4gbGF5LmJhc2VMYXllciAhPT0gdHJ1ZSkubGVuZ3RoIC0gMlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxheWVyc1tpbmRleCArIDFdLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbG93ZXJMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9Mb3dlciA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4KSkge1xuICAgICAgICBsYXllcnNUb0xvd2VyLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hcC5sb3dlckxheWVycyhsYXllcnNUb0xvd2VyKTtcbiAgICBpZiAoZnJvbVVpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tJdGVtcyA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdtYXQtY2hlY2tib3gtY2hlY2tlZCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXRlbUZvY3VzZWQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAnaWdvLWxheWVyLWl0ZW0tZm9jdXNlZCdcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHRhcmdldFRvU2Nyb2xsO1xuICAgICAgICBpZiAoY2hlY2tJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0YXJnZXRUb1Njcm9sbCA9IGNoZWNrSXRlbXNbY2hlY2tJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG5leHQoKSB7XG4gICAgdGhpcy5jaGFuZ2UkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBsZXQgbGF5ZXJzT3V0ID0gdGhpcy5maWx0ZXJMYXllcnMobGF5ZXJzKTtcbiAgICBpZiAodGhpcy5zb3J0QWxwaGEpIHtcbiAgICAgIGxheWVyc091dCA9IHRoaXMuc29ydExheWVyc0J5VGl0bGUobGF5ZXJzT3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXJzT3V0ID0gdGhpcy5zb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzT3V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc091dDtcbiAgfVxuXG4gIG9uS2V5d29yZENoYW5nZSh0ZXJtKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gdGVybTtcbiAgfVxuXG4gIG9uQXBwbGllZEZpbHRlckFuZFNvcnRDaGFuZ2UoYXBwbGllZEZpbHRlcjogTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gYXBwbGllZEZpbHRlci5rZXl3b3JkO1xuICAgIHRoaXMub25seVZpc2libGUgPSBhcHBsaWVkRmlsdGVyLm9ubHlWaXNpYmxlO1xuICAgIHRoaXMuc29ydEFscGhhID0gYXBwbGllZEZpbHRlci5zb3J0QWxwaGE7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMuc2hvd1Rvb2xiYXIgPT09IExheWVyTGlzdENvbnRyb2xzRW51bS5uZXZlclxuICAgICkge1xuICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleXdvcmQgJiYgIXRoaXMub25seVZpc2libGUpIHtcbiAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcExheWVySWRzID0gbGF5ZXJzLm1hcCgobGF5ZXI6IExheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXI6IExheWVyKSA9PiB7XG4gICAgICBjb25zdCBsYXllck9wdGlvbnMgPSAobGF5ZXIub3B0aW9ucyBhcyBNZXRhZGF0YUxheWVyT3B0aW9ucykgfHwge307XG4gICAgICBjb25zdCBkYXRhU291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucyB8fCB7fTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gbGF5ZXJPcHRpb25zLm1ldGFkYXRhIHx8ICh7fSBhcyBNZXRhZGF0YU9wdGlvbnMpO1xuICAgICAgY29uc3Qga2V5d29yZHMgPSBtZXRhZGF0YS5rZXl3b3JkTGlzdCB8fCBbXTtcbiAgICAgIGNvbnN0IGxheWVyS2V5d29yZHMgPSBrZXl3b3Jkcy5tYXAoKGt3OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGt3Lm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmtleXdvcmQgJiYgbGF5ZXIudGl0bGUpIHtcbiAgICAgICAgY29uc3QgbG9jYWxLZXl3b3JkID0gdGhpcy5rZXl3b3JkXG4gICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgICBjb25zdCBsYXllclRpdGxlID0gbGF5ZXIudGl0bGVcbiAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZU9wdGlvbnMudHlwZSB8fCAnJztcbiAgICAgICAgY29uc3Qga2V5d29yZFJlZ2V4ID0gbmV3IFJlZ0V4cChsb2NhbEtleXdvcmQsICdnaScpO1xuICAgICAgICBjb25zdCBrZXl3b3JkSW5MaXN0ID1cbiAgICAgICAgICBsYXllcktleXdvcmRzLmZpbmQoKGt3OiBzdHJpbmcpID0+IGtleXdvcmRSZWdleC50ZXN0KGt3KSkgIT09XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWtleXdvcmRSZWdleC50ZXN0KGxheWVyVGl0bGUpICYmXG4gICAgICAgICAgISh0aGlzLmtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKSkgJiZcbiAgICAgICAgICAha2V5d29yZEluTGlzdFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAga2VlcExheWVySWRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ubHlWaXNpYmxlICYmIGxheWVyLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2VlcExheWVySWRzLmluZGV4T2YobGF5ZXIuaWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGtlZXBMYXllcklkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsYXllcjogTGF5ZXIpID0+IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgcmV0dXJuIGxheWVycy5zb3J0KChsYXllcjEsIGxheWVyMikgPT4gbGF5ZXIyLnpJbmRleCAtIGxheWVyMS56SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlUaXRsZShsYXllcnM6IExheWVyW10pIHtcbiAgICByZXR1cm4gbGF5ZXJzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA8IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA+IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHJcbiAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVNob3dUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodGhpcy5sYXllckZpbHRlckFuZFNvcnRPcHRpb25zLnNob3dUb29sYmFyKSB7XG4gICAgICBjYXNlIExheWVyTGlzdENvbnRyb2xzRW51bS5hbHdheXM6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBMYXllckxpc3RDb250cm9sc0VudW0ubmV2ZXI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmxheWVycy5sZW5ndGggPj0gdGhpcy50aHJlc2hvbGRUb0ZpbHRlckFuZFNvcnQgfHxcbiAgICAgICAgICB0aGlzLmtleXdvcmQgfHxcbiAgICAgICAgICB0aGlzLm9ubHlWaXNpYmxlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVMYXllclRvb2wobGF5ZXIpIHtcbiAgICB0aGlzLnRvZ2dsZU9wYWNpdHkgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sYXllclRvb2wgJiYgbGF5ZXIgPT09IHRoaXMuYWN0aXZlTGF5ZXIpIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmxheWVycykge1xuICAgICAgbGF5Lm9wdGlvbnMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGxheWVyLm9wdGlvbnMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gbGF5ZXI7XG4gIH1cblxuICByZW1vdmVMYXllcnMobGF5ZXJzPzogTGF5ZXJbXSkge1xuICAgIGlmIChsYXllcnMgJiYgbGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgIGxheWVyLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghbGF5ZXJzICYmIHRoaXMuYWN0aXZlTGF5ZXIub3B0aW9ucy5yZW1vdmFibGUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFjdGl2ZUxheWVyLm1hcC5yZW1vdmVMYXllcih0aGlzLmFjdGl2ZUxheWVyKTtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVmlzaWJpbGl0eShsYXllcnM/OiBMYXllcltdKSB7XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgbGF5ZXIudmlzaWJsZSA9IHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVySXRlbUNoYW5nZURldGVjdGlvbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGlzTGF5ZXJSZW1vdmFibGUobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzQWxsTGF5ZXJzUmVtb3ZhYmxlKGxheWVyczogTGF5ZXJbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsYXllcnMuZXZlcnkoKGwpID0+IHRoaXMuaXNMYXllclJlbW92YWJsZShsKSk7XG4gIH1cblxuICBnZXQgc3RhdHVzU2VsZWN0ZWRMYXllcnNDaGVjaygpOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSB7XG4gICAgbGV0IHN0YXR1c1NlbGVjdGVkTGF5ZXJzOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSA9XG4gICAgICBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bS5OVUxMO1xuICAgIGxldCBmaW5kVHJ1ZSA9IGZhbHNlO1xuICAgIGxldCBmaW5kRmFsc2UgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLk5VTEw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uTUlYRUQ7XG4gICAgICB0aGlzLmhpZGVTZWxlY3RlZExheWVycyA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGxheWVyMiBvZiB0aGlzLmxheWVyc0NoZWNrZWQpIHtcbiAgICAgICAgaWYgKGxheWVyMi52aXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgZmluZFRydWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllcjIudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmaW5kRmFsc2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5kVHJ1ZSA9PT0gdHJ1ZSAmJiBmaW5kRmFsc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uQUxMX1ZJU0lCTEU7XG4gICAgICB9XG4gICAgICBpZiAoZmluZFRydWUgPT09IGZhbHNlICYmIGZpbmRGYWxzZSA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLkFMTF9ISURERU47XG4gICAgICAgIHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzU2VsZWN0ZWRMYXllcnM7XG4gIH1cblxuICBsYXllcnNDaGVjayhldmVudDogeyBsYXllcjogTGF5ZXI7IGNoZWNrOiBib29sZWFuIH0pIHtcbiAgICBldmVudC5sYXllci5vcHRpb25zLmNoZWNrID0gZXZlbnQuY2hlY2s7XG4gICAgaWYgKGV2ZW50LmNoZWNrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudE1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIGNvbnN0IG1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgICAgICBpZiAoZXZlbnRNYXBJbmRleCA8IG1hcEluZGV4KSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnNwbGljZShcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZXZlbnQubGF5ZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKChsYXkpID0+IGxheS5zaG93SW5MYXllckxpc3QpLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGV2ZW50LmxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVyc0NoZWNrZWQuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5KSA9PiBsYXkuYmFzZUxheWVyICE9PSB0cnVlICYmIGxheS5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVTZWxlY3Rpb25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sYXllclRvb2wgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgICAgICB0aGlzLmxheWVyc0NoZWNrZWQucHVzaChsYXllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsYXllcnNDaGVja2VkT3BhY2l0eSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIG9wYWNpdHkucHVzaChsYXllci5vcGFjaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcGFjaXR5O1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0QWxsQ2hlY2spIHtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZXhjbHVkZUJhc2VMYXllcnMgJiZcbiAgICAgICAgICBsYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgICBsYXllci5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGF5ZXIub3B0aW9ucy5jaGVjayA9IHRydWU7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzICYmIGxheWVyLnNob3dJbkxheWVyTGlzdCkge1xuICAgICAgICAgIGxheWVyLm9wdGlvbnMuY2hlY2sgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGxheWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayQubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBsYXllci5vcHRpb25zLmNoZWNrID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2Nyb2xsZWRJbnRvVmlldyhlbGVtU291cmNlLCBlbGVtKSB7XG4gICAgY29uc3QgZG9jVmlld1RvcCA9IGVsZW1Tb3VyY2Uuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IGRvY1ZpZXdCb3R0b20gPSBkb2NWaWV3VG9wICsgZWxlbVNvdXJjZS5jbGllbnRIZWlnaHQ7XG5cbiAgICBjb25zdCBlbGVtVG9wID0gZWxlbS5vZmZzZXRUb3A7XG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IGVsZW1Ub3AgKyBlbGVtLmNsaWVudEhlaWdodDtcbiAgICByZXR1cm4gZWxlbUJvdHRvbSA8PSBkb2NWaWV3Qm90dG9tICYmIGVsZW1Ub3AgPj0gZG9jVmlld1RvcDtcbiAgfVxuXG4gIHJlbW92ZVByb2JsZW1MYXllckluTGlzdChsYXllcnNMaXN0OiBMYXllcltdKTogTGF5ZXJbXSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnNMaXN0KSB7XG4gICAgICBpZiAobGF5ZXIub2xMb2FkaW5nUHJvYmxlbSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNMaXN0O1xuICB9XG5cbiAgZGVsZXRlVW5hdmFpbGFibGVMYXllcihhbnlMYXllck9wdGlvbnM6IEFueUxheWVyT3B0aW9ucykge1xuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLmRlbGV0ZVVuYXZhaWxhYmxlTGF5ZXJzKGFueUxheWVyT3B0aW9ucyk7XG4gIH1cbn1cbiIsIjxpZ28tbGF5ZXItbGlzdC10b29sXG4gICpuZ0lmPVwic2hvd1Rvb2xiYXIkIHwgYXN5bmNcIlxuICBmbG9hdExhYmVsPVwiYXV0b1wiXG4gIFtsYXllcnNBcmVBbGxWaXNpYmxlXT1cImxheWVyc0FyZUFsbFZpc2libGVcIlxuICBbdGVybV09XCJsYXllckZpbHRlckFuZFNvcnRPcHRpb25zLmtleXdvcmRcIlxuICBbb25seVZpc2libGVdPVwibGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9ucy5vbmx5VmlzaWJsZVwiXG4gIFtzb3J0QWxwaGFdPVwibGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9ucy5zb3J0QWxwaGFcIlxuICAoYXBwbGllZEZpbHRlckFuZFNvcnQpPVwib25BcHBsaWVkRmlsdGVyQW5kU29ydENoYW5nZSgkZXZlbnQpXCJcbiAgKHNlbGVjdGlvbik9XCJ0b2dnbGVTZWxlY3Rpb25Nb2RlKCRldmVudClcIlxuPlxuPC9pZ28tbGF5ZXItbGlzdC10b29sPlxuXG48ZGl2ICpuZ0lmPVwic2VsZWN0aW9uXCIgY2xhc3M9XCJzZWxlY3QtYWxsXCI+XG4gIDxtYXQtY2hlY2tib3hcbiAgICBjbGFzcz1cInNlbGVjdC1hbGwtY2hlY2tib3hcIlxuICAgIFtjb2xvcl09XCIhc2VsZWN0QWxsQ2hlY2sgJiYgbGF5ZXJzQ2hlY2tlZC5sZW5ndGggPiAwID8gJ2FjY2VudCcgOiAncHJpbWFyeSdcIlxuICAgIChjaGFuZ2UpPVwic2VsZWN0QWxsKClcIlxuICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbENoZWNrXCJcbiAgICBbaW5kZXRlcm1pbmF0ZV09XCIhc2VsZWN0QWxsQ2hlY2sgJiYgbGF5ZXJzQ2hlY2tlZC5sZW5ndGggPiAwXCJcbiAgPlxuICAgIHt7XG4gICAgICBzZWxlY3RBbGxDaGVja1xuICAgICAgICA/ICgnaWdvLmdlby5sYXllci5kZXNlbGVjdEFsbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLnNlbGVjdEFsbCcgfCB0cmFuc2xhdGUpXG4gICAgfX1cbiAgPC9tYXQtY2hlY2tib3g+XG48L2Rpdj5cbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuXG48aWdvLWxpc3QgI2lnb0xpc3QgW25hdmlnYXRpb25dPVwiZmFsc2VcIiBbc2VsZWN0aW9uXT1cImZhbHNlXCI+XG4gIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtdW5hdmFpbGFibGVMYXllciBbbmdGb3JPZl09XCJ1bmF2YWlsYWJsZUxheWVyc1wiPlxuICAgIDxpZ28tbGF5ZXItaXRlbVxuICAgICAgaWdvTGlzdEl0ZW1cbiAgICAgIFt1bmF2YWlsYWJsZUxheWVyXT1cInVuYXZhaWxhYmxlTGF5ZXJcIlxuICAgICAgKGFjdGlvbik9XCJkZWxldGVVbmF2YWlsYWJsZUxheWVyKCRldmVudClcIlxuICAgID5cbiAgICA8L2lnby1sYXllci1pdGVtPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtbGF5ZXIgbGV0LWk9XCJpbmRleFwiIFtuZ0Zvck9mXT1cImxheWVycyQgfCBhc3luY1wiPlxuICAgIDxpZ28tbGF5ZXItaXRlbVxuICAgICAgKm5nSWY9XCIhKGV4Y2x1ZGVCYXNlTGF5ZXJzICYmIGxheWVyLmJhc2VMYXllcilcIlxuICAgICAgaWdvTGlzdEl0ZW1cbiAgICAgIFtsYXllcl09XCJsYXllclwiXG4gICAgICBbYWN0aXZlTGF5ZXJdPVwiYWN0aXZlTGF5ZXJcIlxuICAgICAgW29yZGVyYWJsZV09XCJvcmRlcmFibGUgJiYgIWxheWVyLmJhc2VMYXllclwiXG4gICAgICBbbG93ZXJEaXNhYmxlZF09XCJnZXRMb3dlckxheWVyKCkuaWQgPT09IGxheWVyLmlkXCJcbiAgICAgIFtyYWlzZURpc2FibGVkXT1cImdldFVwcGVyTGF5ZXIoKS5pZCA9PT0gbGF5ZXIuaWRcIlxuICAgICAgW3F1ZXJ5QmFkZ2VdPVwicXVlcnlCYWRnZVwiXG4gICAgICBbZXhwYW5kTGVnZW5kSWZWaXNpYmxlXT1cImV4cGFuZExlZ2VuZE9mVmlzaWJsZUxheWVyc1wiXG4gICAgICBbdXBkYXRlTGVnZW5kT25SZXNvbHV0aW9uQ2hhbmdlXT1cInVwZGF0ZUxlZ2VuZE9uUmVzb2x1dGlvbkNoYW5nZVwiXG4gICAgICBbdG9nZ2xlTGVnZW5kT25WaXNpYmlsaXR5Q2hhbmdlXT1cInRvZ2dsZUxlZ2VuZE9uVmlzaWJpbGl0eUNoYW5nZVwiXG4gICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25cIlxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxDaGVja1wiXG4gICAgICBbbGF5ZXJDaGVja109XCJsYXllci5vcHRpb25zLmNoZWNrXCJcbiAgICAgIFtjaGFuZ2VEZXRlY3Rpb25dPVwibGF5ZXJJdGVtQ2hhbmdlRGV0ZWN0aW9uJFwiXG4gICAgICAoYWN0aW9uKT1cInRvZ2dsZUxheWVyVG9vbCgkZXZlbnQpXCJcbiAgICAgIChjaGVja2JveCk9XCJsYXllcnNDaGVjaygkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9pZ28tbGF5ZXItaXRlbT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvaWdvLWxpc3Q+XG5cbjxpZ28tcGFuZWxcbiAgKm5nSWY9XCIhc2VsZWN0aW9uICYmIGxheWVyVG9vbCAmJiBhY3RpdmVMYXllclwiXG4gIGNsYXNzPVwiaWdvLWxheWVyLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgW3RpdGxlXT1cImFjdGl2ZUxheWVyLnRpdGxlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImlnby1sYXllci1idXR0b24tZ3JvdXBcIj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImlzTGF5ZXJSZW1vdmFibGUoYWN0aXZlTGF5ZXIpXCJcbiAgICAgIGNsYXNzPVwiZGVsZXRlLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5yZW1vdmVMYXllcicgfCB0cmFuc2xhdGVcIlxuICAgICAgKGNsaWNrKT1cInJlbW92ZUxheWVycygpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG93bi1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZmlsdGVyTG93ZXJMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIubG93ZXJMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxvd2VyRGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVBY3RpdmVMYXllcihhY3RpdmVMYXllciwgbGF5ZXJMaXN0RGlzcGxhY2VtZW50Lkxvd2VyLCB0cnVlKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICBbbWF0QmFkZ2VdPVwic29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmQgPyAnIScgOiAnJ1wiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cImxvd2VyRGlzYWJsZWRcIlxuICAgICAgICA+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInVwLWJ1dHRvblwiXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgc29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmRcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5maWx0ZXJSYWlzZUxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5yYWlzZUxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICBbZGlzYWJsZWRdPVwicmFpc2VEaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwibW92ZUFjdGl2ZUxheWVyKGFjdGl2ZUxheWVyLCBsYXllckxpc3REaXNwbGFjZW1lbnQuUmFpc2UsIHRydWUpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgIFttYXRCYWRnZV09XCJzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZCA/ICchJyA6ICcnXCJcbiAgICAgICAgbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICBtYXRCYWRnZVNpemU9XCJtZWRpdW1cIlxuICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwicmFpc2VEaXNhYmxlZFwiXG4gICAgICAgID5hcnJvd191cHdhcmQ8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIDxsYWJlbD57eyAnaWdvLmdlby5sYXllci5vcGFjaXR5JyB8IHRyYW5zbGF0ZSB9fSA8L2xhYmVsPiAtLT5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm9wYWNpdHktYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcGFjaXR5TWVudVwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5vcGFjaXR5JyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICBbbWF0QmFkZ2VdPVwiYmFkZ2VPcGFjaXR5XCJcbiAgICAgICAgbWF0QmFkZ2VDb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBtYXRCYWRnZVNpemU9XCJtZWRpdW1cIlxuICAgICAgICA+b3BhY2l0eTwvbWF0LWljb25cbiAgICAgID5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxtYXQtbWVudSAjb3BhY2l0eU1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJwYW5lbC1vcGFjaXR5LW1lbnVcIj5cbiAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgIGlkPVwib3BhY2l0eS1zbGlkZXJcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBkaXNjcmV0ZVxuICAgICAgICBzdGVwPVwiNVwiXG4gICAgICAgIFttaW5dPVwiMFwiXG4gICAgICAgIFttYXhdPVwiMTAwXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICNuZ1NsaWRlclxuICAgICAgICA+PGlucHV0XG4gICAgICAgICAgbWF0U2xpZGVyVGh1bWJcbiAgICAgICAgICBbdmFsdWVdPVwib3BhY2l0eVwiXG4gICAgICAgICAgKGlucHV0KT1cIlxuICAgICAgICAgICAgY2hhbmdlT3BhY2l0eSh7XG4gICAgICAgICAgICAgIHNvdXJjZTogbmdTbGlkZXJUaHVtYixcbiAgICAgICAgICAgICAgcGFyZW50OiBuZ1NsaWRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IG5nU2xpZGVyVGh1bWIudmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXCJcbiAgICAgICAgICAjbmdTbGlkZXJUaHVtYj1cIm1hdFNsaWRlclRodW1iXCJcbiAgICAgICAgLz5cbiAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICA8L21hdC1tZW51PlxuXG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJhY3RpdmVMYXllckV4dGVudElzVmFsaWQoYWN0aXZlTGF5ZXIpXCJcbiAgICAgIGNsYXNzPVwiem9vbUxheWVyLWJ1dHRvblwiXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci56b29tTGF5ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJ6b29tTGF5ZXJFeHRlbnRzKGFjdGl2ZUxheWVyKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIG1hdEJhZGdlQ29sb3I9XCJwcmltYXJ5XCIgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgPmZyYW1lX2luc3BlY3Q8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBpZ29MYXllckl0ZW1Ub29sYmFyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZUxheWVyVG9vbGJhclwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBsYXllcjogYWN0aXZlTGF5ZXIgfVwiXG4gICAgPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2lnb0xheWVySXRlbVRvb2xiYXJdXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvaWdvLXBhbmVsPlxuXG48aWdvLXBhbmVsXG4gICpuZ0lmPVwic2VsZWN0aW9uICYmIGxheWVycy5sZW5ndGggPiAwXCJcbiAgY2xhc3M9XCJpZ28tbGF5ZXItYWN0aW9ucy1jb250YWluZXJcIlxuICBbdGl0bGVdPVwiJ2lnby5nZW8ubGF5ZXIudG9vbHMnIHwgdHJhbnNsYXRlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImFjdGlvbnMtYnV0dG9ucy1tdWx0aVwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZGVsZXRlLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbZGlzYWJsZWRdPVwibGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09IDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIGlzQWxsTGF5ZXJzUmVtb3ZhYmxlKGxheWVyc0NoZWNrZWQpXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIucmVtb3ZlU2VsZWN0ZWRMYXllcnMnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLnJlbW92ZVNlbGVjdGVkTGF5ZXJzUmVzdHJpY3Rpb24nIHwgdHJhbnNsYXRlKVxuICAgICAgXCJcbiAgICAgIChjbGljayk9XCJyZW1vdmVMYXllcnMobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cIichJ1wiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cImlzQWxsTGF5ZXJzUmVtb3ZhYmxlKGxheWVyc0NoZWNrZWQpXCJcbiAgICAgICAgPmRlbGV0ZTwvbWF0LWljb25cbiAgICAgID5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZXllLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbZGlzYWJsZWRdPVwibGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09IDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzQ2hlY2sgPT09ICdBTExfSElEREVOJ1xuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLnNob3dTZWxlY3RlZExheWVycycgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIuaGlkZVNlbGVjdGVkTGF5ZXJzJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlVmlzaWJpbGl0eShsYXllcnNDaGVja2VkKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPnt7XG4gICAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzQ2hlY2sgPT09ICdBTExfSElEREVOJ1xuICAgICAgICAgID8gJ3Zpc2liaWxpdHlfb2ZmJ1xuICAgICAgICAgIDogJ3Zpc2liaWxpdHknXG4gICAgICB9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvd24tYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZFxuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLmZpbHRlckxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLmxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsb3dlckRpc2FibGVkU2VsZWN0aW9uXCJcbiAgICAgIChjbGljayk9XCJsb3dlckxheWVycyhsYXllcnNDaGVja2VkKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICBbbWF0QmFkZ2VdPVwic29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmQgPyAnIScgOiAnJ1wiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cImxvd2VyRGlzYWJsZWRTZWxlY3Rpb25cIlxuICAgICAgICA+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInVwLWJ1dHRvblwiXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgc29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmRcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5maWx0ZXJSYWlzZUxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5yYWlzZUxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICBbZGlzYWJsZWRdPVwicmFpc2VEaXNhYmxlZFNlbGVjdGlvblwiXG4gICAgICAoY2xpY2spPVwicmFpc2VMYXllcnMobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cInNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkID8gJyEnIDogJydcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJyYWlzZURpc2FibGVkU2VsZWN0aW9uXCJcbiAgICAgICAgPmFycm93X3Vwd2FyZDwvbWF0LWljb25cbiAgICAgID5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwib3BhY2l0eS1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwXCJcbiAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcGFjaXR5TWVudVwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5vcGFjaXR5JyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPm9wYWNpdHk8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPG1hdC1tZW51ICNvcGFjaXR5TWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cIm1hdC1tZW51LW9wYWNpdHktc2xpZGVyXCI+XG4gICAgICA8ZGl2IGlkPVwib3BhY2l0eS1tZW51XCI+XG4gICAgICAgIDwhLS0gVE9ETzogVGhlICd0aWNrSW50ZXJ2YWwnIHByb3BlcnR5IG5vIGxvbmdlciBleGlzdHMgLS0+XG4gICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgKm5nSWY9XCJsYXllcnNDaGVja2VkLmxlbmd0aFwiXG4gICAgICAgICAgaWQ9XCJvcGFjaXR5LXNsaWRlclwiXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgc2hvd1RpY2tNYXJrc1xuICAgICAgICAgIHN0ZXA9XCI1XCJcbiAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgIFttYXhdPVwiMTAwXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoZWNrT3BhY2l0eVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPjxpbnB1dCBtYXRTbGlkZXJUaHVtYiAvPlxuICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1tZW51PlxuXG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgbGF5ZXJzQ2hlY2tlZC5sZW5ndGggIT09IDAgJiYgYWN0aXZlTGF5ZXJzRXh0ZW50QXJlVmFsaWQobGF5ZXJzQ2hlY2tlZClcbiAgICAgIFwiXG4gICAgICBjbGFzcz1cInpvb21MYXllci1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIuem9vbUxheWVycycgfCB0cmFuc2xhdGVcIlxuICAgICAgKGNsaWNrKT1cInpvb21MYXllcnNFeHRlbnRzKGxheWVyc0NoZWNrZWQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+ZnJhbWVfaW5zcGVjdDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9pZ28tcGFuZWw+XG4iXX0=
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixh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L2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTbGlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZXInO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHtcbiAgTWF0VHJlZUZsYXREYXRhU291cmNlLFxuICBNYXRUcmVlRmxhdHRlbmVyLFxuICBNYXRUcmVlTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuXG5pbXBvcnQge1xuICBEcm9wUGVybWlzc2lvbixcbiAgVHJlZURyYWdEcm9wRGlyZWN0aXZlLFxuICBUcmVlRHJvcEV2ZW50LFxuICBUcmVlRmxhdE5vZGVcbn0gZnJvbSAnQGlnbzIvY29tbW9uL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBJY29uU3ZnLFxuICBJZ29JY29uQ29tcG9uZW50LFxuICBWRUNUT1JfU1FVQVJFX0lDT05cbn0gZnJvbSAnQGlnbzIvY29tbW9uL2ljb24nO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAaWdvMi9jb21tb24vbGlzdCc7XG5pbXBvcnQgeyBQYW5lbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9wYW5lbCc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBMYXllckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgTGF5ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItaXRlbSc7XG5pbXBvcnQgeyBMYXllckxpc3RUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJWaWV3ZXJPcHRpb25zIH0gZnJvbSAnLi4vbGF5ZXItdmlld2VyL2xheWVyLXZpZXdlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXJUeXBlIH0gZnJvbSAnLi4vc2hhcmVkJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJDb250cm9sbGVyIH0gZnJvbSAnLi4vc2hhcmVkL2xheWVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBBbnlMYXllciB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvYW55LWxheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXIgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJHcm91cCB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgaXNMYXllckdyb3VwLCBpc0xheWVySXRlbSB9IGZyb20gJy4uL3V0aWxzL2xheWVyLnV0aWxzJztcblxudHlwZSBMYXllckZsYXROb2RlPFQgPSBBbnlMYXllcj4gPSBUcmVlRmxhdE5vZGU8VD47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1sYXllci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXllci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxuICAgIE1hdFRyZWVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBUcmVlRHJhZ0Ryb3BEaXJlY3RpdmUsXG4gICAgTGF5ZXJMaXN0VG9vbENvbXBvbmVudCxcbiAgICBMYXllckdyb3VwQ29tcG9uZW50LFxuICAgIExpc3RDb21wb25lbnQsXG4gICAgTGF5ZXJJdGVtQ29tcG9uZW50LFxuICAgIExpc3RJdGVtRGlyZWN0aXZlLFxuICAgIFBhbmVsQ29tcG9uZW50LFxuICAgIElnb0xhbmd1YWdlTW9kdWxlLFxuICAgIElnb0ljb25Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMYXllckxpc3RDb21wb25lbnQge1xuICBwdWJsaWMgdG9nZ2xlT3BhY2l0eSA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29udHJvbGxlcjogTGF5ZXJDb250cm9sbGVyO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBsYXllcnMobGF5ZXJzOiBBbnlMYXllcltdKSB7XG4gICAgdGhpcy5fbGF5ZXJzID0gbGF5ZXJzO1xuICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZShsYXllcnMgPz8gW10pO1xuICB9XG4gIGdldCBsYXllcnMoKTogQW55TGF5ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVycztcbiAgfVxuICBwcml2YXRlIF9sYXllcnM6IEFueUxheWVyW107XG5cbiAgQElucHV0KCkgaXNEZXNrdG9wOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0RyYWdEcm9wRGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdEFsbDogYm9vbGVhbjtcbiAgQElucHV0KCkgdmlld2VyT3B0aW9uczogTGF5ZXJWaWV3ZXJPcHRpb25zO1xuXG4gIEBPdXRwdXQoKSBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFueUxheWVyPigpO1xuXG4gIHByaXZhdGUgX3RyYW5zZm9ybWVyID0gKGxheWVyOiBBbnlMYXllciwgbGV2ZWw6IG51bWJlcik6IExheWVyRmxhdE5vZGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogbGF5ZXIuaWQgfHwgbGF5ZXIub3B0aW9ucy5uYW1lLFxuICAgICAgaXNHcm91cDogISFpc0xheWVyR3JvdXAobGF5ZXIpLFxuICAgICAgZGVzY2VuZGFudExldmVsczogaXNMYXllckdyb3VwKGxheWVyKVxuICAgICAgICA/IGxheWVyLmRlc2NlbmRhbnRzTGV2ZWxcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICBkYXRhOiBsYXllcixcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gIH07XG5cbiAgdHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPExheWVyRmxhdE5vZGU+KFxuICAgIChub2RlKSA9PiBub2RlLmxldmVsLFxuICAgIChub2RlKSA9PiBub2RlLmlzR3JvdXBcbiAgKTtcblxuICB0cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXG4gICAgdGhpcy5fdHJhbnNmb3JtZXIsXG4gICAgKG5vZGUpID0+IG5vZGUubGV2ZWwsXG4gICAgKG5vZGUpID0+IG5vZGUuaXNHcm91cCxcbiAgICAobm9kZSkgPT5cbiAgICAgIChub2RlIGFzIExheWVyR3JvdXApLmNoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5zaG93SW5MYXllckxpc3QpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnpJbmRleCArIGIuekluZGV4KVxuICApO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxBbnlMYXllciwgTGF5ZXJGbGF0Tm9kZT47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKFxuICAgICAgdGhpcy50cmVlQ29udHJvbCxcbiAgICAgIHRoaXMudHJlZUZsYXR0ZW5lcixcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuXG4gIGlzR3JvdXAgPSAoXzogbnVtYmVyLCBub2RlOiBMYXllckZsYXROb2RlKSA9PiBub2RlLmlzR3JvdXA7XG5cbiAgaXNMYXllckdyb3VwID0gaXNMYXllckdyb3VwO1xuICBpc0xheWVySXRlbSA9IGlzTGF5ZXJJdGVtO1xuXG4gIGlzU2VsZWN0ZWQgPSAobGF5ZXI6IEFueUxheWVyKTogYm9vbGVhbiA9PiB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG4gIGlzRGVzY2VuZGFudFNlbGVjdGlvbiA9IChsYXllcjogQW55TGF5ZXIpOiBib29sZWFuID0+XG4gICAgdGhpcy5jb250cm9sbGVyLmlzRGVzY2VuZGFudFNlbGVjdGlvbihsYXllcik7XG5cbiAgdG9nZ2xlQWN0aXZlKGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgIGlmICghaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNlbGVjdChsYXllcik7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQobGF5ZXIpO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0KGNoZWNrZWQ6IGJvb2xlYW4sIGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNoZWNrZWQgPyB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0KGxheWVyKSA6IHRoaXMuY29udHJvbGxlci5kZXNlbGVjdChsYXllcik7XG4gIH1cblxuICBnZXRMYXllclR5cGUobGF5ZXI6IExheWVyKTogTGF5ZXJUeXBlIHwgJ21lYXN1cmUnIHwgJ2RyYXcnIHtcbiAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gJ3Jhc3RlcidcbiAgICAgIDogbGF5ZXIuaWQuaW5jbHVkZXMoJ21lYXN1cmUnKVxuICAgICAgICA/ICdtZWFzdXJlJ1xuICAgICAgICA6IGxheWVyLmlkLmluY2x1ZGVzKCdkcmF3JylcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogJ3ZlY3Rvcic7XG4gIH1cblxuICBnZXRMYXllckljb24obGF5ZXI6IExheWVyKTogc3RyaW5nIHwgSWNvblN2ZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0TGF5ZXJUeXBlKGxheWVyKTtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gbGF5ZXIuYmFzZUxheWVyXG4gICAgICAgID8gJ3dhbGxwYXBlcidcbiAgICAgICAgOiAnaW1hZ2UnXG4gICAgICA6IHR5cGUgPT09ICdtZWFzdXJlJ1xuICAgICAgICA/ICdzcXVhcmVfZm9vdCdcbiAgICAgICAgOiB0eXBlID09PSAnZHJhdydcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogVkVDVE9SX1NRVUFSRV9JQ09OO1xuICB9XG5cbiAgZHJvcE5vZGUoeyBub2RlLCByZWYsIHBvc2l0aW9uIH06IFRyZWVEcm9wRXZlbnQ8QW55TGF5ZXI+KTogdm9pZCB7XG4gICAgbGV0IG5vZGVzVG9Ecm9wID0gW25vZGUuZGF0YV07XG5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyLmhhc1NlbGVjdGlvbikge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBjb3VsZCBjb250YWlucyBkYXRhIGZyb20gdGhlIG91dHNpZGUgdGhlIFRyZWVDb250cm9sbGVyXG4gICAgICBub2Rlc1RvRHJvcCA9IHRoaXMuY29udHJvbGxlci5zZWxlY3RlZC5maWx0ZXIoXG4gICAgICAgIChsYXllcikgPT4gISF0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pc0dyb3VwKSB7XG4gICAgICBub2Rlc1RvRHJvcCA9IG5vZGVzVG9Ecm9wLmZpbHRlcihcbiAgICAgICAgKG5vZGVEcm9wKSA9PiAhKG5vZGUuZGF0YSBhcyBMYXllckdyb3VwKS5pc0Rlc2NlbmRhbnQobm9kZURyb3ApXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWYuaXNHcm91cCkge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGVzVG9Ecm9wLnNvbWUoKG5vZGVEcm9wKSA9PiBub2RlRHJvcC5pZCA9PT0gcmVmLmlkKTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIG5vZGVzVG9Ecm9wID0gbm9kZXNUb0Ryb3AuZmlsdGVyKChub2RlRHJvcCkgPT4gbm9kZURyb3AuaWQgIT09IHJlZi5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2Rlc1RvRHJvcC5pbmNsdWRlcyhub2RlLmRhdGEpKSB7XG4gICAgICBub2Rlc1RvRHJvcC5wdXNoKG5vZGUuZGF0YSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAnYWJvdmUnOlxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubW92ZUFib3ZlKHJlZi5kYXRhLCAuLi5ub2Rlc1RvRHJvcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5zaWRlJzpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVJbnNpZGUocmVmLmRhdGEgYXMgTGF5ZXJHcm91cCwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVCZWxvdyhyZWYuZGF0YSwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBkcm9wTm9kZUVycm9yKGRldGFpbHM6IERyb3BQZXJtaXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgIGRldGFpbHMubWVzc2FnZSxcbiAgICAgICdpZ28uZ2VvLmxheWVyLmxheWVyJyxcbiAgICAgIG51bGwsXG4gICAgICBkZXRhaWxzLnBhcmFtc1xuICAgICk7XG4gIH1cblxuICBkcmFnU3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyT3B0aW9ucy5tb2RlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbGxlci5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgaGFuZGxlTm9kZVRvZ2dsZShub2RlOiBMYXllckZsYXROb2RlPExheWVyR3JvdXA+KTogdm9pZCB7XG4gICAgbm9kZS5kYXRhLmV4cGFuZGVkID0gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5TGF5ZXJJZChpZDogc3RyaW5nKTogTGF5ZXJGbGF0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YXNvdXJjZShsYXllcnM6IEFueUxheWVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBleHBhbnNpb25Nb2RlbCA9IHRoaXMudHJlZUNvbnRyb2wuZXhwYW5zaW9uTW9kZWw7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBsYXllcnM7XG5cbiAgICB0aGlzLmlzSW5pdFxuICAgICAgPyB0aGlzLnJlc3RvcmVNb2RlbChleHBhbnNpb25Nb2RlbCwgKG5vZGUpID0+XG4gICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmV4cGFuZEdyb3VwKGxheWVycyk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbml0ICYmIGxheWVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVjdXJzaXZlICovXG4gIHByaXZhdGUgZXhwYW5kR3JvdXAobGF5ZXJzOiBBbnlMYXllcltdKTogdm9pZCB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICBpZiAoIWlzTGF5ZXJHcm91cChsYXllcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGxheWVyLmV4cGFuZGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGFuZEdyb3VwKGxheWVyLmNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1vZGVsKFxuICAgIG1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxMYXllckZsYXROb2RlPixcbiAgICBjYWxsYmFjazogKG5vZGU6IExheWVyRmxhdE5vZGUpID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20obW9kZWxbJ19zZWxlY3Rpb24nXSkubWFwKFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVsnaWQnXVxuICAgICk7XG4gICAgbW9kZWwuY2xlYXIoKTtcbiAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAobW9kZWwuaXNTZWxlY3RlZChub2RlKSB8fCBpZHMuaW5jbHVkZXMobm9kZS5pZCkpIHtcbiAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtdHJlZVxuICBbY2xhc3MuLS1ub3QtZGVza3RvcF09XCIhaXNEZXNrdG9wXCJcbiAgaWdvVHJlZURyYWdEcm9wXG4gIFt0cmVlRHJhZ0Ryb3BJc0Rpc2FibGVkXT1cImlzRHJhZ0Ryb3BEaXNhYmxlZFwiXG4gIFttYXhMZXZlbF09XCJ2aWV3ZXJPcHRpb25zPy5ncm91cD8ubWF4SGllcmFyY2h5TGV2ZWxcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgKGRyYWdTdGFydCk9XCJkcmFnU3RhcnQoKVwiXG4gIChvbkRyb3ApPVwiZHJvcE5vZGUoJGV2ZW50KVwiXG4gIChvbkRyb3BFcnJvcik9XCJkcm9wTm9kZUVycm9yKCRldmVudClcIlxuPlxuICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgbGVhZiBub2RlcyAtLT5cbiAgPG1hdC10cmVlLW5vZGVcbiAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiXG4gICAgW2NsYXNzLi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpXCJcbiAgICBbY2xhc3MuLS1jaGlsZHJlbi1zZWxlY3RlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gID5cbiAgICA8aWdvLWxheWVyLWl0ZW1cbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmddPVwibm9kZS5sZXZlbCA9PT0gMCA/IDEgOiBub2RlLmxldmVsXCJcbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnRdPVwibm9kZS5sZXZlbCA9PT0gMCA/IDE2IDogMjQgKyAxNiAvIG5vZGUubGV2ZWxcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtaXRlbVwiXG4gICAgICBbbGF5ZXJdPVwibm9kZS5kYXRhXCJcbiAgICAgIFt2aXNpYmxlXT1cIm5vZGUuZGF0YS52aXNpYmxlXCJcbiAgICAgIFt2aWV3ZXJPcHRpb25zXT1cInZpZXdlck9wdGlvbnNcIlxuICAgICAgW3NlbGVjdGVkXT1cImlzU2VsZWN0ZWQobm9kZS5kYXRhKSB8fCBpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICBbc2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNEZXNjZW5kYW50U2VsZWN0aW9uKG5vZGUuZGF0YSlcIlxuICAgICAgKGFjdGlvbik9XCJ0b2dnbGVBY3RpdmUoJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0Q2hhbmdlKT1cImhhbmRsZVNlbGVjdCgkZXZlbnQsIG5vZGUuZGF0YSlcIlxuICAgID5cbiAgICA8L2lnby1sYXllci1pdGVtPlxuICA8L21hdC10cmVlLW5vZGU+XG4gIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICA8bWF0LXRyZWUtbm9kZVxuICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBpc0dyb3VwXCJcbiAgICBbY2xhc3MuLS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG5vZGUuZGF0YSlcIlxuICAgIFtjbGFzcy4tLWNoaWxkcmVuLXNlbGVjdGVkXT1cImlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgPlxuICAgIDxpZ28tbGF5ZXItZ3JvdXBcbiAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgW21hdFRyZWVOb2RlUGFkZGluZ0luZGVudF09XCIyNFwiXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1pdGVtXCJcbiAgICAgIFtsYXllcl09XCJub2RlLmRhdGFcIlxuICAgICAgW3ZpZXdlck9wdGlvbnNdPVwidmlld2VyT3B0aW9uc1wiXG4gICAgICBbc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpIHx8IGlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgICAgIFtzZWxlY3Rpb25EaXNhYmxlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICAoYWN0aW9uKT1cInRvZ2dsZUFjdGl2ZSgkZXZlbnQpXCJcbiAgICAgIChleHBhbmQpPVwidHJlZUNvbnRyb2wudG9nZ2xlKG5vZGUpOyBoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgIChzZWxlY3RDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0KCRldmVudCwgbm9kZS5kYXRhKVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcbiAgICAgICAgY2xhc3M9XCJsYXllci1pbmRpY2F0b3JcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGUuZGF0YS50aXRsZVwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiPlxuICAgICAgICAgIHt7XG4gICAgICAgICAgICB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICAgICAgICAgID8gJ2tleWJvYXJkX2Fycm93X2Rvd24nXG4gICAgICAgICAgICAgIDogJ2tleWJvYXJkX2Fycm93X3JpZ2h0J1xuICAgICAgICAgIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2lnby1sYXllci1ncm91cD5cbiAgPC9tYXQtdHJlZS1ub2RlPlxuPC9tYXQtdHJlZT5cbiJdfQ==