@igo2/geo 18.0.1-next.2 → 18.0.2

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 (512) hide show
  1. package/esm2022/igo2-geo.mjs +5 -0
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +234 -0
  3. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +272 -0
  4. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -0
  5. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +19 -0
  6. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +136 -0
  7. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +60 -0
  8. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +232 -0
  9. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +24 -0
  10. package/esm2022/lib/catalog/catalog-library/index.mjs +4 -0
  11. package/esm2022/lib/catalog/catalog.module.mjs +26 -0
  12. package/esm2022/lib/catalog/index.mjs +6 -0
  13. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +32 -0
  14. package/esm2022/lib/catalog/shared/catalog.enum.mjs +16 -0
  15. package/esm2022/lib/catalog/shared/catalog.interface.mjs +2 -0
  16. package/esm2022/lib/catalog/shared/catalog.service.mjs +706 -0
  17. package/esm2022/lib/catalog/shared/catalogs.mjs +75 -0
  18. package/esm2022/lib/catalog/shared/index.mjs +5 -0
  19. package/esm2022/lib/datasource/index.mjs +3 -0
  20. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +17 -0
  21. package/esm2022/lib/datasource/shared/capabilities.service.mjs +441 -0
  22. package/esm2022/lib/datasource/shared/datasource.service.mjs +258 -0
  23. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
  24. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
  25. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
  26. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +222 -0
  27. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
  28. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +118 -0
  29. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
  30. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +24 -0
  31. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +3 -0
  32. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
  33. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +42 -0
  34. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
  35. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +52 -0
  36. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
  37. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +70 -0
  38. package/esm2022/lib/datasource/shared/datasources/index.mjs +36 -0
  39. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
  40. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +33 -0
  41. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
  42. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +14 -0
  43. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
  44. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +60 -0
  45. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
  46. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +17 -0
  47. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
  48. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +56 -0
  49. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
  50. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +137 -0
  51. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +170 -0
  52. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
  53. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +227 -0
  54. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +224 -0
  55. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
  56. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +18 -0
  57. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
  58. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +11 -0
  59. package/esm2022/lib/datasource/shared/index.mjs +6 -0
  60. package/esm2022/lib/datasource/shared/options/index.mjs +5 -0
  61. package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +2 -0
  62. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +15 -0
  63. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +85 -0
  64. package/esm2022/lib/datasource/shared/options/options.service.mjs +3 -0
  65. package/esm2022/lib/datasource/utils/index.mjs +2 -0
  66. package/esm2022/lib/datasource/utils/tilegrid.mjs +20 -0
  67. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +246 -0
  68. package/esm2022/lib/directions/directions-buttons/index.mjs +2 -0
  69. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +312 -0
  70. package/esm2022/lib/directions/directions-inputs/index.mjs +2 -0
  71. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +192 -0
  72. package/esm2022/lib/directions/directions-results/index.mjs +2 -0
  73. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -0
  74. package/esm2022/lib/directions/directions-sources/directions-source.mjs +3 -0
  75. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +23 -0
  76. package/esm2022/lib/directions/directions-sources/index.mjs +5 -0
  77. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +159 -0
  78. package/esm2022/lib/directions/directions.component.mjs +437 -0
  79. package/esm2022/lib/directions/directions.module.mjs +46 -0
  80. package/esm2022/lib/directions/directions.provider.mjs +16 -0
  81. package/esm2022/lib/directions/index.mjs +8 -0
  82. package/esm2022/lib/directions/shared/directions-source.service.mjs +18 -0
  83. package/esm2022/lib/directions/shared/directions.enum.mjs +72 -0
  84. package/esm2022/lib/directions/shared/directions.interface.mjs +2 -0
  85. package/esm2022/lib/directions/shared/directions.service.mjs +239 -0
  86. package/esm2022/lib/directions/shared/directions.utils.mjs +522 -0
  87. package/esm2022/lib/directions/shared/index.mjs +6 -0
  88. package/esm2022/lib/directions/shared/store.mjs +21 -0
  89. package/esm2022/lib/download/download-button/download-button.component.mjs +48 -0
  90. package/esm2022/lib/download/download-button/index.mjs +2 -0
  91. package/esm2022/lib/download/download.module.mjs +24 -0
  92. package/esm2022/lib/download/index.mjs +3 -0
  93. package/esm2022/lib/download/shared/download.interface.mjs +2 -0
  94. package/esm2022/lib/download/shared/download.service.mjs +67 -0
  95. package/esm2022/lib/download/shared/index.mjs +3 -0
  96. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +42 -0
  97. package/esm2022/lib/draw/draw/draw-popup.component.mjs +421 -0
  98. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +28 -0
  99. package/esm2022/lib/draw/draw/draw.component.mjs +1136 -0
  100. package/esm2022/lib/draw/draw/draw.module.mjs +19 -0
  101. package/esm2022/lib/draw/drawingTool.module.mjs +18 -0
  102. package/esm2022/lib/draw/index.mjs +3 -0
  103. package/esm2022/lib/draw/shared/draw-icon.service.mjs +30 -0
  104. package/esm2022/lib/draw/shared/draw.enum.mjs +21 -0
  105. package/esm2022/lib/draw/shared/draw.interface.mjs +2 -0
  106. package/esm2022/lib/draw/shared/draw.utils.mjs +125 -0
  107. package/esm2022/lib/draw/shared/index.mjs +5 -0
  108. package/esm2022/lib/environment/environment.interface.mjs +2 -0
  109. package/esm2022/lib/environment/index.mjs +2 -0
  110. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +306 -0
  111. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +56 -0
  112. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +26 -0
  113. package/esm2022/lib/feature/feature-details/index.mjs +4 -0
  114. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +101 -0
  115. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +19 -0
  116. package/esm2022/lib/feature/feature.module.mjs +26 -0
  117. package/esm2022/lib/feature/index.mjs +5 -0
  118. package/esm2022/lib/feature/shared/feature-store.utils.mjs +28 -0
  119. package/esm2022/lib/feature/shared/feature.enums.mjs +9 -0
  120. package/esm2022/lib/feature/shared/feature.interfaces.mjs +2 -0
  121. package/esm2022/lib/feature/shared/feature.utils.mjs +332 -0
  122. package/esm2022/lib/feature/shared/index.mjs +8 -0
  123. package/esm2022/lib/feature/shared/store.mjs +143 -0
  124. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +216 -0
  125. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +119 -0
  126. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +99 -0
  127. package/esm2022/lib/feature/shared/strategies/index.mjs +8 -0
  128. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +103 -0
  129. package/esm2022/lib/feature/shared/strategies/loading.mjs +136 -0
  130. package/esm2022/lib/feature/shared/strategies/search.mjs +158 -0
  131. package/esm2022/lib/feature/shared/strategies/selection.mjs +385 -0
  132. package/esm2022/lib/feature/shared/strategies.utils.mjs +37 -0
  133. package/esm2022/lib/filter/filter.module.mjs +131 -0
  134. package/esm2022/lib/filter/index.mjs +17 -0
  135. package/esm2022/lib/filter/ogc-filter-button/index.mjs +2 -0
  136. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +141 -0
  137. package/esm2022/lib/filter/ogc-filter-form/index.mjs +2 -0
  138. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +325 -0
  139. package/esm2022/lib/filter/ogc-filter-selection/index.mjs +2 -0
  140. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +787 -0
  141. package/esm2022/lib/filter/ogc-filter-time/index.mjs +3 -0
  142. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +201 -0
  143. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +665 -0
  144. package/esm2022/lib/filter/ogc-filterable-form/index.mjs +2 -0
  145. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +66 -0
  146. package/esm2022/lib/filter/ogc-filterable-item/index.mjs +2 -0
  147. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +244 -0
  148. package/esm2022/lib/filter/ogc-filterable-list/index.mjs +3 -0
  149. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +39 -0
  150. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +32 -0
  151. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +63 -0
  152. package/esm2022/lib/filter/shared/index.mjs +12 -0
  153. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
  154. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +30 -0
  155. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +2 -0
  156. package/esm2022/lib/filter/shared/ogc-filter.mjs +756 -0
  157. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +47 -0
  158. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +23 -0
  159. package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +2 -0
  160. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +282 -0
  161. package/esm2022/lib/filter/shared/time-filter.enum.mjs +13 -0
  162. package/esm2022/lib/filter/shared/time-filter.interface.mjs +2 -0
  163. package/esm2022/lib/filter/shared/time-filter.service.mjs +107 -0
  164. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
  165. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +875 -0
  166. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
  167. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +191 -0
  168. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
  169. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +120 -0
  170. package/esm2022/lib/filter/time-filter-button/index.mjs +2 -0
  171. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +70 -0
  172. package/esm2022/lib/filter/time-filter-form/index.mjs +2 -0
  173. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +537 -0
  174. package/esm2022/lib/filter/time-filter-item/index.mjs +2 -0
  175. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +90 -0
  176. package/esm2022/lib/filter/time-filter-list/index.mjs +3 -0
  177. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +39 -0
  178. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +24 -0
  179. package/esm2022/lib/geo.module.mjs +63 -0
  180. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +559 -0
  181. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +170 -0
  182. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +24 -0
  183. package/esm2022/lib/geometry/geometry-form-field/index.mjs +4 -0
  184. package/esm2022/lib/geometry/geometry.module.mjs +18 -0
  185. package/esm2022/lib/geometry/index.mjs +3 -0
  186. package/esm2022/lib/geometry/shared/controls/draw.mjs +340 -0
  187. package/esm2022/lib/geometry/shared/controls/index.mjs +4 -0
  188. package/esm2022/lib/geometry/shared/controls/modify.mjs +538 -0
  189. package/esm2022/lib/geometry/shared/controls/slice.mjs +190 -0
  190. package/esm2022/lib/geometry/shared/geometry.errors.mjs +24 -0
  191. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +2 -0
  192. package/esm2022/lib/geometry/shared/geometry.utils.mjs +113 -0
  193. package/esm2022/lib/geometry/shared/index.mjs +5 -0
  194. package/esm2022/lib/import-export/export-button/export-button.component.mjs +49 -0
  195. package/esm2022/lib/import-export/export-button/index.mjs +2 -0
  196. package/esm2022/lib/import-export/import-export/import-export.component.mjs +876 -0
  197. package/esm2022/lib/import-export/import-export/index.mjs +2 -0
  198. package/esm2022/lib/import-export/import-export.module.mjs +31 -0
  199. package/esm2022/lib/import-export/index.mjs +5 -0
  200. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +114 -0
  201. package/esm2022/lib/import-export/shared/export.errors.mjs +15 -0
  202. package/esm2022/lib/import-export/shared/export.interface.mjs +2 -0
  203. package/esm2022/lib/import-export/shared/export.service.mjs +378 -0
  204. package/esm2022/lib/import-export/shared/export.type.mjs +13 -0
  205. package/esm2022/lib/import-export/shared/export.utils.mjs +51 -0
  206. package/esm2022/lib/import-export/shared/import.errors.mjs +39 -0
  207. package/esm2022/lib/import-export/shared/import.interface.mjs +2 -0
  208. package/esm2022/lib/import-export/shared/import.service.mjs +221 -0
  209. package/esm2022/lib/import-export/shared/import.utils.mjs +203 -0
  210. package/esm2022/lib/import-export/shared/index.mjs +11 -0
  211. package/esm2022/lib/layer/index.mjs +16 -0
  212. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  213. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  214. package/esm2022/lib/layer/layer-item/index.mjs +2 -0
  215. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +196 -0
  216. package/esm2022/lib/layer/layer-legend/index.mjs +2 -0
  217. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +287 -0
  218. package/esm2022/lib/layer/layer-legend-item/index.mjs +2 -0
  219. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +85 -0
  220. package/esm2022/lib/layer/layer-legend-list/index.mjs +3 -0
  221. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +54 -0
  222. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +104 -0
  223. package/esm2022/lib/layer/layer-list/index.mjs +2 -0
  224. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +232 -0
  225. package/esm2022/lib/layer/layer-list-tool/index.mjs +4 -0
  226. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +92 -0
  227. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -0
  228. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +61 -0
  229. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  230. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  231. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  232. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +26 -0
  233. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  234. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  235. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  236. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  237. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  238. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  239. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  240. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  241. package/esm2022/lib/layer/layer.module.mjs +107 -0
  242. package/esm2022/lib/layer/shared/clusterParam.mjs +2 -0
  243. package/esm2022/lib/layer/shared/index.mjs +6 -0
  244. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  245. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  246. package/esm2022/lib/layer/shared/layer.enums.mjs +2 -0
  247. package/esm2022/lib/layer/shared/layer.service.mjs +315 -0
  248. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
  249. package/esm2022/lib/layer/shared/layers/any-layer.mjs +2 -0
  250. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
  251. package/esm2022/lib/layer/shared/layers/image-layer.mjs +75 -0
  252. package/esm2022/lib/layer/shared/layers/index.mjs +18 -0
  253. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  254. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  255. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  256. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +7 -0
  257. package/esm2022/lib/layer/shared/layers/layer.mjs +178 -0
  258. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +2 -0
  259. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  260. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  261. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  262. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  263. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
  264. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +55 -0
  265. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
  266. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +576 -0
  267. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
  268. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +112 -0
  269. package/esm2022/lib/layer/track-feature-button/index.mjs +2 -0
  270. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +54 -0
  271. package/esm2022/lib/layer/utils/image-watcher.mjs +62 -0
  272. package/esm2022/lib/layer/utils/index.mjs +6 -0
  273. package/esm2022/lib/layer/utils/layer.utils.mjs +57 -0
  274. package/esm2022/lib/layer/utils/outputLegend.mjs +32 -0
  275. package/esm2022/lib/layer/utils/tile-watcher.mjs +52 -0
  276. package/esm2022/lib/layer/utils/vector-watcher.mjs +50 -0
  277. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
  278. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +87 -0
  279. package/esm2022/lib/map/baselayers-switcher/index.mjs +3 -0
  280. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +122 -0
  281. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +78 -0
  282. package/esm2022/lib/map/geolocate-button/index.mjs +2 -0
  283. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +73 -0
  284. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +2 -0
  285. package/esm2022/lib/map/home-extent-button/index.mjs +3 -0
  286. package/esm2022/lib/map/index.mjs +14 -0
  287. package/esm2022/lib/map/info-section/index.mjs +2 -0
  288. package/esm2022/lib/map/info-section/info-section.component.mjs +15 -0
  289. package/esm2022/lib/map/map-browser/index.mjs +2 -0
  290. package/esm2022/lib/map/map-browser/map-browser.component.mjs +67 -0
  291. package/esm2022/lib/map/map-center/index.mjs +2 -0
  292. package/esm2022/lib/map/map-center/map-center.component.mjs +56 -0
  293. package/esm2022/lib/map/map.module.mjs +89 -0
  294. package/esm2022/lib/map/menu-button/index.mjs +2 -0
  295. package/esm2022/lib/map/menu-button/menu-button.component.mjs +57 -0
  296. package/esm2022/lib/map/offline-button/index.mjs +2 -0
  297. package/esm2022/lib/map/offline-button/offline-button.component.mjs +53 -0
  298. package/esm2022/lib/map/rotation-button/index.mjs +2 -0
  299. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +58 -0
  300. package/esm2022/lib/map/shared/controllers/controller.mjs +44 -0
  301. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +8 -0
  302. package/esm2022/lib/map/shared/controllers/geolocation.mjs +431 -0
  303. package/esm2022/lib/map/shared/controllers/index.mjs +5 -0
  304. package/esm2022/lib/map/shared/controllers/view.mjs +361 -0
  305. package/esm2022/lib/map/shared/hover-feature.directive.mjs +481 -0
  306. package/esm2022/lib/map/shared/index.mjs +15 -0
  307. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +238 -0
  308. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +122 -0
  309. package/esm2022/lib/map/shared/map.abstract.mjs +24 -0
  310. package/esm2022/lib/map/shared/map.enums.mjs +6 -0
  311. package/esm2022/lib/map/shared/map.interface.mjs +2 -0
  312. package/esm2022/lib/map/shared/map.mjs +201 -0
  313. package/esm2022/lib/map/shared/map.service.mjs +29 -0
  314. package/esm2022/lib/map/shared/map.utils.mjs +455 -0
  315. package/esm2022/lib/map/shared/mapOffline.directive.mjs +114 -0
  316. package/esm2022/lib/map/shared/projection.interfaces.mjs +2 -0
  317. package/esm2022/lib/map/shared/projection.service.mjs +67 -0
  318. package/esm2022/lib/map/shared/projection.utils.mjs +122 -0
  319. package/esm2022/lib/map/swipe-control/index.mjs +2 -0
  320. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +211 -0
  321. package/esm2022/lib/map/utils/index.mjs +2 -0
  322. package/esm2022/lib/map/utils/layer-watcher.mjs +112 -0
  323. package/esm2022/lib/map/wake-lock-button/index.mjs +2 -0
  324. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +103 -0
  325. package/esm2022/lib/map/zoom-button/index.mjs +2 -0
  326. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +35 -0
  327. package/esm2022/lib/measure/index.mjs +3 -0
  328. package/esm2022/lib/measure/measure.module.mjs +20 -0
  329. package/esm2022/lib/measure/measurer/index.mjs +6 -0
  330. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +40 -0
  331. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +38 -0
  332. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +143 -0
  333. package/esm2022/lib/measure/measurer/measurer.component.mjs +948 -0
  334. package/esm2022/lib/measure/measurer/measurer.module.mjs +20 -0
  335. package/esm2022/lib/measure/shared/index.mjs +4 -0
  336. package/esm2022/lib/measure/shared/measure.enum.mjs +37 -0
  337. package/esm2022/lib/measure/shared/measure.interfaces.mjs +2 -0
  338. package/esm2022/lib/measure/shared/measure.utils.mjs +497 -0
  339. package/esm2022/lib/metadata/index.mjs +4 -0
  340. package/esm2022/lib/metadata/metadata-button/index.mjs +2 -0
  341. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +96 -0
  342. package/esm2022/lib/metadata/metadata.module.mjs +29 -0
  343. package/esm2022/lib/metadata/shared/index.mjs +3 -0
  344. package/esm2022/lib/metadata/shared/metadata.interface.mjs +2 -0
  345. package/esm2022/lib/metadata/shared/metadata.service.mjs +18 -0
  346. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +130 -0
  347. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +6 -0
  348. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +2 -0
  349. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +172 -0
  350. package/esm2022/lib/offline/geoDB/index.mjs +5 -0
  351. package/esm2022/lib/offline/index.mjs +6 -0
  352. package/esm2022/lib/offline/layerDB/index.mjs +3 -0
  353. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +2 -0
  354. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +83 -0
  355. package/esm2022/lib/offline/offline.interface.mjs +2 -0
  356. package/esm2022/lib/offline/offline.provider.mjs +50 -0
  357. package/esm2022/lib/offline/shared/geo-network.service.mjs +79 -0
  358. package/esm2022/lib/offline/shared/index.mjs +2 -0
  359. package/esm2022/lib/overlay/index.mjs +2 -0
  360. package/esm2022/lib/overlay/shared/index.mjs +4 -0
  361. package/esm2022/lib/overlay/shared/overlay.enum.mjs +8 -0
  362. package/esm2022/lib/overlay/shared/overlay.mjs +139 -0
  363. package/esm2022/lib/overlay/shared/overlay.utils.mjs +17 -0
  364. package/esm2022/lib/print/index.mjs +4 -0
  365. package/esm2022/lib/print/print/print.component.mjs +116 -0
  366. package/esm2022/lib/print/print-form/index.mjs +2 -0
  367. package/esm2022/lib/print/print-form/print-form.component.mjs +320 -0
  368. package/esm2022/lib/print/print.module.mjs +20 -0
  369. package/esm2022/lib/print/shared/geopdf.mjs +68 -0
  370. package/esm2022/lib/print/shared/index.mjs +5 -0
  371. package/esm2022/lib/print/shared/print.interface.mjs +2 -0
  372. package/esm2022/lib/print/shared/print.service.mjs +1136 -0
  373. package/esm2022/lib/print/shared/print.type.mjs +30 -0
  374. package/esm2022/lib/query/index.mjs +2 -0
  375. package/esm2022/lib/query/query.module.mjs +27 -0
  376. package/esm2022/lib/query/shared/index.mjs +8 -0
  377. package/esm2022/lib/query/shared/query-search-source.mjs +35 -0
  378. package/esm2022/lib/query/shared/query-search-source.providers.mjs +22 -0
  379. package/esm2022/lib/query/shared/query.directive.mjs +290 -0
  380. package/esm2022/lib/query/shared/query.enums.mjs +32 -0
  381. package/esm2022/lib/query/shared/query.interfaces.mjs +2 -0
  382. package/esm2022/lib/query/shared/query.service.mjs +753 -0
  383. package/esm2022/lib/query/shared/query.utils.mjs +45 -0
  384. package/esm2022/lib/search/index.mjs +10 -0
  385. package/esm2022/lib/search/search-bar/search-bar.component.mjs +483 -0
  386. package/esm2022/lib/search/search-bar/search-bar.module.mjs +19 -0
  387. package/esm2022/lib/search/search-results/index.mjs +5 -0
  388. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +101 -0
  389. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +433 -0
  390. package/esm2022/lib/search/search-results/search-results-item.component.mjs +119 -0
  391. package/esm2022/lib/search/search-results/search-results.component.mjs +297 -0
  392. package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
  393. package/esm2022/lib/search/search-results/search-results.module.mjs +20 -0
  394. package/esm2022/lib/search/search-selector/search-selector.component.mjs +118 -0
  395. package/esm2022/lib/search/search-selector/search-selector.module.mjs +19 -0
  396. package/esm2022/lib/search/search-settings/search-settings.component.mjs +264 -0
  397. package/esm2022/lib/search/search-settings/search-settings.module.mjs +19 -0
  398. package/esm2022/lib/search/search.module.mjs +77 -0
  399. package/esm2022/lib/search/shared/index.mjs +10 -0
  400. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +328 -0
  401. package/esm2022/lib/search/shared/search-source-service.providers.mjs +20 -0
  402. package/esm2022/lib/search/shared/search-source.service.mjs +56 -0
  403. package/esm2022/lib/search/shared/search.enums.mjs +4 -0
  404. package/esm2022/lib/search/shared/search.interfaces.mjs +2 -0
  405. package/esm2022/lib/search/shared/search.provider.mjs +20 -0
  406. package/esm2022/lib/search/shared/search.service.mjs +149 -0
  407. package/esm2022/lib/search/shared/search.utils.mjs +92 -0
  408. package/esm2022/lib/search/shared/sources/cadastre.mjs +142 -0
  409. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +32 -0
  410. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
  411. package/esm2022/lib/search/shared/sources/coordinates.mjs +168 -0
  412. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +52 -0
  413. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +32 -0
  414. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
  415. package/esm2022/lib/search/shared/sources/icherche.mjs +816 -0
  416. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +87 -0
  417. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
  418. package/esm2022/lib/search/shared/sources/ilayer.mjs +339 -0
  419. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +58 -0
  420. package/esm2022/lib/search/shared/sources/index.mjs +23 -0
  421. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
  422. package/esm2022/lib/search/shared/sources/nominatim.mjs +263 -0
  423. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +31 -0
  424. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -0
  425. package/esm2022/lib/search/shared/sources/source.mjs +221 -0
  426. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
  427. package/esm2022/lib/search/shared/sources/storedqueries.mjs +454 -0
  428. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +56 -0
  429. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +2 -0
  430. package/esm2022/lib/search/shared/sources/workspace.mjs +192 -0
  431. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +31 -0
  432. package/esm2022/lib/style/index.mjs +5 -0
  433. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +360 -0
  434. package/esm2022/lib/style/shared/datasource/index.mjs +2 -0
  435. package/esm2022/lib/style/shared/feature/feature-style.mjs +162 -0
  436. package/esm2022/lib/style/shared/feature/index.mjs +2 -0
  437. package/esm2022/lib/style/shared/font.enum.mjs +17 -0
  438. package/esm2022/lib/style/shared/index.mjs +5 -0
  439. package/esm2022/lib/style/shared/overlay/index.mjs +3 -0
  440. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +39 -0
  441. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +88 -0
  442. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +78 -0
  443. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +27 -0
  444. package/esm2022/lib/style/shared/vector/index.mjs +4 -0
  445. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +2 -0
  446. package/esm2022/lib/style/style-list/index.mjs +5 -0
  447. package/esm2022/lib/style/style-list/style-list.interface.mjs +2 -0
  448. package/esm2022/lib/style/style-list/style-list.module.mjs +23 -0
  449. package/esm2022/lib/style/style-list/style-list.provider.mjs +21 -0
  450. package/esm2022/lib/style/style-list/style-list.service.mjs +52 -0
  451. package/esm2022/lib/style/style-modal/drawing/index.mjs +2 -0
  452. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +193 -0
  453. package/esm2022/lib/style/style-modal/index.mjs +5 -0
  454. package/esm2022/lib/style/style-modal/layer/index.mjs +2 -0
  455. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +142 -0
  456. package/esm2022/lib/style/style-modal/layer-button/index.mjs +2 -0
  457. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +44 -0
  458. package/esm2022/lib/style/style-modal/shared/index.mjs +2 -0
  459. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +2 -0
  460. package/esm2022/lib/style/style-service/draw-style.service.mjs +255 -0
  461. package/esm2022/lib/style/style-service/index.mjs +3 -0
  462. package/esm2022/lib/style/style-service/style.service.mjs +393 -0
  463. package/esm2022/lib/style/style.module.mjs +46 -0
  464. package/esm2022/lib/toast/index.mjs +2 -0
  465. package/esm2022/lib/toast/toast.component.mjs +99 -0
  466. package/esm2022/lib/toast/toast.module.mjs +24 -0
  467. package/esm2022/lib/utils/googleLinks.mjs +13 -0
  468. package/esm2022/lib/utils/id-generator.mjs +112 -0
  469. package/esm2022/lib/utils/index.mjs +5 -0
  470. package/esm2022/lib/utils/osmLinks.mjs +9 -0
  471. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +3 -0
  472. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +2 -0
  473. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +64 -0
  474. package/esm2022/lib/wkt/index.mjs +2 -0
  475. package/esm2022/lib/wkt/shared/index.mjs +2 -0
  476. package/esm2022/lib/wkt/shared/wkt.service.mjs +235 -0
  477. package/esm2022/lib/wkt/wkt.module.mjs +25 -0
  478. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +36 -0
  479. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +19 -0
  480. package/esm2022/lib/workspace/confirmation-popup/index.mjs +3 -0
  481. package/esm2022/lib/workspace/index.mjs +8 -0
  482. package/esm2022/lib/workspace/shared/edition-workspace.mjs +301 -0
  483. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +720 -0
  484. package/esm2022/lib/workspace/shared/feature-workspace.mjs +41 -0
  485. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +113 -0
  486. package/esm2022/lib/workspace/shared/index.mjs +8 -0
  487. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +41 -0
  488. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +121 -0
  489. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +248 -0
  490. package/esm2022/lib/workspace/shared/workspace.utils.mjs +188 -0
  491. package/esm2022/lib/workspace/widgets/index.mjs +4 -0
  492. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +48 -0
  493. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +19 -0
  494. package/esm2022/lib/workspace/widgets/widgets.mjs +15 -0
  495. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +172 -0
  496. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  497. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +137 -0
  498. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +19 -0
  499. package/esm2022/lib/workspace/workspace.module.mjs +32 -0
  500. package/esm2022/public_api.mjs +56 -0
  501. package/fesm2022/igo2-geo.mjs +717 -691
  502. package/fesm2022/igo2-geo.mjs.map +1 -1
  503. package/lib/datasource/shared/datasources/datasource.d.ts +2 -2
  504. package/lib/directions/shared/directions.service.d.ts +0 -1
  505. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  506. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  507. package/lib/style/style-list/style-list.provider.d.ts +8 -1
  508. package/lib/style/style-list/style-list.service.d.ts +1 -1
  509. package/package.json +16 -14
  510. package/src/lib/layer/layer-list/layer-list.theme.scss +1 -2
  511. package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
  512. package/src/style/style.scss +1 -1
@@ -0,0 +1,948 @@
1
+ import { AsyncPipe, DOCUMENT, NgIf } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, Inject, Input, ViewChild } from '@angular/core';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
5
+ import { MatDialog } from '@angular/material/dialog';
6
+ import { MatDividerModule } from '@angular/material/divider';
7
+ import { MatIconModule } from '@angular/material/icon';
8
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
9
+ import { MatTooltipModule } from '@angular/material/tooltip';
10
+ import { EntityTableComponent } from '@igo2/common/entity';
11
+ import { LanguageService } from '@igo2/core/language';
12
+ import { IgoLanguageModule } from '@igo2/core/language';
13
+ import { StorageScope, StorageService } from '@igo2/core/storage';
14
+ import { uuid } from '@igo2/utils';
15
+ import { unByKey } from 'ol/Observable';
16
+ import OlGeoJSON from 'ol/format/GeoJSON';
17
+ import OlVectorSource from 'ol/source/Vector';
18
+ import OlStyle from 'ol/style/Style';
19
+ import { BehaviorSubject } from 'rxjs';
20
+ import { skip } from 'rxjs/operators';
21
+ import { FeatureDataSource } from '../../datasource/shared/datasources';
22
+ import { FEATURE, FeatureStore, FeatureStoreLoadingStrategy, FeatureStoreSelectionStrategy, tryAddLoadingStrategy, tryAddSelectionStrategy, tryBindStoreLayer } from '../../feature';
23
+ import { DrawControl, ModifyControl } from '../../geometry/shared';
24
+ import { VectorLayer } from '../../layer/shared';
25
+ import { IgoMap } from '../../map/shared/map';
26
+ import { MeasureAreaUnit, MeasureLengthUnit, MeasureType } from '../shared/measure.enum';
27
+ import { createMeasureInteractionStyle, createMeasureLayerStyle, formatMeasure, getTooltipsOfOlGeometry, measureOlGeometry, metersToUnit, squareMetersToUnit, updateOlTooltipAtCenter, updateOlTooltipsAtMidpoints } from '../shared/measure.utils';
28
+ import { MeasurerDialogComponent } from './measurer-dialog.component';
29
+ import { MeasurerItemComponent } from './measurer-item.component';
30
+ import * as i0 from "@angular/core";
31
+ import * as i1 from "@igo2/core/language";
32
+ import * as i2 from "@angular/material/dialog";
33
+ import * as i3 from "@igo2/core/storage";
34
+ import * as i4 from "@angular/material/button-toggle";
35
+ import * as i5 from "@angular/material/slide-toggle";
36
+ import * as i6 from "@angular/material/divider";
37
+ import * as i7 from "@angular/material/button";
38
+ import * as i8 from "@angular/material/tooltip";
39
+ import * as i9 from "@angular/material/icon";
40
+ import * as i10 from "@ngx-translate/core";
41
+ /**
42
+ * Tool to measure lengths and areas
43
+ */
44
+ export class MeasurerComponent {
45
+ languageService;
46
+ dialog;
47
+ storageService;
48
+ document;
49
+ /**
50
+ * Table template
51
+ * @internal
52
+ */
53
+ tableTemplate;
54
+ subscriptions$$ = [];
55
+ /**
56
+ * Reference to the MeasureType enum
57
+ * @internal
58
+ */
59
+ measureType = MeasureType;
60
+ /**
61
+ * Reference to the AreaMeasureUnit enum
62
+ * @internal
63
+ */
64
+ measureAreaUnit = MeasureAreaUnit;
65
+ /**
66
+ * Reference to the LengthMeasureUnit enum
67
+ * @internal
68
+ */
69
+ measureLengthUnit = MeasureLengthUnit;
70
+ /**
71
+ * Whether measure units should be automatically determined
72
+ * @internal
73
+ */
74
+ measureUnitsAuto = false;
75
+ /**
76
+ * Whether display of distances of areas
77
+ * @internal
78
+ */
79
+ displayDistance = true;
80
+ /**
81
+ * Whether display of distances of lines
82
+ * @internal
83
+ */
84
+ displayLines = true;
85
+ /**
86
+ * Whether display of areas
87
+ * @internal
88
+ */
89
+ displayAreas = true;
90
+ /**
91
+ * Observable of line boolean
92
+ * @internal
93
+ */
94
+ hasLine$ = new BehaviorSubject(false);
95
+ /**
96
+ * Observable of area boolean
97
+ * @internal
98
+ */
99
+ hasArea$ = new BehaviorSubject(false);
100
+ /**
101
+ * Observable of area
102
+ * @internal
103
+ */
104
+ measure$ = new BehaviorSubject({});
105
+ /**
106
+ * Observable of selected features
107
+ * @internal
108
+ */
109
+ selectedFeatures$ = new BehaviorSubject([]);
110
+ /**
111
+ * OL draw source
112
+ * @internal
113
+ */
114
+ showTooltips = true;
115
+ /**
116
+ * Whether draw control toggle is disabled or not
117
+ * @internal
118
+ */
119
+ drawControlIsDisabled = true;
120
+ /**
121
+ * Draw line control
122
+ */
123
+ drawLineControl;
124
+ /**
125
+ * Draw polygon control
126
+ */
127
+ drawPolygonControl;
128
+ /**
129
+ * Modify control
130
+ */
131
+ modifyControl;
132
+ /**
133
+ * Active OL geometry
134
+ */
135
+ activeOlGeometry;
136
+ /**
137
+ * Active mlength unit
138
+ */
139
+ activeLengthUnit = MeasureLengthUnit.Meters;
140
+ /**
141
+ * Active area unit
142
+ */
143
+ activeAreaUnit = MeasureAreaUnit.SquareMeters;
144
+ /**
145
+ * Feature added listener key
146
+ */
147
+ onFeatureAddedKey;
148
+ /**
149
+ * Feature removed listener key
150
+ */
151
+ onFeatureRemovedKey;
152
+ /**
153
+ * Active draw control
154
+ * @internal
155
+ */
156
+ activeDrawControl;
157
+ /**
158
+ * Subscription to draw start
159
+ */
160
+ drawStart$$;
161
+ /**
162
+ * Subscription to draw end
163
+ */
164
+ drawEnd$$;
165
+ /**
166
+ * Subscription to controls changes
167
+ */
168
+ drawChanges$$;
169
+ /**
170
+ * Subscription to modify start
171
+ */
172
+ modifyStart$$;
173
+ /**
174
+ * Subscription to modify end
175
+ */
176
+ modifyEnd$$;
177
+ /**
178
+ * Subscription to controls changes
179
+ */
180
+ modifyChanges$$;
181
+ /**
182
+ * Subscription to measures selection
183
+ */
184
+ selectedFeatures$$;
185
+ /**
186
+ * OL draw source
187
+ */
188
+ olDrawSource = new OlVectorSource();
189
+ /**
190
+ * The map to measure on
191
+ */
192
+ map;
193
+ /**
194
+ * The measures store
195
+ */
196
+ store;
197
+ /**
198
+ * Measure type
199
+ * @internal
200
+ */
201
+ set activeMeasureType(value) {
202
+ this.setActiveMeasureType(value);
203
+ }
204
+ get activeMeasureType() {
205
+ return this._activeMeasureType;
206
+ }
207
+ _activeMeasureType;
208
+ /**
209
+ * The minimum length a segment must have to display a tooltip.
210
+ * It also applies to area tooltips.
211
+ */
212
+ minSegmentLength = 10;
213
+ table;
214
+ /**
215
+ * Wheter one of the draw control is active
216
+ * @internal
217
+ */
218
+ get drawControlIsActive() {
219
+ return this.activeDrawControl !== undefined;
220
+ }
221
+ get projection() {
222
+ return this.map.ol.getView().getProjection().getCode();
223
+ }
224
+ constructor(languageService, dialog, storageService, document) {
225
+ this.languageService = languageService;
226
+ this.dialog = dialog;
227
+ this.storageService = storageService;
228
+ this.document = document;
229
+ this.tableTemplate = {
230
+ selection: true,
231
+ selectMany: true,
232
+ selectionCheckbox: true,
233
+ sort: true,
234
+ columns: [
235
+ {
236
+ name: 'length',
237
+ title: this.languageService.translate.instant('igo.geo.measure.lengthHeader'),
238
+ valueAccessor: (localFeature) => {
239
+ const unit = this.activeLengthUnit;
240
+ const measure = metersToUnit(localFeature.properties.measure.length, unit);
241
+ return formatMeasure(measure, {
242
+ decimal: 1,
243
+ unit,
244
+ unitAbbr: false,
245
+ locale: 'fr'
246
+ });
247
+ }
248
+ },
249
+ {
250
+ name: 'area',
251
+ title: this.languageService.translate.instant('igo.geo.measure.areaHeader'),
252
+ valueAccessor: (localFeature) => {
253
+ const unit = this.activeAreaUnit;
254
+ const measure = squareMetersToUnit(localFeature.properties.measure.area, unit);
255
+ return measure
256
+ ? formatMeasure(measure, {
257
+ decimal: 1,
258
+ unit,
259
+ unitAbbr: false,
260
+ locale: 'fr'
261
+ })
262
+ : '';
263
+ }
264
+ }
265
+ ]
266
+ };
267
+ }
268
+ /**
269
+ * Add draw controls and activate one
270
+ * @internal
271
+ */
272
+ ngOnInit() {
273
+ this.getSavedUnits();
274
+ this.initStore();
275
+ this.createDrawLineControl();
276
+ this.createDrawPolygonControl();
277
+ this.createModifyControl();
278
+ this.toggleDrawControl();
279
+ this.updateTooltipsOfOlSource(this.store.source.ol);
280
+ this.checkDistanceAreaToggle();
281
+ this.setActiveMeasureType(MeasureType.Length);
282
+ }
283
+ /**
284
+ * Clear the overlay layer and any interaction added by this component.
285
+ * @internal
286
+ */
287
+ ngOnDestroy() {
288
+ if (this.store.count === 0) {
289
+ this.store.map.layerController.remove(this.store.layer);
290
+ }
291
+ this.setActiveMeasureType(undefined);
292
+ this.deactivateModifyControl();
293
+ this.freezeStore();
294
+ this.subscriptions$$.map((s) => s.unsubscribe());
295
+ }
296
+ /**
297
+ * Set the measure type
298
+ * @internal
299
+ */
300
+ onMeasureTypeChange(measureType) {
301
+ this.activeMeasureType = measureType;
302
+ }
303
+ /**
304
+ * Activate or deactivate the current draw control
305
+ * @internal
306
+ */
307
+ onToggleDrawControl(toggle) {
308
+ if (toggle === true) {
309
+ this.toggleDrawControl();
310
+ }
311
+ else {
312
+ this.deactivateDrawControl();
313
+ }
314
+ }
315
+ /**
316
+ * Activate or deactivate the current draw control
317
+ * @internal
318
+ */
319
+ onToggleMeasureUnitsAuto(toggle) {
320
+ this.measureUnitsAuto = toggle;
321
+ }
322
+ /**
323
+ * Activate or deactivate the current display of distances of the areas
324
+ * @internal
325
+ */
326
+ onToggleDisplayDistance(toggle) {
327
+ this.displayDistance = toggle;
328
+ this.onDisplayDistance();
329
+ this.storageService.set('distanceToggle', toggle, StorageScope.SESSION);
330
+ }
331
+ /**
332
+ * Activate or deactivate the current display of distances of the lines
333
+ * @internal
334
+ */
335
+ onToggleDisplayLines(toggle) {
336
+ this.displayLines = toggle;
337
+ this.onDisplayLines();
338
+ this.storageService.set('linesToggle', toggle, StorageScope.SESSION);
339
+ }
340
+ /**
341
+ * Activate or deactivate the current display of areas
342
+ * @internal
343
+ */
344
+ onToggleDisplayAreas(toggle) {
345
+ this.displayAreas = toggle;
346
+ this.onDisplayAreas();
347
+ this.storageService.set('areasToggle', toggle, StorageScope.SESSION);
348
+ }
349
+ /**
350
+ * Set display parametres in current values
351
+ * @internal
352
+ */
353
+ checkDistanceAreaToggle() {
354
+ if (this.storageService.get('distanceToggle') === false) {
355
+ this.displayDistance = false;
356
+ }
357
+ if (this.storageService.get('linesToggle') === false) {
358
+ this.displayLines = false;
359
+ }
360
+ if (this.storageService.get('areasToggle') === false) {
361
+ this.displayAreas = false;
362
+ }
363
+ }
364
+ /**
365
+ * Activate or deactivate the current display of distances of areas
366
+ * @internal
367
+ */
368
+ onDisplayDistance() {
369
+ const elements = this.document.getElementsByClassName('igo-map-tooltip-measure-polygone-segments');
370
+ if (this.displayDistance) {
371
+ Array.from(elements).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
372
+ }
373
+ else {
374
+ Array.from(elements).map((value) => value.classList.add('igo-map-tooltip-hidden'));
375
+ }
376
+ }
377
+ /**
378
+ * Activate or deactivate the current display of distances of lines
379
+ * @internal
380
+ */
381
+ onDisplayLines() {
382
+ const elements = this.document.getElementsByClassName('igo-map-tooltip-measure-line-segments');
383
+ if (this.displayLines) {
384
+ Array.from(elements).map((value) => {
385
+ value.classList.remove('igo-map-tooltip-hidden');
386
+ });
387
+ }
388
+ else {
389
+ Array.from(elements).map((value) => {
390
+ value.classList.add('igo-map-tooltip-hidden');
391
+ });
392
+ }
393
+ }
394
+ /**
395
+ * Activate or deactivate the current display of areas
396
+ * @internal
397
+ */
398
+ onDisplayAreas() {
399
+ const elements = this.document.getElementsByClassName('igo-map-tooltip-measure-area');
400
+ if (this.displayAreas) {
401
+ Array.from(elements).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
402
+ }
403
+ else {
404
+ Array.from(elements).map((value) => value.classList.add('igo-map-tooltip-hidden'));
405
+ }
406
+ }
407
+ /**
408
+ * Set the measure type
409
+ * @internal
410
+ */
411
+ onLengthUnitChange(unit) {
412
+ this.activeLengthUnit = unit;
413
+ this.saveCurrentUnits();
414
+ this.refreshTableAndTooltip();
415
+ }
416
+ /**
417
+ * Set the measure type
418
+ * @internal
419
+ */
420
+ onAreaUnitChange(unit) {
421
+ this.activeAreaUnit = unit;
422
+ this.saveCurrentUnits();
423
+ this.refreshTableAndTooltip();
424
+ }
425
+ refreshTableAndTooltip() {
426
+ this.store.stateView.clear();
427
+ this.updateTooltipsOfOlSource(this.store.source.ol);
428
+ if (this.activeOlGeometry !== undefined) {
429
+ this.updateTooltipsOfOlGeometry(this.activeOlGeometry);
430
+ }
431
+ }
432
+ onCalculateClick() {
433
+ const features = this.selectedFeatures$.value;
434
+ const area = features.reduce((sum, localFeature) => {
435
+ return sum + localFeature.properties.measure.area || 0;
436
+ }, 0);
437
+ const length = features.reduce((sum, localFeature) => {
438
+ if (localFeature.geometry.type === 'Polygon') {
439
+ return sum;
440
+ }
441
+ return sum + localFeature.properties.measure.length || 0;
442
+ }, 0);
443
+ const perimeter = features.reduce((sum, localFeature) => {
444
+ if (localFeature.geometry.type === 'LineString') {
445
+ return sum;
446
+ }
447
+ return sum + localFeature.properties.measure.length || 0;
448
+ }, 0);
449
+ this.openDialog({
450
+ area,
451
+ length,
452
+ perimeter
453
+ });
454
+ }
455
+ onDeleteClick() {
456
+ this.store.deleteMany(this.selectedFeatures$.value);
457
+ this.selectedFeatures$.value.forEach((selectedFeature) => {
458
+ this.olDrawSource.getFeatures().forEach((drawingLayerFeature) => {
459
+ const geometry = drawingLayerFeature.getGeometry();
460
+ if (selectedFeature.properties.id === geometry.ol_uid) {
461
+ this.olDrawSource.removeFeature(drawingLayerFeature);
462
+ }
463
+ });
464
+ });
465
+ }
466
+ onModifyClick() {
467
+ if (this.selectedFeatures$.value.length !== 1) {
468
+ return;
469
+ }
470
+ if (this.modifyControl.active === true) {
471
+ this.deactivateModifyControl();
472
+ this.toggleDrawControl();
473
+ }
474
+ else {
475
+ const localFeature = this.selectedFeatures$.value[0];
476
+ const olFeatures = this.store.layer.ol.getSource().getFeatures();
477
+ const olFeature = olFeatures.find((_olFeature) => {
478
+ return _olFeature.get('id') === localFeature.properties.id;
479
+ });
480
+ if (olFeature !== undefined) {
481
+ this.deactivateDrawControl();
482
+ this.activateModifyControl();
483
+ const olGeometry = olFeature.getGeometry();
484
+ this.clearTooltipsOfOlGeometry(olGeometry);
485
+ this.modifyControl.setOlGeometry(olGeometry);
486
+ }
487
+ }
488
+ }
489
+ openDialog(data) {
490
+ this.dialog.open(MeasurerDialogComponent, { data });
491
+ }
492
+ /**
493
+ * Initialize the measure store and set up some listeners
494
+ * @internal
495
+ */
496
+ initStore() {
497
+ const store = this.store;
498
+ let layer = new VectorLayer({
499
+ title: this.languageService.translate.instant('igo.geo.measure.layerTitle'),
500
+ isIgoInternalLayer: true,
501
+ id: `igo-measures-${uuid()}`,
502
+ zIndex: 200,
503
+ source: new FeatureDataSource(),
504
+ style: createMeasureLayerStyle(),
505
+ showInLayerList: true,
506
+ exportable: true,
507
+ visible: true,
508
+ browsable: false,
509
+ workspace: { enabled: false }
510
+ });
511
+ layer = tryBindStoreLayer(store, layer);
512
+ layer.visible$.subscribe((visible) => {
513
+ const elements = this.document.getElementsByClassName('igo-map-tooltip-measure');
514
+ if (visible) {
515
+ Array.from(elements).map((value) => value.classList.remove('igo-map-tooltip-measure-by-display'));
516
+ }
517
+ else {
518
+ Array.from(elements).map((value) => value.classList.add('igo-map-tooltip-measure-by-display'));
519
+ }
520
+ });
521
+ tryAddLoadingStrategy(store);
522
+ tryAddSelectionStrategy(store, new FeatureStoreSelectionStrategy({
523
+ map: this.map,
524
+ many: true
525
+ }));
526
+ this.onFeatureAddedKey = store.source.ol.on('addfeature', (event) => {
527
+ const localFeature = event.feature;
528
+ const olGeometry = localFeature.getGeometry();
529
+ this.updateMeasureOfOlGeometry(olGeometry, localFeature.get('measure'));
530
+ this.onDisplayDistance();
531
+ this.onDisplayLines();
532
+ this.onDisplayAreas();
533
+ });
534
+ this.onFeatureRemovedKey = store.source.ol.on('removefeature', (event) => {
535
+ const olGeometry = event.feature.getGeometry();
536
+ this.clearTooltipsOfOlGeometry(olGeometry);
537
+ });
538
+ this.selectedFeatures$$ = store.stateView
539
+ .manyBy$((record) => {
540
+ return record.state.selected === true;
541
+ })
542
+ .pipe(skip(1) // Skip initial emission
543
+ )
544
+ .subscribe((records) => {
545
+ if (this.modifyControl.active === true) {
546
+ this.deactivateModifyControl();
547
+ }
548
+ this.selectedFeatures$.next(records.map((record) => record.entity));
549
+ });
550
+ this.subscriptions$$.push(this.store.entities$.subscribe((objectsExists) => {
551
+ if (objectsExists.find((objectExist) => objectExist.geometry.type === 'Polygon')) {
552
+ this.hasArea$.next(true);
553
+ }
554
+ else {
555
+ this.hasArea$.next(false);
556
+ }
557
+ if (objectsExists.find((objectExist) => objectExist.geometry.type === 'LineString')) {
558
+ this.hasLine$.next(true);
559
+ }
560
+ else {
561
+ this.hasLine$.next(false);
562
+ }
563
+ }));
564
+ }
565
+ /**
566
+ * Freeze any store, meaning the layer is removed, strategies are deactivated
567
+ * and some listener removed
568
+ * @internal
569
+ */
570
+ freezeStore() {
571
+ const store = this.store;
572
+ this.selectedFeatures$$.unsubscribe();
573
+ unByKey(this.onFeatureAddedKey);
574
+ unByKey(this.onFeatureRemovedKey);
575
+ store.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
576
+ store.deactivateStrategyOfType(FeatureStoreSelectionStrategy);
577
+ }
578
+ /**
579
+ * Create a draw line control
580
+ */
581
+ createDrawLineControl() {
582
+ this.drawLineControl = new DrawControl({
583
+ geometryType: 'LineString',
584
+ drawingLayerSource: this.olDrawSource,
585
+ interactionStyle: createMeasureInteractionStyle(),
586
+ drawingLayerStyle: new OlStyle({})
587
+ });
588
+ }
589
+ /**
590
+ * Create a draw polygon control
591
+ */
592
+ createDrawPolygonControl() {
593
+ this.drawPolygonControl = new DrawControl({
594
+ geometryType: 'Polygon',
595
+ drawingLayerSource: this.olDrawSource,
596
+ interactionStyle: createMeasureInteractionStyle(),
597
+ drawingLayerStyle: new OlStyle({})
598
+ });
599
+ }
600
+ /**
601
+ * Create a draw polygon control
602
+ */
603
+ createModifyControl() {
604
+ this.modifyControl = new ModifyControl({
605
+ source: this.olDrawSource,
606
+ drawStyle: createMeasureInteractionStyle(),
607
+ layerStyle: new OlStyle({})
608
+ });
609
+ }
610
+ /**
611
+ * Activate the right control
612
+ */
613
+ toggleDrawControl() {
614
+ this.deactivateDrawControl();
615
+ // this.deactivateModifyControl();
616
+ if (this.activeMeasureType === MeasureType.Length) {
617
+ this.activateDrawControl(this.drawLineControl);
618
+ }
619
+ else if (this.activeMeasureType === MeasureType.Area) {
620
+ this.activateDrawControl(this.drawPolygonControl);
621
+ }
622
+ }
623
+ /**
624
+ * Activate a given control
625
+ * @param drawControl Draw control
626
+ */
627
+ activateDrawControl(drawControl) {
628
+ this.drawControlIsDisabled = false;
629
+ this.activeDrawControl = drawControl;
630
+ this.drawStart$$ = drawControl.start$.subscribe((olGeometry) => this.onDrawStart(olGeometry));
631
+ this.drawEnd$$ = drawControl.end$.subscribe((olGeometry) => this.onDrawEnd(olGeometry));
632
+ this.drawChanges$$ = drawControl.changes$.subscribe((olGeometry) => this.onDrawChanges(olGeometry));
633
+ this.drawChanges$$ = drawControl.abort$.subscribe((olGeometry) => {
634
+ this.clearTooltipsOfOlGeometry(olGeometry);
635
+ this.clearMeasures();
636
+ });
637
+ drawControl.setOlMap(this.map.ol, false);
638
+ }
639
+ /**
640
+ * Deactivate the active draw control
641
+ */
642
+ deactivateDrawControl() {
643
+ if (this.activeDrawControl === undefined) {
644
+ return;
645
+ }
646
+ this.olDrawSource.clear();
647
+ if (this.drawStart$$ !== undefined) {
648
+ this.drawStart$$.unsubscribe();
649
+ }
650
+ if (this.drawEnd$$ !== undefined) {
651
+ this.drawEnd$$.unsubscribe();
652
+ }
653
+ if (this.drawChanges$$ !== undefined) {
654
+ this.drawChanges$$.unsubscribe();
655
+ }
656
+ this.clearTooltipsOfOlSource(this.olDrawSource);
657
+ if (this.activeOlGeometry !== undefined) {
658
+ this.clearTooltipsOfOlGeometry(this.activeOlGeometry);
659
+ }
660
+ this.activeDrawControl.setOlMap(undefined);
661
+ this.activeDrawControl = undefined;
662
+ this.activeOlGeometry = undefined;
663
+ }
664
+ setActiveMeasureType(measureType) {
665
+ this._activeMeasureType = measureType;
666
+ this.clearMeasures();
667
+ this.toggleDrawControl();
668
+ }
669
+ /**
670
+ * Clear the draw source and track the geometry being drawn
671
+ * @param olGeometry Ol linestring or polygon
672
+ */
673
+ onDrawStart(olGeometry) {
674
+ this.activeOlGeometry = olGeometry;
675
+ }
676
+ /**
677
+ * Clear the draw source and track the geometry being draw
678
+ * @param olGeometry Ol linestring or polygon
679
+ */
680
+ onDrawEnd(olGeometry) {
681
+ this.activeOlGeometry = undefined;
682
+ this.finalizeMeasureOfOlGeometry(olGeometry);
683
+ this.addFeatureToStore(olGeometry);
684
+ this.clearTooltipsOfOlGeometry(olGeometry);
685
+ this.olDrawSource.clear(true);
686
+ }
687
+ /**
688
+ * Update measures observables and map tooltips
689
+ * @param olGeometry Ol linestring or polygon
690
+ */
691
+ onDrawChanges(olGeometry) {
692
+ const measure = measureOlGeometry(olGeometry, this.projection);
693
+ this.updateMeasureOfOlGeometry(olGeometry, Object.assign({}, measure, {
694
+ area: undefined // We don't want to display an area tooltip while drawing.
695
+ }));
696
+ this.measure$.next(measure);
697
+ }
698
+ /**
699
+ * Activate a given control
700
+ * @param modifyControl Modify control
701
+ */
702
+ activateModifyControl() {
703
+ const selection = this.store.getStrategyOfType(FeatureStoreSelectionStrategy);
704
+ selection.deactivate();
705
+ selection.clear();
706
+ this.modifyStart$$ = this.modifyControl.start$.subscribe((olGeometry) => this.onModifyStart(olGeometry));
707
+ this.modifyEnd$$ = this.modifyControl.end$.subscribe((olGeometry) => this.onModifyEnd(olGeometry));
708
+ this.modifyChanges$$ = this.modifyControl.changes$.subscribe((olGeometry) => this.onModifyChanges(olGeometry));
709
+ this.modifyControl.setOlMap(this.map.ol);
710
+ }
711
+ /**
712
+ * Deactivate the active modify control
713
+ */
714
+ deactivateModifyControl() {
715
+ if (this.modifyStart$$ !== undefined) {
716
+ this.modifyStart$$.unsubscribe();
717
+ }
718
+ if (this.modifyEnd$$ !== undefined) {
719
+ this.modifyEnd$$.unsubscribe();
720
+ }
721
+ if (this.modifyChanges$$ !== undefined) {
722
+ this.modifyChanges$$.unsubscribe();
723
+ }
724
+ if (this.activeOlGeometry !== undefined) {
725
+ if (this.selectedFeatures$.value.length === 1) {
726
+ const localFeature = this.selectedFeatures$.value[0];
727
+ this.addFeatureToStore(this.activeOlGeometry, localFeature);
728
+ }
729
+ this.finalizeMeasureOfOlGeometry(this.activeOlGeometry);
730
+ }
731
+ this.olDrawSource.clear();
732
+ this.store.activateStrategyOfType(FeatureStoreSelectionStrategy);
733
+ this.activeOlGeometry = undefined;
734
+ this.modifyControl.setOlMap(undefined);
735
+ }
736
+ /**
737
+ * Clear the draw source and track the geometry being drawn
738
+ * @param olGeometry Ol linestring or polygon
739
+ */
740
+ onModifyStart(olGeometry) {
741
+ this.onDrawStart(olGeometry);
742
+ }
743
+ /**
744
+ * Update measures observables and map tooltips
745
+ * @param olGeometry Ol linestring or polygon
746
+ */
747
+ onModifyChanges(olGeometry) {
748
+ this.onDrawChanges(olGeometry);
749
+ }
750
+ /**
751
+ * Clear the draw source and track the geometry being draw
752
+ * @param olGeometry Ol linestring or polygon
753
+ */
754
+ onModifyEnd(olGeometry) {
755
+ this.finalizeMeasureOfOlGeometry(olGeometry);
756
+ }
757
+ finalizeMeasureOfOlGeometry(olGeometry) {
758
+ const measure = measureOlGeometry(olGeometry, this.projection);
759
+ this.updateMeasureOfOlGeometry(olGeometry, measure);
760
+ }
761
+ /**
762
+ * Update measures observables
763
+ * @param olGeometry Ol linestring or polygon
764
+ * @param measure Measure
765
+ */
766
+ updateMeasureOfOlGeometry(olGeometry, measure) {
767
+ olGeometry.setProperties({ _measure: measure }, true);
768
+ this.updateTooltipsOfOlGeometry(olGeometry);
769
+ }
770
+ /**
771
+ * Clear the measures observables
772
+ */
773
+ clearMeasures() {
774
+ this.measure$.next({});
775
+ }
776
+ /**
777
+ * Add a feature with measures to the store. The loading stragegy of the store
778
+ * will trigger and add the feature to the map.
779
+ * @internal
780
+ */
781
+ addFeatureToStore(olGeometry, localFeature) {
782
+ const featureId = localFeature
783
+ ? localFeature.properties.id
784
+ : olGeometry.ol_uid;
785
+ const projection = this.map.ol.getView().getProjection();
786
+ const geometry = new OlGeoJSON().writeGeometryObject(olGeometry, {
787
+ featureProjection: projection,
788
+ dataProjection: projection
789
+ });
790
+ this.store.update({
791
+ type: FEATURE,
792
+ geometry,
793
+ projection: projection.getCode(),
794
+ properties: {
795
+ id: featureId,
796
+ measure: olGeometry.get('_measure')
797
+ },
798
+ meta: {
799
+ id: featureId
800
+ }
801
+ });
802
+ }
803
+ /**
804
+ * Update all the tooltips of an OL geometry
805
+ * @param olGeometry OL Geometry
806
+ * @param lengths Lengths of the OL geometry's segments
807
+ * @param measureUnit Display tooltip measure in those units
808
+ */
809
+ updateTooltipsOfOlGeometry(olGeometry) {
810
+ const measure = olGeometry.get('_measure');
811
+ const lengths = measure.lengths;
812
+ const area = measure.area;
813
+ const olMidpointsTooltips = updateOlTooltipsAtMidpoints(olGeometry);
814
+ if (lengths.length === olMidpointsTooltips.length) {
815
+ for (let i = 0; i < olMidpointsTooltips.length; i++) {
816
+ const length = lengths[i];
817
+ if (length !== undefined) {
818
+ this.updateOlTooltip(olMidpointsTooltips[i], metersToUnit(length, this.activeLengthUnit), this.activeLengthUnit, MeasureType.Length);
819
+ }
820
+ }
821
+ }
822
+ if (area !== undefined) {
823
+ this.updateOlTooltip(updateOlTooltipAtCenter(olGeometry), squareMetersToUnit(area, this.activeAreaUnit), this.activeAreaUnit, MeasureType.Area);
824
+ }
825
+ }
826
+ /**
827
+ * Clear the tooltips of an OL geometrys
828
+ * @param olGeometry OL geometry with tooltips
829
+ */
830
+ clearTooltipsOfOlGeometry(olGeometry) {
831
+ getTooltipsOfOlGeometry(olGeometry).forEach((olTooltip) => {
832
+ if (olTooltip !== undefined && olTooltip.getMap() !== undefined) {
833
+ this.map.ol.removeOverlay(olTooltip);
834
+ }
835
+ });
836
+ }
837
+ /**
838
+ * Show the map tooltips of all the geometries of a source
839
+ */
840
+ updateTooltipsOfOlSource(olSource) {
841
+ olSource.forEachFeature((olFeature) => {
842
+ this.updateTooltipsOfOlGeometry(olFeature.getGeometry());
843
+ });
844
+ }
845
+ /**
846
+ * Clear the map tooltips
847
+ * @param olDrawSource OL vector source
848
+ */
849
+ clearTooltipsOfOlSource(olSource) {
850
+ olSource.forEachFeature((olFeature) => {
851
+ const olGeometry = olFeature.getGeometry();
852
+ if (olGeometry !== undefined) {
853
+ this.clearTooltipsOfOlGeometry(olFeature.getGeometry());
854
+ }
855
+ });
856
+ }
857
+ /**
858
+ * Update an OL tooltip properties and inner HTML and add it to the map if possible
859
+ * @param olTooltip OL tooltip
860
+ * @param measure The measure valeu ti display
861
+ * @param measureUnit Display tooltip measure in those units
862
+ */
863
+ updateOlTooltip(olTooltip, measure, unit, type) {
864
+ olTooltip.setProperties({ _measure: measure, _unit: unit, _type: type }, true);
865
+ olTooltip.getElement().innerHTML = this.computeTooltipInnerHTML(olTooltip);
866
+ if (this.shouldShowTooltip(olTooltip)) {
867
+ this.map.ol.addOverlay(olTooltip);
868
+ }
869
+ }
870
+ /**
871
+ * Compute a tooltip's content
872
+ * @param olTooltip OL overlay
873
+ * @returns Inner HTML
874
+ */
875
+ computeTooltipInnerHTML(olTooltip) {
876
+ const properties = olTooltip.getProperties();
877
+ return formatMeasure(properties._measure, {
878
+ decimal: 1,
879
+ unit: properties._unit,
880
+ unitAbbr: true,
881
+ locale: 'fr'
882
+ }, this.languageService);
883
+ }
884
+ /**
885
+ * Whether a tooltip should be showned based on the length
886
+ * of the segment it is bound to.
887
+ * @param olTooltip OL overlay
888
+ * @returns True if the tooltip should be shown
889
+ */
890
+ shouldShowTooltip(olTooltip) {
891
+ if (this.showTooltips === false) {
892
+ return false;
893
+ }
894
+ const properties = olTooltip.getProperties();
895
+ const measure = properties._measure;
896
+ if (measure === undefined) {
897
+ return false;
898
+ }
899
+ if (properties._unit === MeasureType.Length) {
900
+ const minSegmentLength = metersToUnit(this.minSegmentLength, properties._unit) || 0;
901
+ return measure > Math.max(minSegmentLength, 0);
902
+ }
903
+ return true;
904
+ }
905
+ saveCurrentUnits() {
906
+ this.storageService.set('distanceUnit', this.activeLengthUnit, StorageScope.SESSION);
907
+ this.storageService.set('areaUnit', this.activeAreaUnit, StorageScope.SESSION);
908
+ }
909
+ getSavedUnits() {
910
+ const distanceUnit = this.storageService.get('distanceUnit');
911
+ const areaUnit = this.storageService.get('areaUnit');
912
+ this.activeLengthUnit = distanceUnit ? distanceUnit : this.activeLengthUnit;
913
+ this.activeAreaUnit = areaUnit ? areaUnit : this.activeAreaUnit;
914
+ }
915
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasurerComponent, deps: [{ token: i1.LanguageService }, { token: i2.MatDialog }, { token: i3.StorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
916
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MeasurerComponent, isStandalone: true, selector: "igo-measurer", inputs: { map: "map", store: "store", activeMeasureType: "activeMeasureType", minSegmentLength: "minSegmentLength" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }], ngImport: i0, template: "<div>\n <div class=\"measure-type-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeMeasureType\"\n (change)=\"onMeasureTypeChange($event.value)\"\n >\n <mat-button-toggle [value]=\"measureType.Length\">\n {{ 'igo.geo.measure.' + measureType.Length | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"measureType.Area\">\n {{ 'igo.geo.measure.' + measureType.Area | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"measure-options mat-typography\">\n <mat-slide-toggle\n [disabled]=\"drawControlIsDisabled\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDrawControl($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleActive' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"hasLine$ | async\"></mat-divider>\n\n <mat-slide-toggle\n *ngIf=\"hasLine$ | async\"\n [checked]=\"displayLines\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayLines($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayLines' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle\n *ngIf=\"hasArea$ | async\"\n [checked]=\"displayDistance\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayDistance($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayDistance' | translate }}\n </mat-slide-toggle>\n\n <mat-slide-toggle\n *ngIf=\"hasArea$ | async\"\n [checked]=\"displayAreas\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayAreas($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayAreas' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"hasArea$ | async\"></mat-divider>\n\n <mat-slide-toggle\n [checked]=\"measureUnitsAuto\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleMeasureUnitsAuto($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleAutoUnits' | translate }}\n </mat-slide-toggle>\n </div>\n\n <ng-container *ngIf=\"measure$ | async as measure\">\n <igo-measurer-item\n *ngIf=\"\n activeMeasureType === measureType.Length ||\n activeMeasureType === measureType.Area\n \"\n [measureType]=\"measureType.Length\"\n [measureUnit]=\"activeLengthUnit\"\n [measure]=\"measure.length\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"\n (activeMeasureType === measureType.Area\n ? 'igo.geo.measure.perimeter'\n : 'igo.geo.measure.length'\n ) | translate\n \"\n (measureUnitChange)=\"onLengthUnitChange($any($event))\"\n >\n </igo-measurer-item>\n\n <igo-measurer-item\n *ngIf=\"activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Area\"\n [measureUnit]=\"activeAreaUnit\"\n [measure]=\"measure.area\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"'igo.geo.measure.area' | translate\"\n (measureUnitChange)=\"onAreaUnitChange($any($event))\"\n >\n </igo-measurer-item>\n </ng-container>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <div class=\"measure-store-buttons\">\n <button\n *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.calculate.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"accent\"\n (click)=\"onCalculateClick()\"\n >\n <mat-icon>calculate</mat-icon>\n </button>\n\n <button\n *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.delete.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"warn\"\n (click)=\"onDeleteClick()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <igo-entity-table\n #table\n class=\"table-compact\"\n [store]=\"store\"\n [template]=\"tableTemplate\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .measure-type-toggle{padding:10px;text-align:center}:host .measure-type-toggle mat-button-toggle-group{width:100%}:host .measure-type-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host .measure-options mat-slide-toggle{width:100%;padding:10px}:host .measure-options mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .measure-options mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .measure-store-buttons{margin-left:-2px}:host .measure-store-buttons button:first-of-type{margin-left:14px}:host .table-compact ::ng-deep .mat-mdc-header-cell.mat-column-selectionCheckbox{width:52px}:host .igo-map-tooltip{position:relative;border-radius:4px;padding:4px 8px;white-space:nowrap}::ng-deep .igo-map-tooltip-hidden,.igo-map-tooltip-measure-by-display{display:none}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: MeasurerItemComponent, selector: "igo-measurer-item", inputs: ["measureType", "measureUnit", "measure", "auto", "placeholder"], outputs: ["measureUnitChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: EntityTableComponent, selector: "igo-entity-table", inputs: ["store", "paginator", "template", "scrollBehavior", "sortNullsFirst", "withPaginator", "paginatorOptions"], outputs: ["entityClick", "entitySelectChange", "entitySortChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
917
+ }
918
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasurerComponent, decorators: [{
919
+ type: Component,
920
+ args: [{ selector: 'igo-measurer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
921
+ MatButtonToggleModule,
922
+ MatSlideToggleModule,
923
+ NgIf,
924
+ MatDividerModule,
925
+ MeasurerItemComponent,
926
+ MatButtonModule,
927
+ MatTooltipModule,
928
+ MatIconModule,
929
+ EntityTableComponent,
930
+ AsyncPipe,
931
+ IgoLanguageModule
932
+ ], template: "<div>\n <div class=\"measure-type-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeMeasureType\"\n (change)=\"onMeasureTypeChange($event.value)\"\n >\n <mat-button-toggle [value]=\"measureType.Length\">\n {{ 'igo.geo.measure.' + measureType.Length | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"measureType.Area\">\n {{ 'igo.geo.measure.' + measureType.Area | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"measure-options mat-typography\">\n <mat-slide-toggle\n [disabled]=\"drawControlIsDisabled\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDrawControl($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleActive' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"hasLine$ | async\"></mat-divider>\n\n <mat-slide-toggle\n *ngIf=\"hasLine$ | async\"\n [checked]=\"displayLines\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayLines($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayLines' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle\n *ngIf=\"hasArea$ | async\"\n [checked]=\"displayDistance\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayDistance($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayDistance' | translate }}\n </mat-slide-toggle>\n\n <mat-slide-toggle\n *ngIf=\"hasArea$ | async\"\n [checked]=\"displayAreas\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayAreas($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleDisplayAreas' | translate }}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"hasArea$ | async\"></mat-divider>\n\n <mat-slide-toggle\n [checked]=\"measureUnitsAuto\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleMeasureUnitsAuto($event.checked)\"\n >\n {{ 'igo.geo.measure.toggleAutoUnits' | translate }}\n </mat-slide-toggle>\n </div>\n\n <ng-container *ngIf=\"measure$ | async as measure\">\n <igo-measurer-item\n *ngIf=\"\n activeMeasureType === measureType.Length ||\n activeMeasureType === measureType.Area\n \"\n [measureType]=\"measureType.Length\"\n [measureUnit]=\"activeLengthUnit\"\n [measure]=\"measure.length\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"\n (activeMeasureType === measureType.Area\n ? 'igo.geo.measure.perimeter'\n : 'igo.geo.measure.length'\n ) | translate\n \"\n (measureUnitChange)=\"onLengthUnitChange($any($event))\"\n >\n </igo-measurer-item>\n\n <igo-measurer-item\n *ngIf=\"activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Area\"\n [measureUnit]=\"activeAreaUnit\"\n [measure]=\"measure.area\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"'igo.geo.measure.area' | translate\"\n (measureUnitChange)=\"onAreaUnitChange($any($event))\"\n >\n </igo-measurer-item>\n </ng-container>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <div class=\"measure-store-buttons\">\n <button\n *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.calculate.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"accent\"\n (click)=\"onCalculateClick()\"\n >\n <mat-icon>calculate</mat-icon>\n </button>\n\n <button\n *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.delete.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"warn\"\n (click)=\"onDeleteClick()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <igo-entity-table\n #table\n class=\"table-compact\"\n [store]=\"store\"\n [template]=\"tableTemplate\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .measure-type-toggle{padding:10px;text-align:center}:host .measure-type-toggle mat-button-toggle-group{width:100%}:host .measure-type-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host .measure-options mat-slide-toggle{width:100%;padding:10px}:host .measure-options mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .measure-options mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .measure-store-buttons{margin-left:-2px}:host .measure-store-buttons button:first-of-type{margin-left:14px}:host .table-compact ::ng-deep .mat-mdc-header-cell.mat-column-selectionCheckbox{width:52px}:host .igo-map-tooltip{position:relative;border-radius:4px;padding:4px 8px;white-space:nowrap}::ng-deep .igo-map-tooltip-hidden,.igo-map-tooltip-measure-by-display{display:none}\n"] }]
933
+ }], ctorParameters: () => [{ type: i1.LanguageService }, { type: i2.MatDialog }, { type: i3.StorageService }, { type: Document, decorators: [{
934
+ type: Inject,
935
+ args: [DOCUMENT]
936
+ }] }], propDecorators: { map: [{
937
+ type: Input
938
+ }], store: [{
939
+ type: Input
940
+ }], activeMeasureType: [{
941
+ type: Input
942
+ }], minSegmentLength: [{
943
+ type: Input
944
+ }], table: [{
945
+ type: ViewChild,
946
+ args: ['table', { static: true }]
947
+ }] } });
948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbWVhc3VyZS9tZWFzdXJlci9tZWFzdXJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9tZWFzdXJlL21lYXN1cmVyL21lYXN1cmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFFTCxvQkFBb0IsRUFFckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztB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QUdQLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixJQUFJO3dCQUNKLGdCQUFnQjt3QkFDaEIscUJBQXFCO3dCQUNyQixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjs7MEJBOE5FLE1BQU07MkJBQUMsUUFBUTt5Q0E1Q1QsR0FBRztzQkFBWCxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFPRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBYUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVnQyxLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIERPQ1VNRU5ULCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBFbnRpdHlSZWNvcmQsXG4gIEVudGl0eVRhYmxlQ29tcG9uZW50LFxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXG59IGZyb20gJ0BpZ28yL2NvbW1vbi9lbnRpdHknO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNjb3BlLCBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IHsgdW5CeUtleSB9IGZyb20gJ29sL09ic2VydmFibGUnO1xuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcbmltcG9ydCBPbEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xuaW1wb3J0IE9sTGluZVN0cmluZyBmcm9tICdvbC9nZW9tL0xpbmVTdHJpbmcnO1xuaW1wb3J0IE9sUG9seWdvbiBmcm9tICdvbC9nZW9tL1BvbHlnb24nO1xuaW1wb3J0IE9sVmVjdG9yU291cmNlIGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xuaW1wb3J0IHsgVmVjdG9yU291cmNlRXZlbnQgYXMgT2xWZWN0b3JTb3VyY2VFdmVudCB9IGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xuaW1wb3J0IE9sU3R5bGUgZnJvbSAnb2wvc3R5bGUvU3R5bGUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcyc7XG5pbXBvcnQge1xuICBGRUFUVVJFLFxuICBGZWF0dXJlU3RvcmUsXG4gIEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSxcbiAgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3ksXG4gIHRyeUFkZExvYWRpbmdTdHJhdGVneSxcbiAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3ksXG4gIHRyeUJpbmRTdG9yZUxheWVyXG59IGZyb20gJy4uLy4uL2ZlYXR1cmUnO1xuaW1wb3J0IHsgRHJhd0NvbnRyb2wsIE1vZGlmeUNvbnRyb2wgfSBmcm9tICcuLi8uLi9nZW9tZXRyeS9zaGFyZWQnO1xuaW1wb3J0IHsgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQnO1xuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHtcbiAgTWVhc3VyZUFyZWFVbml0LFxuICBNZWFzdXJlTGVuZ3RoVW5pdCxcbiAgTWVhc3VyZVR5cGVcbn0gZnJvbSAnLi4vc2hhcmVkL21lYXN1cmUuZW51bSc7XG5pbXBvcnQge1xuICBGZWF0dXJlV2l0aE1lYXN1cmUsXG4gIE1lYXN1cmUsXG4gIE1lYXN1cmVyRGlhbG9nRGF0YVxufSBmcm9tICcuLi9zaGFyZWQvbWVhc3VyZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGNyZWF0ZU1lYXN1cmVJbnRlcmFjdGlvblN0eWxlLFxuICBjcmVhdGVNZWFzdXJlTGF5ZXJTdHlsZSxcbiAgZm9ybWF0TWVhc3VyZSxcbiAgZ2V0VG9vbHRpcHNPZk9sR2VvbWV0cnksXG4gIG1lYXN1cmVPbEdlb21ldHJ5LFxuICBtZXRlcnNUb1VuaXQsXG4gIHNxdWFyZU1ldGVyc1RvVW5pdCxcbiAgdXBkYXRlT2xUb29sdGlwQXRDZW50ZXIsXG4gIHVwZGF0ZU9sVG9vbHRpcHNBdE1pZHBvaW50c1xufSBmcm9tICcuLi9zaGFyZWQvbWVhc3VyZS51dGlscyc7XG5pbXBvcnQgeyBNZWFzdXJlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWVhc3VyZXItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZWFzdXJlckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL21lYXN1cmVyLWl0ZW0uY29tcG9uZW50JztcblxuLyoqXG4gKiBUb29sIHRvIG1lYXN1cmUgbGVuZ3RocyBhbmQgYXJlYXNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLW1lYXN1cmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lYXN1cmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVhc3VyZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsXG4gICAgTWF0U2xpZGVUb2dnbGVNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXREaXZpZGVyTW9kdWxlLFxuICAgIE1lYXN1cmVySXRlbUNvbXBvbmVudCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIEVudGl0eVRhYmxlQ29tcG9uZW50LFxuICAgIEFzeW5jUGlwZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1lYXN1cmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGFibGUgdGVtcGxhdGVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgdGFibGVUZW1wbGF0ZTogRW50aXR5VGFibGVUZW1wbGF0ZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMkJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBNZWFzdXJlVHlwZSBlbnVtXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIG1lYXN1cmVUeXBlID0gTWVhc3VyZVR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgQXJlYU1lYXN1cmVVbml0IGVudW1cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZUFyZWFVbml0ID0gTWVhc3VyZUFyZWFVbml0O1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIExlbmd0aE1lYXN1cmVVbml0IGVudW1cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZUxlbmd0aFVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdDtcblxuICAvKipcbiAgICogV2hldGhlciBtZWFzdXJlIHVuaXRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZVVuaXRzQXV0byA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGRpc3BsYXkgb2YgZGlzdGFuY2VzIG9mIGFyZWFzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGRpc3BsYXlEaXN0YW5jZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGlzcGxheSBvZiBkaXN0YW5jZXMgb2YgbGluZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheUxpbmVzID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciBkaXNwbGF5IG9mIGFyZWFzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGRpc3BsYXlBcmVhcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgbGluZSBib29sZWFuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGhhc0xpbmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgYXJlYSBib29sZWFuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGhhc0FyZWEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgYXJlYVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVhc3VyZT4oe30pO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHNlbGVjdGVkIGZlYXR1cmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkRmVhdHVyZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlV2l0aE1lYXN1cmVbXT4oW10pO1xuXG4gIC8qKlxuICAgKiBPTCBkcmF3IHNvdXJjZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzaG93VG9vbHRpcHMgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGRyYXcgY29udHJvbCB0b2dnbGUgaXMgZGlzYWJsZWQgb3Igbm90XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGRyYXdDb250cm9sSXNEaXNhYmxlZCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERyYXcgbGluZSBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGRyYXdMaW5lQ29udHJvbDogRHJhd0NvbnRyb2w7XG5cbiAgLyoqXG4gICAqIERyYXcgcG9seWdvbiBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGRyYXdQb2x5Z29uQ29udHJvbDogRHJhd0NvbnRyb2w7XG5cbiAgLyoqXG4gICAqIE1vZGlmeSBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIG1vZGlmeUNvbnRyb2w6IE1vZGlmeUNvbnRyb2w7XG5cbiAgLyoqXG4gICAqIEFjdGl2ZSBPTCBnZW9tZXRyeVxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVPbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb247XG5cbiAgLyoqXG4gICAqIEFjdGl2ZSBtbGVuZ3RoIHVuaXRcbiAgICovXG4gIHB1YmxpYyBhY3RpdmVMZW5ndGhVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycztcblxuICAvKipcbiAgICogQWN0aXZlIGFyZWEgdW5pdFxuICAgKi9cbiAgcHVibGljIGFjdGl2ZUFyZWFVbml0OiBNZWFzdXJlQXJlYVVuaXQgPSBNZWFzdXJlQXJlYVVuaXQuU3F1YXJlTWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBGZWF0dXJlIGFkZGVkIGxpc3RlbmVyIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBvbkZlYXR1cmVBZGRlZEtleTtcblxuICAvKipcbiAgICogRmVhdHVyZSByZW1vdmVkIGxpc3RlbmVyIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBvbkZlYXR1cmVSZW1vdmVkS2V5O1xuXG4gIC8qKlxuICAgKiBBY3RpdmUgZHJhdyBjb250cm9sXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVEcmF3Q29udHJvbDogRHJhd0NvbnRyb2w7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBkcmF3IHN0YXJ0XG4gICAqL1xuICBwcml2YXRlIGRyYXdTdGFydCQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBkcmF3IGVuZFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3RW5kJCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIGNvbnRyb2xzIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgZHJhd0NoYW5nZXMkJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gbW9kaWZ5IHN0YXJ0XG4gICAqL1xuICBwcml2YXRlIG1vZGlmeVN0YXJ0JCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIG1vZGlmeSBlbmRcbiAgICovXG4gIHByaXZhdGUgbW9kaWZ5RW5kJCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIGNvbnRyb2xzIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgbW9kaWZ5Q2hhbmdlcyQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBtZWFzdXJlcyBzZWxlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0ZWRGZWF0dXJlcyQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIE9MIGRyYXcgc291cmNlXG4gICAqL1xuICBwcml2YXRlIG9sRHJhd1NvdXJjZSA9IG5ldyBPbFZlY3RvclNvdXJjZSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFwIHRvIG1lYXN1cmUgb25cbiAgICovXG4gIEBJbnB1dCgpIG1hcDogSWdvTWFwO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVhc3VyZXMgc3RvcmVcbiAgICovXG4gIEBJbnB1dCgpIHN0b3JlOiBGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhNZWFzdXJlPjtcblxuICAvKipcbiAgICogTWVhc3VyZSB0eXBlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGFjdGl2ZU1lYXN1cmVUeXBlKHZhbHVlOiBNZWFzdXJlVHlwZSkge1xuICAgIHRoaXMuc2V0QWN0aXZlTWVhc3VyZVR5cGUodmFsdWUpO1xuICB9XG4gIGdldCBhY3RpdmVNZWFzdXJlVHlwZSgpOiBNZWFzdXJlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZU1lYXN1cmVUeXBlO1xuICB9XG4gIHByaXZhdGUgX2FjdGl2ZU1lYXN1cmVUeXBlOiBNZWFzdXJlVHlwZTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGVuZ3RoIGEgc2VnbWVudCBtdXN0IGhhdmUgdG8gZGlzcGxheSBhIHRvb2x0aXAuXG4gICAqIEl0IGFsc28gYXBwbGllcyB0byBhcmVhIHRvb2x0aXBzLlxuICAgKi9cbiAgQElucHV0KCkgbWluU2VnbWVudExlbmd0aCA9IDEwO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgdGFibGU6IEVudGl0eVRhYmxlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0ZXIgb25lIG9mIHRoZSBkcmF3IGNvbnRyb2wgaXMgYWN0aXZlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IGRyYXdDb250cm9sSXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBwcm9qZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHRoaXMudGFibGVUZW1wbGF0ZSA9IHtcbiAgICAgIHNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIHNlbGVjdE1hbnk6IHRydWUsXG4gICAgICBzZWxlY3Rpb25DaGVja2JveDogdHJ1ZSxcbiAgICAgIHNvcnQ6IHRydWUsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICAgICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAnaWdvLmdlby5tZWFzdXJlLmxlbmd0aEhlYWRlcidcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlQWNjZXNzb3I6IChsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuYWN0aXZlTGVuZ3RoVW5pdDtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmUgPSBtZXRlcnNUb1VuaXQoXG4gICAgICAgICAgICAgIGxvY2FsRmVhdHVyZS5wcm9wZXJ0aWVzLm1lYXN1cmUubGVuZ3RoLFxuICAgICAgICAgICAgICB1bml0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1lYXN1cmUobWVhc3VyZSwge1xuICAgICAgICAgICAgICBkZWNpbWFsOiAxLFxuICAgICAgICAgICAgICB1bml0LFxuICAgICAgICAgICAgICB1bml0QWJicjogZmFsc2UsXG4gICAgICAgICAgICAgIGxvY2FsZTogJ2ZyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2FyZWEnLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICdpZ28uZ2VvLm1lYXN1cmUuYXJlYUhlYWRlcidcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlQWNjZXNzb3I6IChsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuYWN0aXZlQXJlYVVuaXQ7XG4gICAgICAgICAgICBjb25zdCBtZWFzdXJlID0gc3F1YXJlTWV0ZXJzVG9Vbml0KFxuICAgICAgICAgICAgICBsb2NhbEZlYXR1cmUucHJvcGVydGllcy5tZWFzdXJlLmFyZWEsXG4gICAgICAgICAgICAgIHVuaXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbWVhc3VyZVxuICAgICAgICAgICAgICA/IGZvcm1hdE1lYXN1cmUobWVhc3VyZSwge1xuICAgICAgICAgICAgICAgICAgZGVjaW1hbDogMSxcbiAgICAgICAgICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgICAgICAgICB1bml0QWJicjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsb2NhbGU6ICdmcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGRyYXcgY29udHJvbHMgYW5kIGFjdGl2YXRlIG9uZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2V0U2F2ZWRVbml0cygpO1xuICAgIHRoaXMuaW5pdFN0b3JlKCk7XG4gICAgdGhpcy5jcmVhdGVEcmF3TGluZUNvbnRyb2woKTtcbiAgICB0aGlzLmNyZWF0ZURyYXdQb2x5Z29uQ29udHJvbCgpO1xuICAgIHRoaXMuY3JlYXRlTW9kaWZ5Q29udHJvbCgpO1xuICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBzT2ZPbFNvdXJjZSh0aGlzLnN0b3JlLnNvdXJjZS5vbCk7XG4gICAgdGhpcy5jaGVja0Rpc3RhbmNlQXJlYVRvZ2dsZSgpO1xuICAgIHRoaXMuc2V0QWN0aXZlTWVhc3VyZVR5cGUoTWVhc3VyZVR5cGUuTGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgb3ZlcmxheSBsYXllciBhbmQgYW55IGludGVyYWN0aW9uIGFkZGVkIGJ5IHRoaXMgY29tcG9uZW50LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN0b3JlLmNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLnN0b3JlLm1hcC5sYXllckNvbnRyb2xsZXIucmVtb3ZlKHRoaXMuc3RvcmUubGF5ZXIpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QWN0aXZlTWVhc3VyZVR5cGUodW5kZWZpbmVkKTtcbiAgICB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgdGhpcy5mcmVlemVTdG9yZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLm1hcCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1lYXN1cmUgdHlwZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uTWVhc3VyZVR5cGVDaGFuZ2UobWVhc3VyZVR5cGU6IE1lYXN1cmVUeXBlKSB7XG4gICAgdGhpcy5hY3RpdmVNZWFzdXJlVHlwZSA9IG1lYXN1cmVUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIGN1cnJlbnQgZHJhdyBjb250cm9sXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25Ub2dnbGVEcmF3Q29udHJvbCh0b2dnbGU6IGJvb2xlYW4pIHtcbiAgICBpZiAodG9nZ2xlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIGN1cnJlbnQgZHJhdyBjb250cm9sXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25Ub2dnbGVNZWFzdXJlVW5pdHNBdXRvKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMubWVhc3VyZVVuaXRzQXV0byA9IHRvZ2dsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgZGlzdGFuY2VzIG9mIHRoZSBhcmVhc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uVG9nZ2xlRGlzcGxheURpc3RhbmNlKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzcGxheURpc3RhbmNlID0gdG9nZ2xlO1xuICAgIHRoaXMub25EaXNwbGF5RGlzdGFuY2UoKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnZGlzdGFuY2VUb2dnbGUnLCB0b2dnbGUsIFN0b3JhZ2VTY29wZS5TRVNTSU9OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgZGlzdGFuY2VzIG9mIHRoZSBsaW5lc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uVG9nZ2xlRGlzcGxheUxpbmVzKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzcGxheUxpbmVzID0gdG9nZ2xlO1xuICAgIHRoaXMub25EaXNwbGF5TGluZXMoKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnbGluZXNUb2dnbGUnLCB0b2dnbGUsIFN0b3JhZ2VTY29wZS5TRVNTSU9OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvblRvZ2dsZURpc3BsYXlBcmVhcyh0b2dnbGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc3BsYXlBcmVhcyA9IHRvZ2dsZTtcbiAgICB0aGlzLm9uRGlzcGxheUFyZWFzKCk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2FyZWFzVG9nZ2xlJywgdG9nZ2xlLCBTdG9yYWdlU2NvcGUuU0VTU0lPTik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRpc3BsYXkgcGFyYW1ldHJlcyBpbiBjdXJyZW50IHZhbHVlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNoZWNrRGlzdGFuY2VBcmVhVG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnZGlzdGFuY2VUb2dnbGUnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlzcGxheURpc3RhbmNlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnbGluZXNUb2dnbGUnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlzcGxheUxpbmVzID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnYXJlYXNUb2dnbGUnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlzcGxheUFyZWFzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIGN1cnJlbnQgZGlzcGxheSBvZiBkaXN0YW5jZXMgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkRpc3BsYXlEaXN0YW5jZSgpIHtcbiAgICBjb25zdCBlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PiA9XG4gICAgICB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZS1wb2x5Z29uZS1zZWdtZW50cydcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuZGlzcGxheURpc3RhbmNlKSB7XG4gICAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PlxuICAgICAgICB2YWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCdpZ28tbWFwLXRvb2x0aXAtaGlkZGVuJylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEFycmF5LmZyb20oZWxlbWVudHMpLm1hcCgodmFsdWU6IEVsZW1lbnQpID0+XG4gICAgICAgIHZhbHVlLmNsYXNzTGlzdC5hZGQoJ2lnby1tYXAtdG9vbHRpcC1oaWRkZW4nKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgY3VycmVudCBkaXNwbGF5IG9mIGRpc3RhbmNlcyBvZiBsaW5lc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uRGlzcGxheUxpbmVzKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+ID1cbiAgICAgIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgJ2lnby1tYXAtdG9vbHRpcC1tZWFzdXJlLWxpbmUtc2VnbWVudHMnXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGxheUxpbmVzKSB7XG4gICAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHZhbHVlLmNsYXNzTGlzdC5yZW1vdmUoJ2lnby1tYXAtdG9vbHRpcC1oaWRkZW4nKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHZhbHVlLmNsYXNzTGlzdC5hZGQoJ2lnby1tYXAtdG9vbHRpcC1oaWRkZW4nKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkRpc3BsYXlBcmVhcygpIHtcbiAgICBjb25zdCBlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PiA9XG4gICAgICB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lnby1tYXAtdG9vbHRpcC1tZWFzdXJlLWFyZWEnKTtcblxuICAgIGlmICh0aGlzLmRpc3BsYXlBcmVhcykge1xuICAgICAgQXJyYXkuZnJvbShlbGVtZW50cykubWFwKCh2YWx1ZTogRWxlbWVudCkgPT5cbiAgICAgICAgdmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgnaWdvLW1hcC10b29sdGlwLWhpZGRlbicpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PlxuICAgICAgICB2YWx1ZS5jbGFzc0xpc3QuYWRkKCdpZ28tbWFwLXRvb2x0aXAtaGlkZGVuJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWVhc3VyZSB0eXBlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25MZW5ndGhVbml0Q2hhbmdlKHVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0KSB7XG4gICAgdGhpcy5hY3RpdmVMZW5ndGhVbml0ID0gdW5pdDtcbiAgICB0aGlzLnNhdmVDdXJyZW50VW5pdHMoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWJsZUFuZFRvb2x0aXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1lYXN1cmUgdHlwZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uQXJlYVVuaXRDaGFuZ2UodW5pdDogTWVhc3VyZUFyZWFVbml0KSB7XG4gICAgdGhpcy5hY3RpdmVBcmVhVW5pdCA9IHVuaXQ7XG4gICAgdGhpcy5zYXZlQ3VycmVudFVuaXRzKCk7XG4gICAgdGhpcy5yZWZyZXNoVGFibGVBbmRUb29sdGlwKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUYWJsZUFuZFRvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zdGF0ZVZpZXcuY2xlYXIoKTtcblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sU291cmNlKHRoaXMuc3RvcmUuc291cmNlLm9sKTtcbiAgICBpZiAodGhpcy5hY3RpdmVPbEdlb21ldHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sR2VvbWV0cnkodGhpcy5hY3RpdmVPbEdlb21ldHJ5KTtcbiAgICB9XG4gIH1cblxuICBvbkNhbGN1bGF0ZUNsaWNrKCkge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZTtcbiAgICBjb25zdCBhcmVhID0gZmVhdHVyZXMucmVkdWNlKFxuICAgICAgKHN1bTogbnVtYmVyLCBsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgbG9jYWxGZWF0dXJlLnByb3BlcnRpZXMubWVhc3VyZS5hcmVhIHx8IDA7XG4gICAgICB9LFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3QgbGVuZ3RoID0gZmVhdHVyZXMucmVkdWNlKFxuICAgICAgKHN1bTogbnVtYmVyLCBsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICBpZiAobG9jYWxGZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bSArIGxvY2FsRmVhdHVyZS5wcm9wZXJ0aWVzLm1lYXN1cmUubGVuZ3RoIHx8IDA7XG4gICAgICB9LFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3QgcGVyaW1ldGVyID0gZmVhdHVyZXMucmVkdWNlKFxuICAgICAgKHN1bTogbnVtYmVyLCBsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICBpZiAobG9jYWxGZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bSArIGxvY2FsRmVhdHVyZS5wcm9wZXJ0aWVzLm1lYXN1cmUubGVuZ3RoIHx8IDA7XG4gICAgICB9LFxuICAgICAgMFxuICAgICk7XG5cbiAgICB0aGlzLm9wZW5EaWFsb2coe1xuICAgICAgYXJlYSxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHBlcmltZXRlclxuICAgIH0pO1xuICB9XG5cbiAgb25EZWxldGVDbGljaygpIHtcbiAgICB0aGlzLnN0b3JlLmRlbGV0ZU1hbnkodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChzZWxlY3RlZEZlYXR1cmUpID0+IHtcbiAgICAgIHRoaXMub2xEcmF3U291cmNlLmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZHJhd2luZ0xheWVyRmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGRyYXdpbmdMYXllckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUucHJvcGVydGllcy5pZCA9PT0gZ2VvbWV0cnkub2xfdWlkKSB7XG4gICAgICAgICAgdGhpcy5vbERyYXdTb3VyY2UucmVtb3ZlRmVhdHVyZShkcmF3aW5nTGF5ZXJGZWF0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbk1vZGlmeUNsaWNrKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGlmeUNvbnRyb2wuYWN0aXZlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvY2FsRmVhdHVyZSA9IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF07XG4gICAgICBjb25zdCBvbEZlYXR1cmVzID0gdGhpcy5zdG9yZS5sYXllci5vbC5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlcygpO1xuICAgICAgY29uc3Qgb2xGZWF0dXJlID0gb2xGZWF0dXJlcy5maW5kKChfb2xGZWF0dXJlOiBPbEZlYXR1cmUpID0+IHtcbiAgICAgICAgcmV0dXJuIF9vbEZlYXR1cmUuZ2V0KCdpZCcpID09PSBsb2NhbEZlYXR1cmUucHJvcGVydGllcy5pZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob2xGZWF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZU1vZGlmeUNvbnRyb2woKTtcblxuICAgICAgICBjb25zdCBvbEdlb21ldHJ5ID0gb2xGZWF0dXJlLmdldEdlb21ldHJ5KCk7XG4gICAgICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5IGFzIE9sTGluZVN0cmluZyB8IE9sUG9seWdvbik7XG4gICAgICAgIHRoaXMubW9kaWZ5Q29udHJvbC5zZXRPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRpYWxvZyhkYXRhOiBNZWFzdXJlckRpYWxvZ0RhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKE1lYXN1cmVyRGlhbG9nQ29tcG9uZW50LCB7IGRhdGEgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgbWVhc3VyZSBzdG9yZSBhbmQgc2V0IHVwIHNvbWUgbGlzdGVuZXJzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0U3RvcmUoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuXG4gICAgbGV0IGxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8ubWVhc3VyZS5sYXllclRpdGxlJ1xuICAgICAgKSxcbiAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICAgIGlkOiBgaWdvLW1lYXN1cmVzLSR7dXVpZCgpfWAsXG4gICAgICB6SW5kZXg6IDIwMCxcbiAgICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgICBzdHlsZTogY3JlYXRlTWVhc3VyZUxheWVyU3R5bGUoKSxcbiAgICAgIHNob3dJbkxheWVyTGlzdDogdHJ1ZSxcbiAgICAgIGV4cG9ydGFibGU6IHRydWUsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICAgIHdvcmtzcGFjZTogeyBlbmFibGVkOiBmYWxzZSB9XG4gICAgfSk7XG4gICAgbGF5ZXIgPSB0cnlCaW5kU3RvcmVMYXllcihzdG9yZSwgbGF5ZXIpO1xuXG4gICAgbGF5ZXIudmlzaWJsZSQuc3Vic2NyaWJlKCh2aXNpYmxlKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PiA9XG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaWdvLW1hcC10b29sdGlwLW1lYXN1cmUnKTtcblxuICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgQXJyYXkuZnJvbShlbGVtZW50cykubWFwKCh2YWx1ZTogRWxlbWVudCkgPT5cbiAgICAgICAgICB2YWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZS1ieS1kaXNwbGF5JylcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEFycmF5LmZyb20oZWxlbWVudHMpLm1hcCgodmFsdWU6IEVsZW1lbnQpID0+XG4gICAgICAgICAgdmFsdWUuY2xhc3NMaXN0LmFkZCgnaWdvLW1hcC10b29sdGlwLW1lYXN1cmUtYnktZGlzcGxheScpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3koc3RvcmUpO1xuXG4gICAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3koXG4gICAgICBzdG9yZSxcbiAgICAgIG5ldyBGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSh7XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIG1hbnk6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMub25GZWF0dXJlQWRkZWRLZXkgPSBzdG9yZS5zb3VyY2Uub2wub24oXG4gICAgICAnYWRkZmVhdHVyZScsXG4gICAgICAoZXZlbnQ6IE9sVmVjdG9yU291cmNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYWxGZWF0dXJlID0gZXZlbnQuZmVhdHVyZTtcbiAgICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGxvY2FsRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcbiAgICAgICAgdGhpcy51cGRhdGVNZWFzdXJlT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnksIGxvY2FsRmVhdHVyZS5nZXQoJ21lYXN1cmUnKSk7XG4gICAgICAgIHRoaXMub25EaXNwbGF5RGlzdGFuY2UoKTtcbiAgICAgICAgdGhpcy5vbkRpc3BsYXlMaW5lcygpO1xuICAgICAgICB0aGlzLm9uRGlzcGxheUFyZWFzKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMub25GZWF0dXJlUmVtb3ZlZEtleSA9IHN0b3JlLnNvdXJjZS5vbC5vbihcbiAgICAgICdyZW1vdmVmZWF0dXJlJyxcbiAgICAgIChldmVudDogT2xWZWN0b3JTb3VyY2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBvbEdlb21ldHJ5ID0gZXZlbnQuZmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcbiAgICAgICAgdGhpcy5jbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkJCA9IHN0b3JlLnN0YXRlVmlld1xuICAgICAgLm1hbnlCeSQoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoTWVhc3VyZT4pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcCgxKSAvLyBTa2lwIGluaXRpYWwgZW1pc3Npb25cbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlY29yZHM6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aE1lYXN1cmU+W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kaWZ5Q29udHJvbC5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC5uZXh0KHJlY29yZHMubWFwKChyZWNvcmQpID0+IHJlY29yZC5lbnRpdHkpKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQucHVzaChcbiAgICAgIHRoaXMuc3RvcmUuZW50aXRpZXMkLnN1YnNjcmliZSgob2JqZWN0c0V4aXN0cykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgb2JqZWN0c0V4aXN0cy5maW5kKFxuICAgICAgICAgICAgKG9iamVjdEV4aXN0KSA9PiBvYmplY3RFeGlzdC5nZW9tZXRyeS50eXBlID09PSAnUG9seWdvbidcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuaGFzQXJlYSQubmV4dCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhc0FyZWEkLm5leHQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdHNFeGlzdHMuZmluZChcbiAgICAgICAgICAgIChvYmplY3RFeGlzdCkgPT4gb2JqZWN0RXhpc3QuZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhhc0xpbmUkLm5leHQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oYXNMaW5lJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhbnkgc3RvcmUsIG1lYW5pbmcgdGhlIGxheWVyIGlzIHJlbW92ZWQsIHN0cmF0ZWdpZXMgYXJlIGRlYWN0aXZhdGVkXG4gICAqIGFuZCBzb21lIGxpc3RlbmVyIHJlbW92ZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGZyZWV6ZVN0b3JlKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIHVuQnlLZXkodGhpcy5vbkZlYXR1cmVBZGRlZEtleSk7XG4gICAgdW5CeUtleSh0aGlzLm9uRmVhdHVyZVJlbW92ZWRLZXkpO1xuICAgIHN0b3JlLmRlYWN0aXZhdGVTdHJhdGVneU9mVHlwZShGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3kpO1xuICAgIHN0b3JlLmRlYWN0aXZhdGVTdHJhdGVneU9mVHlwZShGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZHJhdyBsaW5lIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHJhd0xpbmVDb250cm9sKCkge1xuICAgIHRoaXMuZHJhd0xpbmVDb250cm9sID0gbmV3IERyYXdDb250cm9sKHtcbiAgICAgIGdlb21ldHJ5VHlwZTogJ0xpbmVTdHJpbmcnLFxuICAgICAgZHJhd2luZ0xheWVyU291cmNlOiB0aGlzLm9sRHJhd1NvdXJjZSxcbiAgICAgIGludGVyYWN0aW9uU3R5bGU6IGNyZWF0ZU1lYXN1cmVJbnRlcmFjdGlvblN0eWxlKCksXG4gICAgICBkcmF3aW5nTGF5ZXJTdHlsZTogbmV3IE9sU3R5bGUoe30pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZHJhdyBwb2x5Z29uIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHJhd1BvbHlnb25Db250cm9sKCkge1xuICAgIHRoaXMuZHJhd1BvbHlnb25Db250cm9sID0gbmV3IERyYXdDb250cm9sKHtcbiAgICAgIGdlb21ldHJ5VHlwZTogJ1BvbHlnb24nLFxuICAgICAgZHJhd2luZ0xheWVyU291cmNlOiB0aGlzLm9sRHJhd1NvdXJjZSxcbiAgICAgIGludGVyYWN0aW9uU3R5bGU6IGNyZWF0ZU1lYXN1cmVJbnRlcmFjdGlvblN0eWxlKCksXG4gICAgICBkcmF3aW5nTGF5ZXJTdHlsZTogbmV3IE9sU3R5bGUoe30pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZHJhdyBwb2x5Z29uIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTW9kaWZ5Q29udHJvbCgpIHtcbiAgICB0aGlzLm1vZGlmeUNvbnRyb2wgPSBuZXcgTW9kaWZ5Q29udHJvbCh7XG4gICAgICBzb3VyY2U6IHRoaXMub2xEcmF3U291cmNlLFxuICAgICAgZHJhd1N0eWxlOiBjcmVhdGVNZWFzdXJlSW50ZXJhY3Rpb25TdHlsZSgpLFxuICAgICAgbGF5ZXJTdHlsZTogbmV3IE9sU3R5bGUoe30pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHJpZ2h0IGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgdG9nZ2xlRHJhd0NvbnRyb2woKSB7XG4gICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgICAvLyB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlTWVhc3VyZVR5cGUgPT09IE1lYXN1cmVUeXBlLkxlbmd0aCkge1xuICAgICAgdGhpcy5hY3RpdmF0ZURyYXdDb250cm9sKHRoaXMuZHJhd0xpbmVDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlTWVhc3VyZVR5cGUgPT09IE1lYXN1cmVUeXBlLkFyZWEpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcmF3Q29udHJvbCh0aGlzLmRyYXdQb2x5Z29uQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGEgZ2l2ZW4gY29udHJvbFxuICAgKiBAcGFyYW0gZHJhd0NvbnRyb2wgRHJhdyBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGFjdGl2YXRlRHJhd0NvbnRyb2woZHJhd0NvbnRyb2w6IERyYXdDb250cm9sKSB7XG4gICAgdGhpcy5kcmF3Q29udHJvbElzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sID0gZHJhd0NvbnRyb2w7XG4gICAgdGhpcy5kcmF3U3RhcnQkJCA9IGRyYXdDb250cm9sLnN0YXJ0JC5zdWJzY3JpYmUoXG4gICAgICAob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSA9PiB0aGlzLm9uRHJhd1N0YXJ0KG9sR2VvbWV0cnkpXG4gICAgKTtcbiAgICB0aGlzLmRyYXdFbmQkJCA9IGRyYXdDb250cm9sLmVuZCQuc3Vic2NyaWJlKFxuICAgICAgKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4gdGhpcy5vbkRyYXdFbmQob2xHZW9tZXRyeSlcbiAgICApO1xuICAgIHRoaXMuZHJhd0NoYW5nZXMkJCA9IGRyYXdDb250cm9sLmNoYW5nZXMkLnN1YnNjcmliZShcbiAgICAgIChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHRoaXMub25EcmF3Q2hhbmdlcyhvbEdlb21ldHJ5KVxuICAgICk7XG4gICAgdGhpcy5kcmF3Q2hhbmdlcyQkID0gZHJhd0NvbnRyb2wuYWJvcnQkLnN1YnNjcmliZShcbiAgICAgIChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHtcbiAgICAgICAgdGhpcy5jbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xuICAgICAgICB0aGlzLmNsZWFyTWVhc3VyZXMoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGRyYXdDb250cm9sLnNldE9sTWFwKHRoaXMubWFwLm9sLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSB0aGUgYWN0aXZlIGRyYXcgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJhd0NvbnRyb2woKSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub2xEcmF3U291cmNlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuZHJhd1N0YXJ0JCQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kcmF3U3RhcnQkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcmF3RW5kJCQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kcmF3RW5kJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJhd0NoYW5nZXMkJCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRyYXdDaGFuZ2VzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyVG9vbHRpcHNPZk9sU291cmNlKHRoaXMub2xEcmF3U291cmNlKTtcbiAgICBpZiAodGhpcy5hY3RpdmVPbEdlb21ldHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xHZW9tZXRyeSh0aGlzLmFjdGl2ZU9sR2VvbWV0cnkpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldE9sTWFwKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGl2ZU9sR2VvbWV0cnkgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZU1lYXN1cmVUeXBlKG1lYXN1cmVUeXBlOiBNZWFzdXJlVHlwZSkge1xuICAgIHRoaXMuX2FjdGl2ZU1lYXN1cmVUeXBlID0gbWVhc3VyZVR5cGU7XG4gICAgdGhpcy5jbGVhck1lYXN1cmVzKCk7XG4gICAgdGhpcy50b2dnbGVEcmF3Q29udHJvbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXduXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9sIGxpbmVzdHJpbmcgb3IgcG9seWdvblxuICAgKi9cbiAgcHJpdmF0ZSBvbkRyYXdTdGFydChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICB0aGlzLmFjdGl2ZU9sR2VvbWV0cnkgPSBvbEdlb21ldHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXdcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT2wgbGluZXN0cmluZyBvciBwb2x5Z29uXG4gICAqL1xuICBwcml2YXRlIG9uRHJhd0VuZChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICB0aGlzLmFjdGl2ZU9sR2VvbWV0cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maW5hbGl6ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgdGhpcy5hZGRGZWF0dXJlVG9TdG9yZShvbEdlb21ldHJ5KTtcbiAgICB0aGlzLmNsZWFyVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgdGhpcy5vbERyYXdTb3VyY2UuY2xlYXIodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1lYXN1cmVzIG9ic2VydmFibGVzIGFuZCBtYXAgdG9vbHRpcHNcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT2wgbGluZXN0cmluZyBvciBwb2x5Z29uXG4gICAqL1xuICBwcml2YXRlIG9uRHJhd0NoYW5nZXMob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgY29uc3QgbWVhc3VyZSA9IG1lYXN1cmVPbEdlb21ldHJ5KG9sR2VvbWV0cnksIHRoaXMucHJvamVjdGlvbik7XG4gICAgdGhpcy51cGRhdGVNZWFzdXJlT2ZPbEdlb21ldHJ5KFxuICAgICAgb2xHZW9tZXRyeSxcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1lYXN1cmUsIHtcbiAgICAgICAgYXJlYTogdW5kZWZpbmVkIC8vIFdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBhbiBhcmVhIHRvb2x0aXAgd2hpbGUgZHJhd2luZy5cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLm1lYXN1cmUkLm5leHQobWVhc3VyZSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYSBnaXZlbiBjb250cm9sXG4gICAqIEBwYXJhbSBtb2RpZnlDb250cm9sIE1vZGlmeSBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGFjdGl2YXRlTW9kaWZ5Q29udHJvbCgpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnN0b3JlLmdldFN0cmF0ZWd5T2ZUeXBlKFxuICAgICAgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3lcbiAgICApIGFzIEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5O1xuICAgIHNlbGVjdGlvbi5kZWFjdGl2YXRlKCk7XG4gICAgc2VsZWN0aW9uLmNsZWFyKCk7XG5cbiAgICB0aGlzLm1vZGlmeVN0YXJ0JCQgPSB0aGlzLm1vZGlmeUNvbnRyb2wuc3RhcnQkLnN1YnNjcmliZShcbiAgICAgIChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHRoaXMub25Nb2RpZnlTdGFydChvbEdlb21ldHJ5KVxuICAgICk7XG4gICAgdGhpcy5tb2RpZnlFbmQkJCA9IHRoaXMubW9kaWZ5Q29udHJvbC5lbmQkLnN1YnNjcmliZShcbiAgICAgIChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHRoaXMub25Nb2RpZnlFbmQob2xHZW9tZXRyeSlcbiAgICApO1xuICAgIHRoaXMubW9kaWZ5Q2hhbmdlcyQkID0gdGhpcy5tb2RpZnlDb250cm9sLmNoYW5nZXMkLnN1YnNjcmliZShcbiAgICAgIChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHRoaXMub25Nb2RpZnlDaGFuZ2VzKG9sR2VvbWV0cnkpXG4gICAgKTtcbiAgICB0aGlzLm1vZGlmeUNvbnRyb2wuc2V0T2xNYXAodGhpcy5tYXAub2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgdGhlIGFjdGl2ZSBtb2RpZnkgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlTW9kaWZ5Q29udHJvbCgpIHtcbiAgICBpZiAodGhpcy5tb2RpZnlTdGFydCQkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kaWZ5U3RhcnQkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RpZnlFbmQkJCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm1vZGlmeUVuZCQkLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGlmeUNoYW5nZXMkJCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm1vZGlmeUNoYW5nZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZU9sR2VvbWV0cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsRmVhdHVyZSA9IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZVRvU3RvcmUodGhpcy5hY3RpdmVPbEdlb21ldHJ5LCBsb2NhbEZlYXR1cmUpO1xuICAgICAgfVxuICAgICAgdGhpcy5maW5hbGl6ZU1lYXN1cmVPZk9sR2VvbWV0cnkodGhpcy5hY3RpdmVPbEdlb21ldHJ5KTtcbiAgICB9XG5cbiAgICB0aGlzLm9sRHJhd1NvdXJjZS5jbGVhcigpO1xuXG4gICAgdGhpcy5zdG9yZS5hY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KTtcblxuICAgIHRoaXMuYWN0aXZlT2xHZW9tZXRyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1vZGlmeUNvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgZHJhdyBzb3VyY2UgYW5kIHRyYWNrIHRoZSBnZW9tZXRyeSBiZWluZyBkcmF3blxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICovXG4gIHByaXZhdGUgb25Nb2RpZnlTdGFydChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICB0aGlzLm9uRHJhd1N0YXJ0KG9sR2VvbWV0cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZWFzdXJlcyBvYnNlcnZhYmxlcyBhbmQgbWFwIHRvb2x0aXBzXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9sIGxpbmVzdHJpbmcgb3IgcG9seWdvblxuICAgKi9cbiAgcHJpdmF0ZSBvbk1vZGlmeUNoYW5nZXMob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgdGhpcy5vbkRyYXdDaGFuZ2VzKG9sR2VvbWV0cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXdcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT2wgbGluZXN0cmluZyBvciBwb2x5Z29uXG4gICAqL1xuICBwcml2YXRlIG9uTW9kaWZ5RW5kKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIHRoaXMuZmluYWxpemVNZWFzdXJlT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgY29uc3QgbWVhc3VyZSA9IG1lYXN1cmVPbEdlb21ldHJ5KG9sR2VvbWV0cnksIHRoaXMucHJvamVjdGlvbik7XG4gICAgdGhpcy51cGRhdGVNZWFzdXJlT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnksIG1lYXN1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZWFzdXJlcyBvYnNlcnZhYmxlc1xuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICogQHBhcmFtIG1lYXN1cmUgTWVhc3VyZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVNZWFzdXJlT2ZPbEdlb21ldHJ5KFxuICAgIG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbixcbiAgICBtZWFzdXJlOiBNZWFzdXJlXG4gICkge1xuICAgIG9sR2VvbWV0cnkuc2V0UHJvcGVydGllcyh7IF9tZWFzdXJlOiBtZWFzdXJlIH0sIHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1lYXN1cmVzIG9ic2VydmFibGVzXG4gICAqL1xuICBwcml2YXRlIGNsZWFyTWVhc3VyZXMoKSB7XG4gICAgdGhpcy5tZWFzdXJlJC5uZXh0KHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmZWF0dXJlIHdpdGggbWVhc3VyZXMgdG8gdGhlIHN0b3JlLiBUaGUgbG9hZGluZyBzdHJhZ2VneSBvZiB0aGUgc3RvcmVcbiAgICogd2lsbCB0cmlnZ2VyIGFuZCBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIG1hcC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGFkZEZlYXR1cmVUb1N0b3JlKG9sR2VvbWV0cnksIGxvY2FsRmVhdHVyZT86IEZlYXR1cmVXaXRoTWVhc3VyZSkge1xuICAgIGNvbnN0IGZlYXR1cmVJZCA9IGxvY2FsRmVhdHVyZVxuICAgICAgPyBsb2NhbEZlYXR1cmUucHJvcGVydGllcy5pZFxuICAgICAgOiBvbEdlb21ldHJ5Lm9sX3VpZDtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKTtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBPbEdlb0pTT04oKS53cml0ZUdlb21ldHJ5T2JqZWN0KG9sR2VvbWV0cnksIHtcbiAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiBwcm9qZWN0aW9uLFxuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25cbiAgICB9KSBhcyBhbnk7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoe1xuICAgICAgdHlwZTogRkVBVFVSRSxcbiAgICAgIGdlb21ldHJ5LFxuICAgICAgcHJvamVjdGlvbjogcHJvamVjdGlvbi5nZXRDb2RlKCksXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGlkOiBmZWF0dXJlSWQsXG4gICAgICAgIG1lYXN1cmU6IG9sR2VvbWV0cnkuZ2V0KCdfbWVhc3VyZScpXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBpZDogZmVhdHVyZUlkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFsbCB0aGUgdG9vbHRpcHMgb2YgYW4gT0wgZ2VvbWV0cnlcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT0wgR2VvbWV0cnlcbiAgICogQHBhcmFtIGxlbmd0aHMgTGVuZ3RocyBvZiB0aGUgT0wgZ2VvbWV0cnkncyBzZWdtZW50c1xuICAgKiBAcGFyYW0gbWVhc3VyZVVuaXQgRGlzcGxheSB0b29sdGlwIG1lYXN1cmUgaW4gdGhvc2UgdW5pdHNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgY29uc3QgbWVhc3VyZSA9IG9sR2VvbWV0cnkuZ2V0KCdfbWVhc3VyZScpO1xuICAgIGNvbnN0IGxlbmd0aHMgPSBtZWFzdXJlLmxlbmd0aHM7XG4gICAgY29uc3QgYXJlYSA9IG1lYXN1cmUuYXJlYTtcblxuICAgIGNvbnN0IG9sTWlkcG9pbnRzVG9vbHRpcHMgPSB1cGRhdGVPbFRvb2x0aXBzQXRNaWRwb2ludHMob2xHZW9tZXRyeSk7XG4gICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSBvbE1pZHBvaW50c1Rvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbE1pZHBvaW50c1Rvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGxlbmd0aHNbaV07XG4gICAgICAgIGlmIChsZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlT2xUb29sdGlwKFxuICAgICAgICAgICAgb2xNaWRwb2ludHNUb29sdGlwc1tpXSxcbiAgICAgICAgICAgIG1ldGVyc1RvVW5pdChsZW5ndGgsIHRoaXMuYWN0aXZlTGVuZ3RoVW5pdCksXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxlbmd0aFVuaXQsXG4gICAgICAgICAgICBNZWFzdXJlVHlwZS5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFyZWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy51cGRhdGVPbFRvb2x0aXAoXG4gICAgICAgIHVwZGF0ZU9sVG9vbHRpcEF0Q2VudGVyKG9sR2VvbWV0cnkpLFxuICAgICAgICBzcXVhcmVNZXRlcnNUb1VuaXQoYXJlYSwgdGhpcy5hY3RpdmVBcmVhVW5pdCksXG4gICAgICAgIHRoaXMuYWN0aXZlQXJlYVVuaXQsXG4gICAgICAgIE1lYXN1cmVUeXBlLkFyZWFcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSB0b29sdGlwcyBvZiBhbiBPTCBnZW9tZXRyeXNcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT0wgZ2VvbWV0cnkgd2l0aCB0b29sdGlwc1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpLmZvckVhY2goXG4gICAgICAob2xUb29sdGlwOiBPbE92ZXJsYXkgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKG9sVG9vbHRpcCAhPT0gdW5kZWZpbmVkICYmIG9sVG9vbHRpcC5nZXRNYXAoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5tYXAub2wucmVtb3ZlT3ZlcmxheShvbFRvb2x0aXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBtYXAgdG9vbHRpcHMgb2YgYWxsIHRoZSBnZW9tZXRyaWVzIG9mIGEgc291cmNlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBzT2ZPbFNvdXJjZShvbFNvdXJjZTogT2xWZWN0b3JTb3VyY2UpIHtcbiAgICBvbFNvdXJjZS5mb3JFYWNoRmVhdHVyZSgob2xGZWF0dXJlOiBPbEZlYXR1cmUpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbWFwIHRvb2x0aXBzXG4gICAqIEBwYXJhbSBvbERyYXdTb3VyY2UgT0wgdmVjdG9yIHNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhclRvb2x0aXBzT2ZPbFNvdXJjZShvbFNvdXJjZTogT2xWZWN0b3JTb3VyY2UpIHtcbiAgICBvbFNvdXJjZS5mb3JFYWNoRmVhdHVyZSgob2xGZWF0dXJlOiBPbEZlYXR1cmUpID0+IHtcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKTtcbiAgICAgIGlmIChvbEdlb21ldHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIE9MIHRvb2x0aXAgcHJvcGVydGllcyBhbmQgaW5uZXIgSFRNTCBhbmQgYWRkIGl0IHRvIHRoZSBtYXAgaWYgcG9zc2libGVcbiAgICogQHBhcmFtIG9sVG9vbHRpcCBPTCB0b29sdGlwXG4gICAqIEBwYXJhbSBtZWFzdXJlIFRoZSBtZWFzdXJlIHZhbGV1IHRpIGRpc3BsYXlcbiAgICogQHBhcmFtIG1lYXN1cmVVbml0IERpc3BsYXkgdG9vbHRpcCBtZWFzdXJlIGluIHRob3NlIHVuaXRzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU9sVG9vbHRpcChcbiAgICBvbFRvb2x0aXA6IE9sT3ZlcmxheSxcbiAgICBtZWFzdXJlOiBudW1iZXIsXG4gICAgdW5pdDogTWVhc3VyZUFyZWFVbml0IHwgTWVhc3VyZUxlbmd0aFVuaXQsXG4gICAgdHlwZTogTWVhc3VyZVR5cGVcbiAgKSB7XG4gICAgb2xUb29sdGlwLnNldFByb3BlcnRpZXMoXG4gICAgICB7IF9tZWFzdXJlOiBtZWFzdXJlLCBfdW5pdDogdW5pdCwgX3R5cGU6IHR5cGUgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIG9sVG9vbHRpcC5nZXRFbGVtZW50KCkuaW5uZXJIVE1MID0gdGhpcy5jb21wdXRlVG9vbHRpcElubmVySFRNTChvbFRvb2x0aXApO1xuICAgIGlmICh0aGlzLnNob3VsZFNob3dUb29sdGlwKG9sVG9vbHRpcCkpIHtcbiAgICAgIHRoaXMubWFwLm9sLmFkZE92ZXJsYXkob2xUb29sdGlwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBhIHRvb2x0aXAncyBjb250ZW50XG4gICAqIEBwYXJhbSBvbFRvb2x0aXAgT0wgb3ZlcmxheVxuICAgKiBAcmV0dXJucyBJbm5lciBIVE1MXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVUb29sdGlwSW5uZXJIVE1MKG9sVG9vbHRpcDogT2xPdmVybGF5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gb2xUb29sdGlwLmdldFByb3BlcnRpZXMoKSBhcyBhbnk7XG4gICAgcmV0dXJuIGZvcm1hdE1lYXN1cmUoXG4gICAgICBwcm9wZXJ0aWVzLl9tZWFzdXJlLFxuICAgICAge1xuICAgICAgICBkZWNpbWFsOiAxLFxuICAgICAgICB1bml0OiBwcm9wZXJ0aWVzLl91bml0LFxuICAgICAgICB1bml0QWJicjogdHJ1ZSxcbiAgICAgICAgbG9jYWxlOiAnZnInXG4gICAgICB9LFxuICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0b29sdGlwIHNob3VsZCBiZSBzaG93bmVkIGJhc2VkIG9uIHRoZSBsZW5ndGhcbiAgICogb2YgdGhlIHNlZ21lbnQgaXQgaXMgYm91bmQgdG8uXG4gICAqIEBwYXJhbSBvbFRvb2x0aXAgT0wgb3ZlcmxheVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0b29sdGlwIHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRTaG93VG9vbHRpcChvbFRvb2x0aXA6IE9sT3ZlcmxheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNob3dUb29sdGlwcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gb2xUb29sdGlwLmdldFByb3BlcnRpZXMoKSBhcyBhbnk7XG4gICAgY29uc3QgbWVhc3VyZSA9IHByb3BlcnRpZXMuX21lYXN1cmU7XG4gICAgaWYgKG1lYXN1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0aWVzLl91bml0ID09PSBNZWFzdXJlVHlwZS5MZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1pblNlZ21lbnRMZW5ndGggPVxuICAgICAgICBtZXRlcnNUb1VuaXQodGhpcy5taW5TZWdtZW50TGVuZ3RoLCBwcm9wZXJ0aWVzLl91bml0KSB8fCAwO1xuICAgICAgcmV0dXJuIG1lYXN1cmUgPiBNYXRoLm1heChtaW5TZWdtZW50TGVuZ3RoLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUN1cnJlbnRVbml0cygpIHtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChcbiAgICAgICdkaXN0YW5jZVVuaXQnLFxuICAgICAgdGhpcy5hY3RpdmVMZW5ndGhVbml0LFxuICAgICAgU3RvcmFnZVNjb3BlLlNFU1NJT05cbiAgICApO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KFxuICAgICAgJ2FyZWFVbml0JyxcbiAgICAgIHRoaXMuYWN0aXZlQXJlYVVuaXQsXG4gICAgICBTdG9yYWdlU2NvcGUuU0VTU0lPTlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhdmVkVW5pdHMoKSB7XG4gICAgY29uc3QgZGlzdGFuY2VVbml0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoXG4gICAgICAnZGlzdGFuY2VVbml0J1xuICAgICkgYXMgTWVhc3VyZUxlbmd0aFVuaXQ7XG4gICAgY29uc3QgYXJlYVVuaXQgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnYXJlYVVuaXQnKSBhcyBNZWFzdXJlQXJlYVVuaXQ7XG5cbiAgICB0aGlzLmFjdGl2ZUxlbmd0aFVuaXQgPSBkaXN0YW5jZVVuaXQgPyBkaXN0YW5jZVVuaXQgOiB0aGlzLmFjdGl2ZUxlbmd0aFVuaXQ7XG4gICAgdGhpcy5hY3RpdmVBcmVhVW5pdCA9IGFyZWFVbml0ID8gYXJlYVVuaXQgOiB0aGlzLmFjdGl2ZUFyZWFVbml0O1xuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2IGNsYXNzPVwibWVhc3VyZS10eXBlLXRvZ2dsZSBtYXQtdHlwb2dyYXBoeVwiPlxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxuICAgICAgW3ZhbHVlXT1cImFjdGl2ZU1lYXN1cmVUeXBlXCJcbiAgICAgIChjaGFuZ2UpPVwib25NZWFzdXJlVHlwZUNoYW5nZSgkZXZlbnQudmFsdWUpXCJcbiAgICA+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIm1lYXN1cmVUeXBlLkxlbmd0aFwiPlxuICAgICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLicgKyBtZWFzdXJlVHlwZS5MZW5ndGggfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIm1lYXN1cmVUeXBlLkFyZWFcIj5cbiAgICAgICAge3sgJ2lnby5nZW8ubWVhc3VyZS4nICsgbWVhc3VyZVR5cGUuQXJlYSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibWVhc3VyZS1vcHRpb25zIG1hdC10eXBvZ3JhcGh5XCI+XG4gICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgIFtkaXNhYmxlZF09XCJkcmF3Q29udHJvbElzRGlzYWJsZWRcIlxuICAgICAgW2NoZWNrZWRdPVwiZHJhd0NvbnRyb2xJc0FjdGl2ZVwiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlRHJhd0NvbnRyb2woJGV2ZW50LmNoZWNrZWQpXCJcbiAgICA+XG4gICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLnRvZ2dsZUFjdGl2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJoYXNMaW5lJCB8IGFzeW5jXCI+PC9tYXQtZGl2aWRlcj5cblxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAqbmdJZj1cImhhc0xpbmUkIHwgYXN5bmNcIlxuICAgICAgW2NoZWNrZWRdPVwiZGlzcGxheUxpbmVzXCJcbiAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVEaXNwbGF5TGluZXMoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICA+XG4gICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLnRvZ2dsZURpc3BsYXlMaW5lcycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCI+PC9tYXQtZGl2aWRlcj5cblxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAqbmdJZj1cImhhc0FyZWEkIHwgYXN5bmNcIlxuICAgICAgW2NoZWNrZWRdPVwiZGlzcGxheURpc3RhbmNlXCJcbiAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVEaXNwbGF5RGlzdGFuY2UoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICA+XG4gICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLnRvZ2dsZURpc3BsYXlEaXN0YW5jZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgKm5nSWY9XCJoYXNBcmVhJCB8IGFzeW5jXCJcbiAgICAgIFtjaGVja2VkXT1cImRpc3BsYXlBcmVhc1wiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlRGlzcGxheUFyZWFzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPlxuICAgICAge3sgJ2lnby5nZW8ubWVhc3VyZS50b2dnbGVEaXNwbGF5QXJlYXMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiaGFzQXJlYSQgfCBhc3luY1wiPjwvbWF0LWRpdmlkZXI+XG5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgW2NoZWNrZWRdPVwibWVhc3VyZVVuaXRzQXV0b1wiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlTWVhc3VyZVVuaXRzQXV0bygkZXZlbnQuY2hlY2tlZClcIlxuICAgID5cbiAgICAgIHt7ICdpZ28uZ2VvLm1lYXN1cmUudG9nZ2xlQXV0b1VuaXRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lYXN1cmUkIHwgYXN5bmMgYXMgbWVhc3VyZVwiPlxuICAgIDxpZ28tbWVhc3VyZXItaXRlbVxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgYWN0aXZlTWVhc3VyZVR5cGUgPT09IG1lYXN1cmVUeXBlLkxlbmd0aCB8fFxuICAgICAgICBhY3RpdmVNZWFzdXJlVHlwZSA9PT0gbWVhc3VyZVR5cGUuQXJlYVxuICAgICAgXCJcbiAgICAgIFttZWFzdXJlVHlwZV09XCJtZWFzdXJlVHlwZS5MZW5ndGhcIlxuICAgICAgW21lYXN1cmVVbml0XT1cImFjdGl2ZUxlbmd0aFVuaXRcIlxuICAgICAgW21lYXN1cmVdPVwibWVhc3VyZS5sZW5ndGhcIlxuICAgICAgW2F1dG9dPVwibWVhc3VyZVVuaXRzQXV0b1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgIChhY3RpdmVNZWFzdXJlVHlwZSA9PT0gbWVhc3VyZVR5cGUuQXJlYVxuICAgICAgICAgID8gJ2lnby5nZW8ubWVhc3VyZS5wZXJpbWV0ZXInXG4gICAgICAgICAgOiAnaWdvLmdlby5tZWFzdXJlLmxlbmd0aCdcbiAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgXCJcbiAgICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJvbkxlbmd0aFVuaXRDaGFuZ2UoJGFueSgkZXZlbnQpKVwiXG4gICAgPlxuICAgIDwvaWdvLW1lYXN1cmVyLWl0ZW0+XG5cbiAgICA8aWdvLW1lYXN1cmVyLWl0ZW1cbiAgICAgICpuZ0lmPVwiYWN0aXZlTWVhc3VyZVR5cGUgPT09IG1lYXN1cmVUeXBlLkFyZWFcIlxuICAgICAgW21lYXN1cmVUeXBlXT1cIm1lYXN1cmVUeXBlLkFyZWFcIlxuICAgICAgW21lYXN1cmVVbml0XT1cImFjdGl2ZUFyZWFVbml0XCJcbiAgICAgIFttZWFzdXJlXT1cIm1lYXN1cmUuYXJlYVwiXG4gICAgICBbYXV0b109XCJtZWFzdXJlVW5pdHNBdXRvXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmdlby5tZWFzdXJlLmFyZWEnIHwgdHJhbnNsYXRlXCJcbiAgICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJvbkFyZWFVbml0Q2hhbmdlKCRhbnkoJGV2ZW50KSlcIlxuICAgID5cbiAgICA8L2lnby1tZWFzdXJlci1pdGVtPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCI+PC9tYXQtZGl2aWRlcj5cblxuICA8ZGl2IGNsYXNzPVwibWVhc3VyZS1zdG9yZS1idXR0b25zXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubWVhc3VyZS5hY3Rpb25iYXIuY2FsY3VsYXRlLnRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoc2VsZWN0ZWRGZWF0dXJlcyQgfCBhc3luYykubGVuZ3RoID09PSAwXCJcbiAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgIChjbGljayk9XCJvbkNhbGN1bGF0ZUNsaWNrKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jYWxjdWxhdGU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubWVhc3VyZS5hY3Rpb25iYXIuZGVsZXRlLnRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoc2VsZWN0ZWRGZWF0dXJlcyQgfCBhc3luYykubGVuZ3RoID09PSAwXCJcbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAoY2xpY2spPVwib25EZWxldGVDbGljaygpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGlnby1lbnRpdHktdGFibGVcbiAgICAjdGFibGVcbiAgICBjbGFzcz1cInRhYmxlLWNvbXBhY3RcIlxuICAgIFtzdG9yZV09XCJzdG9yZVwiXG4gICAgW3RlbXBsYXRlXT1cInRhYmxlVGVtcGxhdGVcIlxuICA+XG4gIDwvaWdvLWVudGl0eS10YWJsZT5cbjwvZGl2PlxuIl19