@igo2/integration 1.12.0 → 1.13.0-alpha.1

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 (160) hide show
  1. package/{esm2015/igo2-integration.js → esm2020/igo2-integration.mjs} +0 -0
  2. package/esm2020/lib/about/about-tool/about-tool.component.mjs +185 -0
  3. package/{esm2015/lib/about/about-tool/index.js → esm2020/lib/about/about-tool/index.mjs} +0 -0
  4. package/{esm2015/lib/about/about.module.js → esm2020/lib/about/about.module.mjs} +9 -11
  5. package/{esm2015/lib/about/index.js → esm2020/lib/about/index.mjs} +0 -0
  6. package/{esm2015/lib/analytics/analytics-listener.service.js → esm2020/lib/analytics/analytics-listener.service.mjs} +0 -0
  7. package/{esm2015/lib/analytics/analytics.module.js → esm2020/lib/analytics/analytics.module.mjs} +2 -2
  8. package/{esm2015/lib/analytics/index.js → esm2020/lib/analytics/index.mjs} +0 -0
  9. package/{esm2015/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.js → esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs} +3 -7
  10. package/{esm2015/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.js → esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs} +3 -5
  11. package/{esm2015/lib/catalog/catalog-library-tool/catalog-library-tool.component.js → esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs} +3 -7
  12. package/{esm2015/lib/catalog/catalog-library-tool/catalog-library-tool.module.js → esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs} +3 -5
  13. package/{esm2015/lib/catalog/catalog.module.js → esm2020/lib/catalog/catalog.module.mjs} +2 -2
  14. package/{esm2015/lib/catalog/catalog.state.js → esm2020/lib/catalog/catalog.state.mjs} +0 -0
  15. package/{esm2015/lib/catalog/index.js → esm2020/lib/catalog/index.mjs} +0 -0
  16. package/{esm2015/lib/context/context-editor-tool/context-editor-tool.component.js → esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs} +3 -6
  17. package/{esm2015/lib/context/context-manager-tool/context-manager-tool.component.js → esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs} +3 -6
  18. package/{esm2015/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.js → esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs} +3 -6
  19. package/{esm2015/lib/context/context-share-tool/context-share-tool.component.js → esm2020/lib/context/context-share-tool/context-share-tool.component.mjs} +3 -6
  20. package/{esm2015/lib/context/context.module.js → esm2020/lib/context/context.module.mjs} +2 -2
  21. package/{esm2015/lib/context/context.state.js → esm2020/lib/context/context.state.mjs} +0 -0
  22. package/{esm2015/lib/context/index.js → esm2020/lib/context/index.mjs} +0 -0
  23. package/{esm2015/lib/directions/directions-tool/directions-tool.component.js → esm2020/lib/directions/directions-tool/directions-tool.component.mjs} +3 -6
  24. package/{esm2015/lib/directions/directions-tool/index.js → esm2020/lib/directions/directions-tool/index.mjs} +0 -0
  25. package/{esm2015/lib/directions/directions.module.js → esm2020/lib/directions/directions.module.mjs} +2 -2
  26. package/esm2020/lib/directions/directions.state.mjs +64 -0
  27. package/{esm2015/lib/directions/index.js → esm2020/lib/directions/index.mjs} +0 -0
  28. package/{esm2015/lib/draw/draw.module.js → esm2020/lib/draw/draw.module.mjs} +2 -2
  29. package/{esm2015/lib/draw/draw.state.js → esm2020/lib/draw/draw.state.mjs} +0 -0
  30. package/{esm2015/lib/draw/drawing-tool/drawing-tool.component.js → esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs} +3 -7
  31. package/{esm2015/lib/draw/index.js → esm2020/lib/draw/index.mjs} +0 -0
  32. package/{esm2015/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.js → esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs} +0 -0
  33. package/{esm2015/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.js → esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs} +3 -7
  34. package/{esm2015/lib/filter/active-ogc-filter-tool/index.js → esm2020/lib/filter/active-ogc-filter-tool/index.mjs} +0 -0
  35. package/{esm2015/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.js → esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs} +0 -0
  36. package/{esm2015/lib/filter/active-time-filter-tool/active-time-filter-tool.component.js → esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs} +3 -7
  37. package/{esm2015/lib/filter/active-time-filter-tool/index.js → esm2020/lib/filter/active-time-filter-tool/index.mjs} +0 -0
  38. package/{esm2015/lib/filter/filter.module.js → esm2020/lib/filter/filter.module.mjs} +2 -2
  39. package/{esm2015/lib/filter/index.js → esm2020/lib/filter/index.mjs} +0 -0
  40. package/{esm2015/lib/filter/ogc-filter-tool/index.js → esm2020/lib/filter/ogc-filter-tool/index.mjs} +0 -0
  41. package/{esm2015/lib/filter/ogc-filter-tool/ogc-filter-tool.component.js → esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs} +3 -6
  42. package/{esm2015/lib/filter/spatial-filter-tool/index.js → esm2020/lib/filter/spatial-filter-tool/index.mjs} +0 -0
  43. package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +535 -0
  44. package/{esm2015/lib/filter/time-filter-tool/index.js → esm2020/lib/filter/time-filter-tool/index.mjs} +0 -0
  45. package/{esm2015/lib/filter/time-filter-tool/time-filter-tool.component.js → esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs} +3 -6
  46. package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +137 -0
  47. package/{esm2015/lib/import-export/import-export-tool/index.js → esm2020/lib/import-export/import-export-tool/index.mjs} +0 -0
  48. package/{esm2015/lib/import-export/import-export.module.js → esm2020/lib/import-export/import-export.module.mjs} +7 -9
  49. package/{esm2015/lib/import-export/import-export.state.js → esm2020/lib/import-export/import-export.state.mjs} +0 -0
  50. package/{esm2015/lib/import-export/index.js → esm2020/lib/import-export/index.mjs} +0 -0
  51. package/{esm2015/lib/integration.module.js → esm2020/lib/integration.module.mjs} +2 -2
  52. package/{esm2015/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.js → esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs} +14 -22
  53. package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +89 -0
  54. package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +218 -0
  55. package/{esm2015/lib/map/advanced-map-tool/index.js → esm2020/lib/map/advanced-map-tool/index.mjs} +0 -0
  56. package/{esm2015/lib/map/index.js → esm2020/lib/map/index.mjs} +0 -0
  57. package/{esm2015/lib/map/layer-list-tool.state.js → esm2020/lib/map/layer-list-tool.state.mjs} +0 -0
  58. package/{esm2015/lib/map/map-details-tool/index.js → esm2020/lib/map/map-details-tool/index.mjs} +0 -0
  59. package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +256 -0
  60. package/{esm2015/lib/map/map-legend/index.js → esm2020/lib/map/map-legend/index.mjs} +0 -0
  61. package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +275 -0
  62. package/{esm2015/lib/map/map-proximity-tool/index.js → esm2020/lib/map/map-proximity-tool/index.mjs} +0 -0
  63. package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +206 -0
  64. package/{esm2015/lib/map/map-proximity.state.js → esm2020/lib/map/map-proximity.state.mjs} +10 -11
  65. package/{esm2015/lib/map/map-tool/index.js → esm2020/lib/map/map-tool/index.mjs} +0 -0
  66. package/esm2020/lib/map/map-tool/map-tool.component.mjs +130 -0
  67. package/{esm2015/lib/map/map-tools/index.js → esm2020/lib/map/map-tools/index.mjs} +0 -0
  68. package/esm2020/lib/map/map-tools/map-tools.component.mjs +478 -0
  69. package/esm2020/lib/map/map.module.mjs +141 -0
  70. package/esm2020/lib/map/map.state.mjs +47 -0
  71. package/{esm2015/lib/measure/index.js → esm2020/lib/measure/index.mjs} +0 -0
  72. package/{esm2015/lib/measure/measure.module.js → esm2020/lib/measure/measure.module.mjs} +2 -2
  73. package/{esm2015/lib/measure/measure.state.js → esm2020/lib/measure/measure.state.mjs} +0 -0
  74. package/{esm2015/lib/measure/measurer-tool/measurer-tool.component.js → esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs} +3 -7
  75. package/{esm2015/lib/measure/measurer-tool/measurer-tool.module.js → esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs} +2 -4
  76. package/{esm2015/lib/print/index.js → esm2020/lib/print/index.mjs} +0 -0
  77. package/{esm2015/lib/print/print-tool/index.js → esm2020/lib/print/print-tool/index.mjs} +0 -0
  78. package/{esm2015/lib/print/print-tool/print-tool.component.js → esm2020/lib/print/print-tool/print-tool.component.mjs} +3 -6
  79. package/{esm2015/lib/print/print.module.js → esm2020/lib/print/print.module.mjs} +2 -2
  80. package/{esm2015/lib/search/index.js → esm2020/lib/search/index.mjs} +0 -0
  81. package/{esm2015/lib/search/query.state.js → esm2020/lib/search/query.state.mjs} +0 -0
  82. package/{esm2015/lib/search/search-bar/search-bar-binding.directive.js → esm2020/lib/search/search-bar/search-bar-binding.directive.mjs} +0 -0
  83. package/{esm2015/lib/search/search-bar/search-bar.module.js → esm2020/lib/search/search-bar/search-bar.module.mjs} +2 -2
  84. package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +577 -0
  85. package/{esm2015/lib/search/search-results-tool/search-results-tool.module.js → esm2020/lib/search/search-results-tool/search-results-tool.module.mjs} +13 -15
  86. package/{esm2015/lib/search/search.module.js → esm2020/lib/search/search.module.mjs} +2 -2
  87. package/{esm2015/lib/search/search.state.js → esm2020/lib/search/search.state.mjs} +0 -0
  88. package/{esm2015/lib/storage/index.js → esm2020/lib/storage/index.mjs} +0 -0
  89. package/{esm2015/lib/storage/storage.module.js → esm2020/lib/storage/storage.module.mjs} +2 -2
  90. package/{esm2015/lib/storage/storage.state.js → esm2020/lib/storage/storage.state.mjs} +0 -0
  91. package/{esm2015/lib/tool/index.js → esm2020/lib/tool/index.mjs} +0 -0
  92. package/{esm2015/lib/tool/tool.module.js → esm2020/lib/tool/tool.module.mjs} +2 -2
  93. package/{esm2015/lib/tool/tool.state.js → esm2020/lib/tool/tool.state.mjs} +0 -0
  94. package/{esm2015/lib/workspace/index.js → esm2020/lib/workspace/index.mjs} +0 -0
  95. package/esm2020/lib/workspace/shared/edition-actions.service.mjs +156 -0
  96. package/{esm2015/lib/workspace/shared/feature-actions.service.js → esm2020/lib/workspace/shared/feature-actions.service.mjs} +0 -0
  97. package/{esm2015/lib/workspace/shared/index.js → esm2020/lib/workspace/shared/index.mjs} +0 -0
  98. package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +158 -0
  99. package/{esm2015/lib/workspace/shared/workspace.utils.js → esm2020/lib/workspace/shared/workspace.utils.mjs} +0 -0
  100. package/{esm2015/lib/workspace/workspace-button/index.js → esm2020/lib/workspace/workspace-button/index.mjs} +0 -0
  101. package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +69 -0
  102. package/{esm2015/lib/workspace/workspace.module.js → esm2020/lib/workspace/workspace.module.mjs} +6 -8
  103. package/esm2020/lib/workspace/workspace.state.mjs +188 -0
  104. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  105. package/fesm2015/igo2-integration.mjs +6606 -0
  106. package/fesm2015/igo2-integration.mjs.map +1 -0
  107. package/{fesm2015/igo2-integration.js → fesm2020/igo2-integration.mjs} +336 -565
  108. package/fesm2020/igo2-integration.mjs.map +1 -0
  109. package/{igo2-integration.d.ts → index.d.ts} +0 -0
  110. package/lib/about/about-tool/about-tool.component.d.ts +1 -1
  111. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +1 -1
  112. package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +1 -1
  113. package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +1 -1
  114. package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +1 -1
  115. package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +1 -1
  116. package/lib/context/context-share-tool/context-share-tool.component.d.ts +1 -1
  117. package/lib/directions/directions-tool/directions-tool.component.d.ts +1 -1
  118. package/lib/draw/drawing-tool/drawing-tool.component.d.ts +1 -1
  119. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +1 -1
  120. package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +1 -1
  121. package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +1 -1
  122. package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +3 -1
  123. package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +1 -1
  124. package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +1 -1
  125. package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +1 -1
  126. package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +1 -1
  127. package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +1 -1
  128. package/lib/map/map-details-tool/map-details-tool.component.d.ts +1 -1
  129. package/lib/map/map-legend/map-legend-tool.component.d.ts +1 -1
  130. package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +1 -1
  131. package/lib/map/map-tool/map-tool.component.d.ts +1 -1
  132. package/lib/map/map-tools/map-tools.component.d.ts +1 -1
  133. package/lib/map/map.state.d.ts +3 -2
  134. package/lib/measure/measurer-tool/measurer-tool.component.d.ts +1 -1
  135. package/lib/print/print-tool/print-tool.component.d.ts +1 -1
  136. package/lib/search/search-bar/search-bar-binding.directive.d.ts +1 -1
  137. package/lib/search/search-results-tool/search-results-tool.component.d.ts +1 -1
  138. package/lib/workspace/workspace-button/workspace-button.component.d.ts +1 -1
  139. package/package.json +24 -11
  140. package/bundles/igo2-integration.umd.js +0 -7861
  141. package/bundles/igo2-integration.umd.js.map +0 -1
  142. package/esm2015/lib/about/about-tool/about-tool.component.js +0 -190
  143. package/esm2015/lib/directions/directions.state.js +0 -66
  144. package/esm2015/lib/filter/spatial-filter-tool/spatial-filter-tool.component.js +0 -544
  145. package/esm2015/lib/import-export/import-export-tool/import-export-tool.component.js +0 -145
  146. package/esm2015/lib/map/advanced-map-tool/advanced-map-tool.component.js +0 -99
  147. package/esm2015/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.js +0 -234
  148. package/esm2015/lib/map/map-details-tool/map-details-tool.component.js +0 -274
  149. package/esm2015/lib/map/map-legend/map-legend-tool.component.js +0 -289
  150. package/esm2015/lib/map/map-proximity-tool/map-proximity-tool.component.js +0 -221
  151. package/esm2015/lib/map/map-tool/map-tool.component.js +0 -142
  152. package/esm2015/lib/map/map-tools/map-tools.component.js +0 -496
  153. package/esm2015/lib/map/map.module.js +0 -143
  154. package/esm2015/lib/map/map.state.js +0 -46
  155. package/esm2015/lib/search/search-results-tool/search-results-tool.component.js +0 -598
  156. package/esm2015/lib/workspace/shared/edition-actions.service.js +0 -157
  157. package/esm2015/lib/workspace/shared/wfs-actions.service.js +0 -159
  158. package/esm2015/lib/workspace/workspace-button/workspace-button.component.js +0 -74
  159. package/esm2015/lib/workspace/workspace.state.js +0 -190
  160. package/fesm2015/igo2-integration.js.map +0 -1
@@ -1,544 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
3
- import { forkJoin, Subject } from 'rxjs';
4
- import { tap, take, takeUntil } from 'rxjs/operators';
5
- import { moveToOlFeatures, FeatureMotion, featureToOl, SpatialFilterType, SpatialFilterItemType, createOverlayMarkerStyle, MeasureLengthUnit } from '@igo2/geo';
6
- import { EntityStore, ToolComponent } from '@igo2/common';
7
- import olFormatGeoJSON from 'ol/format/GeoJSON';
8
- import { BehaviorSubject } from 'rxjs';
9
- import { ImportExportMode } from './../../import-export/import-export.state';
10
- import * as olstyle from 'ol/style';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/material/icon";
13
- import * as i2 from "@igo2/geo";
14
- import * as i3 from "../../map/map.state";
15
- import * as i4 from "@igo2/core";
16
- import * as i5 from "./../../import-export/import-export.state";
17
- import * as i6 from "../../tool/tool.state";
18
- import * as i7 from "../../workspace/workspace.state";
19
- import * as i8 from "@angular/common";
20
- function SpatialFilterToolComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementContainerStart(0);
22
- i0.ɵɵelement(1, "igo-feature-details", 3);
23
- i0.ɵɵelementContainerEnd();
24
- } if (rf & 2) {
25
- const feature_r1 = ctx.ngIf;
26
- i0.ɵɵadvance(1);
27
- i0.ɵɵproperty("feature", feature_r1);
28
- } }
29
- /**
30
- * Tool to apply spatial filter
31
- */
32
- let SpatialFilterToolComponent = class SpatialFilterToolComponent {
33
- constructor(matIconRegistry, spatialFilterService, dataSourceService, layerService, mapState, messageService, languageService, importExportState, toolState, workspaceState, cdRef) {
34
- this.matIconRegistry = matIconRegistry;
35
- this.spatialFilterService = spatialFilterService;
36
- this.dataSourceService = dataSourceService;
37
- this.layerService = layerService;
38
- this.mapState = mapState;
39
- this.messageService = messageService;
40
- this.languageService = languageService;
41
- this.importExportState = importExportState;
42
- this.toolState = toolState;
43
- this.workspaceState = workspaceState;
44
- this.cdRef = cdRef;
45
- this.itemType = SpatialFilterItemType.Address;
46
- this.layers = [];
47
- this.activeLayers = [];
48
- this.buffer = 0;
49
- this.iterator = 1;
50
- this.selectedFeature$ = new BehaviorSubject(undefined);
51
- this.format = new olFormatGeoJSON();
52
- this.store = new EntityStore([]); // Store to print results at the end
53
- this.spatialListStore = new EntityStore([]);
54
- this.loading = false;
55
- this.thematicLength = 0;
56
- this.measureUnit = MeasureLengthUnit.Meters;
57
- this.unsubscribe$ = new Subject();
58
- }
59
- get map() {
60
- return this.mapState.map;
61
- }
62
- ngOnInit() {
63
- for (const layer of this.map.layers) {
64
- if (layer.title && layer.title.includes(this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'))) {
65
- this.layers.push(layer);
66
- }
67
- }
68
- }
69
- ngOnDestroy() {
70
- this.unsubscribe$.next();
71
- this.unsubscribe$.complete();
72
- }
73
- getOutputType(event) {
74
- this.type = event;
75
- this.queryType = undefined;
76
- }
77
- getOutputQueryType(event) {
78
- this.queryType = event;
79
- if (this.queryType) {
80
- this.loadFilterList();
81
- }
82
- }
83
- activateExportTool() {
84
- const ids = [];
85
- const re = new RegExp('^Zone \\d+');
86
- for (const layer of this.layers) {
87
- if (!layer.title.match(re)) {
88
- ids.push(layer.id);
89
- }
90
- }
91
- this.importExportState.setMode(ImportExportMode.export);
92
- this.importExportState.setsExportOptions({ layers: ids });
93
- this.toolState.toolbox.activateTool('importExport');
94
- }
95
- activateWorkspace(record) {
96
- let layerToOpenWks;
97
- this.workspaceState.store.entities$.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
98
- if (!record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
99
- if (this.itemType === SpatialFilterItemType.Thematics) {
100
- for (const thematic of this.thematics) {
101
- if (!thematic.zeroResults) {
102
- layerToOpenWks = this.activeLayers.find(layer => layer.title.includes(thematic.name + ' ' + this.iterator.toString()));
103
- break;
104
- }
105
- }
106
- }
107
- else {
108
- const title = 'Adresses ' + this.iterator.toString();
109
- this.activeLayers.forEach((layer) => {
110
- if (layer.title.includes(title)) {
111
- layerToOpenWks = layer;
112
- }
113
- });
114
- }
115
- if (layerToOpenWks) {
116
- this.workspaceState.workspacePanelExpanded = true;
117
- this.workspaceState.setActiveWorkspaceById(layerToOpenWks.id);
118
- }
119
- }
120
- else if (record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
121
- this.selectWorkspaceEntity(record);
122
- this.moveendKey = this.map.ol.on('moveend', () => {
123
- this.selectWorkspaceEntity(record);
124
- });
125
- }
126
- });
127
- }
128
- selectWorkspaceEntity(record) {
129
- this.workspaceState.store.all().forEach(workspace => {
130
- workspace.entityStore.state.updateAll({ selected: false });
131
- if (workspace.title.includes(record.added[0].meta.title)) {
132
- this.workspaceState.setActiveWorkspaceById(workspace.id);
133
- workspace.entityStore.state.updateMany(record.added, { selected: true });
134
- }
135
- });
136
- }
137
- loadFilterList() {
138
- this.spatialFilterService
139
- .loadFilterList(this.queryType)
140
- .pipe(takeUntil(this.unsubscribe$))
141
- .subscribe((features) => {
142
- features.sort((a, b) => {
143
- if (a.properties.nom < b.properties.nom) {
144
- return -1;
145
- }
146
- if (a.properties.nom > b.properties.nom) {
147
- return 1;
148
- }
149
- return 0;
150
- });
151
- this.spatialListStore.clear();
152
- this.spatialListStore.load(features);
153
- });
154
- }
155
- getOutputToggleSearch() {
156
- this.loadThematics();
157
- }
158
- getOutputClearSearch() {
159
- this.zone = undefined;
160
- this.queryType = undefined;
161
- }
162
- clearMap() {
163
- this.map.removeLayers(this.layers);
164
- this.layers = [];
165
- this.activeLayers = [];
166
- this.thematicLength = 0;
167
- this.iterator = 1;
168
- if (this.type === SpatialFilterType.Predefined) {
169
- this.zone = undefined;
170
- this.queryType = undefined;
171
- }
172
- }
173
- loadThematics() {
174
- this.loading = true;
175
- let zeroResults = true;
176
- let thematics;
177
- if (this.buffer === 0 || this.type === SpatialFilterType.Point) {
178
- this.tryAddFeaturesToMap([this.zone]);
179
- }
180
- if (this.itemType !== SpatialFilterItemType.Thematics) {
181
- const theme = {
182
- name: ''
183
- };
184
- thematics = [theme];
185
- }
186
- else {
187
- thematics = this.thematics;
188
- }
189
- if (this.measureUnit === MeasureLengthUnit.Kilometers && this.type !== SpatialFilterType.Point) {
190
- this.buffer = this.buffer * 1000;
191
- }
192
- if (this.type === SpatialFilterType.Polygon) {
193
- this.buffer = 0; // to avoid buffer enter a second time in terrAPI
194
- }
195
- const observables$ = [];
196
- thematics.forEach(thematic => {
197
- observables$.push(this.spatialFilterService
198
- .loadFilterItem(this.zone, this.itemType, this.queryType, thematic, this.buffer)
199
- .pipe(tap((features) => {
200
- this.store.insertMany(features);
201
- const featuresPoint = [];
202
- const featuresLinePoly = [];
203
- let idPoint;
204
- let idLinePoly;
205
- features.forEach(feature => {
206
- if (feature.geometry.type === 'Point') {
207
- feature.properties.longitude = feature.geometry.coordinates[0];
208
- feature.properties.latitude = feature.geometry.coordinates[1];
209
- featuresPoint.push(feature);
210
- idPoint = feature.meta.id;
211
- }
212
- else {
213
- featuresLinePoly.push(feature);
214
- idLinePoly = feature.meta.id;
215
- }
216
- });
217
- this.tryAddPointToMap(featuresPoint, idPoint);
218
- this.tryAddLayerToMap(featuresLinePoly, idLinePoly);
219
- if (features.length) {
220
- zeroResults = false;
221
- this.thematicLength += 1;
222
- thematic.zeroResults = false;
223
- this.cdRef.detectChanges();
224
- }
225
- else {
226
- thematic.zeroResults = true;
227
- }
228
- if (features.length >= 10000) {
229
- this.messageService.alert(this.languageService.translate.instant('igo.geo.spatialFilter.maxSizeAlert'), this.languageService.translate.instant('igo.geo.spatialFilter.warning'), { timeOut: 10000 });
230
- }
231
- })));
232
- });
233
- forkJoin(observables$).pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
234
- this.loading = false;
235
- if (zeroResults) {
236
- this.messageService.alert(this.languageService.translate.instant('igo.geo.spatialFilter.zeroResults'), this.languageService.translate.instant('igo.geo.spatialFilter.warning'), { timeOut: 10000 });
237
- }
238
- });
239
- }
240
- onZoneChange(feature, buffer) {
241
- this.zone = feature;
242
- if (feature) {
243
- buffer ? this.tryAddFeaturesToMap([feature], true) : this.tryAddFeaturesToMap([feature]);
244
- this.zoomToFeatureExtent(feature);
245
- }
246
- }
247
- /**
248
- * Try to add zone feature to the map overlay
249
- */
250
- tryAddFeaturesToMap(features, buffer) {
251
- var _a, _b, _c, _d;
252
- let i = 1;
253
- for (const feature of features) {
254
- if (this.type === SpatialFilterType.Predefined) {
255
- for (const layer of this.layers) {
256
- if (layer.options._internal &&
257
- layer.options._internal.code === feature.properties.code &&
258
- !buffer) {
259
- if (!((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith('Zone'))) {
260
- const index = this.layers.indexOf(layer);
261
- this.layers.splice(index, 1);
262
- }
263
- return;
264
- }
265
- if ((_b = layer.title) === null || _b === void 0 ? void 0 : _b.startsWith('Zone')) {
266
- this.activeLayers = [];
267
- const index = this.layers.indexOf(layer);
268
- this.layers.splice(index, 1);
269
- this.map.removeLayer(layer);
270
- }
271
- }
272
- }
273
- else {
274
- if (buffer) {
275
- for (const layer of this.activeLayers) {
276
- if (this.activeLayers.length === 1 && ((_c = layer.title) === null || _c === void 0 ? void 0 : _c.startsWith('Zone'))) {
277
- const index = this.layers.indexOf(layer);
278
- this.layers.splice(index, 1);
279
- this.map.removeLayer(layer);
280
- }
281
- }
282
- }
283
- this.activeLayers = [];
284
- }
285
- for (const layer of this.layers) {
286
- if ((_d = layer.title) === null || _d === void 0 ? void 0 : _d.startsWith('Zone')) {
287
- i++;
288
- }
289
- }
290
- this.dataSourceService
291
- .createAsyncDataSource({
292
- type: 'vector',
293
- queryable: true
294
- })
295
- .pipe(take(1))
296
- .subscribe((dataSource) => {
297
- const olLayer = this.layerService.createLayer({
298
- isIgoInternalLayer: true,
299
- title: ('Zone ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
300
- workspace: { enabled: true },
301
- _internal: {
302
- code: this.type === SpatialFilterType.Predefined
303
- ? feature.properties.code
304
- : undefined
305
- },
306
- source: dataSource,
307
- visible: true,
308
- style: (_feature, resolution) => {
309
- const coordinates = features[0].coordinates;
310
- return new olstyle.Style({
311
- image: new olstyle.Circle({
312
- radius: coordinates
313
- ? this.buffer /
314
- Math.cos((Math.PI / 180) * coordinates[1]) /
315
- resolution
316
- : undefined,
317
- fill: new olstyle.Fill({
318
- color: 'rgba(200, 200, 20, 0.2)'
319
- }),
320
- stroke: new olstyle.Stroke({
321
- width: 1,
322
- color: 'orange'
323
- })
324
- }),
325
- stroke: new olstyle.Stroke({
326
- width: 1,
327
- color: 'orange'
328
- }),
329
- fill: new olstyle.Fill({
330
- color: 'rgba(200, 200, 20, 0.2)'
331
- })
332
- });
333
- }
334
- });
335
- const featuresOl = features.map(f => {
336
- return featureToOl(f, this.map.projection);
337
- });
338
- if (this.type !== SpatialFilterType.Predefined) {
339
- const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
340
- featuresOl[0].set('nom', 'Zone', true);
341
- featuresOl[0].set('type', type, true);
342
- }
343
- const ol = dataSource.ol;
344
- ol.addFeatures(featuresOl);
345
- this.map.addLayer(olLayer);
346
- this.layers.push(olLayer);
347
- this.activeLayers.push(olLayer);
348
- this.cdRef.detectChanges();
349
- });
350
- }
351
- }
352
- /**
353
- * Try to add point features to the map
354
- * Necessary to create clusters
355
- */
356
- tryAddPointToMap(features, id) {
357
- var _a;
358
- let i = 1;
359
- if (features.length) {
360
- if (this.map === undefined) {
361
- return;
362
- }
363
- for (const layer of this.layers) {
364
- if ((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith(features[0].meta.title)) {
365
- i++;
366
- }
367
- }
368
- this.dataSourceService
369
- .createAsyncDataSource({
370
- type: 'cluster',
371
- id,
372
- queryable: true,
373
- distance: 120,
374
- meta: {
375
- title: 'Cluster'
376
- }
377
- })
378
- .pipe(take(1))
379
- .subscribe((dataSource) => {
380
- const icon = features[0].meta.icon;
381
- let style;
382
- if (!icon) {
383
- style = createOverlayMarkerStyle();
384
- }
385
- else {
386
- style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
387
- }
388
- const olLayer = this.layerService.createLayer({
389
- isIgoInternalLayer: true,
390
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
391
- source: dataSource,
392
- visible: true,
393
- style
394
- });
395
- const featuresOl = features.map(feature => {
396
- return featureToOl(feature, this.map.projection);
397
- });
398
- const ol = dataSource.ol;
399
- ol.getSource().addFeatures(featuresOl);
400
- if (this.layers.find(layer => layer.id === olLayer.id)) {
401
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
402
- i = i - 1;
403
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
404
- olLayer.options.title = olLayer.title;
405
- }
406
- this.iterator = i;
407
- this.map.addLayer(olLayer);
408
- this.layers.push(olLayer);
409
- this.pushLayer(olLayer);
410
- this.cdRef.detectChanges();
411
- });
412
- }
413
- }
414
- createSvgIcon(icon) {
415
- let style;
416
- this.matIconRegistry.getNamedSvgIcon(icon).subscribe(svgObj => {
417
- const xmlSerializer = new XMLSerializer();
418
- svgObj.setAttribute('width', '30');
419
- svgObj.setAttribute('height', '30');
420
- svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
421
- svgObj.setAttribute('stroke', 'white');
422
- const svg = xmlSerializer.serializeToString(svgObj);
423
- style = new olstyle.Style({
424
- image: new olstyle.Icon({
425
- src: 'data:image/svg+xml;utf8,' + svg
426
- })
427
- });
428
- });
429
- return style;
430
- }
431
- /**
432
- * Try to add line or polygon features to the map
433
- */
434
- tryAddLayerToMap(features, id) {
435
- var _a;
436
- let i = 1;
437
- if (features.length) {
438
- if (this.map === undefined) {
439
- return;
440
- }
441
- for (const layer of this.layers) {
442
- if ((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith(features[0].meta.title)) {
443
- i++;
444
- }
445
- }
446
- this.dataSourceService
447
- .createAsyncDataSource({
448
- type: 'vector',
449
- id,
450
- queryable: true
451
- })
452
- .pipe(take(1))
453
- .subscribe((dataSource) => {
454
- const olLayer = this.layerService.createLayer({
455
- isIgoInternalLayer: true,
456
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
457
- source: dataSource,
458
- visible: true
459
- });
460
- const featuresOl = features.map(feature => {
461
- return featureToOl(feature, this.map.projection);
462
- });
463
- const ol = dataSource.ol;
464
- ol.addFeatures(featuresOl);
465
- if (this.layers.find(layer => layer.id === olLayer.id)) {
466
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
467
- i = i - 1;
468
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
469
- olLayer.options.title = olLayer.title;
470
- }
471
- this.map.addLayer(olLayer);
472
- this.layers.push(olLayer);
473
- this.pushLayer(olLayer);
474
- this.cdRef.detectChanges();
475
- });
476
- }
477
- }
478
- zoomToFeatureExtent(feature) {
479
- if (feature) {
480
- const olFeature = this.format.readFeature(feature, {
481
- dataProjection: feature.projection,
482
- featureProjection: this.map.projection
483
- });
484
- moveToOlFeatures(this.map, [olFeature], FeatureMotion.Zoom);
485
- }
486
- }
487
- pushLayer(layer) {
488
- for (const lay of this.activeLayers) {
489
- if (lay.id === layer.id) {
490
- return;
491
- }
492
- }
493
- this.activeLayers.push(layer);
494
- }
495
- };
496
- SpatialFilterToolComponent.ɵfac = function SpatialFilterToolComponent_Factory(t) { return new (t || SpatialFilterToolComponent)(i0.ɵɵdirectiveInject(i1.MatIconRegistry), i0.ɵɵdirectiveInject(i2.SpatialFilterService), i0.ɵɵdirectiveInject(i2.DataSourceService), i0.ɵɵdirectiveInject(i2.LayerService), i0.ɵɵdirectiveInject(i3.MapState), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ImportExportState), i0.ɵɵdirectiveInject(i6.ToolState), i0.ɵɵdirectiveInject(i7.WorkspaceState), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
497
- SpatialFilterToolComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpatialFilterToolComponent, selectors: [["igo-spatial-filter-tool"]], inputs: { type: "type", itemType: "itemType", freehandDrawIsActive: "freehandDrawIsActive" }, decls: 6, vars: 16, consts: [[3, "store", "selectedQueryType", "zone", "layers", "eventType", "eventQueryType", "zoneChange", "zoneWithBufferChange", "bufferChange", "measureUnitChange"], [3, "type", "queryType", "map", "zone", "loading", "store", "layers", "allLayers", "thematicLength", "radiusEvent", "bufferEvent", "measureUnitChange", "freehandControl", "drawZoneEvent", "zoneWithBufferChange", "itemTypeChange", "thematicChange", "toggleSearch", "clearButtonEvent", "clearSearchEvent", "export", "openWorkspace", "entityChange"], [4, "ngIf"], [3, "feature"]], template: function SpatialFilterToolComponent_Template(rf, ctx) { if (rf & 1) {
498
- i0.ɵɵelementStart(0, "igo-panel");
499
- i0.ɵɵelementStart(1, "igo-spatial-filter-type", 0);
500
- i0.ɵɵlistener("eventType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventType_1_listener($event) { return ctx.getOutputType($event); })("eventQueryType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventQueryType_1_listener($event) { return ctx.getOutputQueryType($event); })("zoneChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneChange_1_listener($event) { return ctx.onZoneChange($event); })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneWithBufferChange_1_listener($event) { return ctx.onZoneChange($event, true); })("bufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_bufferChange_1_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_measureUnitChange_1_listener($event) { return ctx.measureUnit = $event; });
501
- i0.ɵɵelementEnd();
502
- i0.ɵɵelementStart(2, "igo-spatial-filter-item", 1);
503
- i0.ɵɵlistener("radiusEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_radiusEvent_2_listener($event) { return ctx.buffer = $event; })("bufferEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_bufferEvent_2_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_measureUnitChange_2_listener($event) { return ctx.measureUnit = $event; })("freehandControl", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_freehandControl_2_listener($event) { return ctx.freehandDrawIsActive = $event; })("drawZoneEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_drawZoneEvent_2_listener($event) { return ctx.zone = $event; })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_zoneWithBufferChange_2_listener($event) { return ctx.onZoneChange($event, true); })("itemTypeChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_itemTypeChange_2_listener($event) { return ctx.itemType = $event; })("thematicChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_thematicChange_2_listener($event) { return ctx.thematics = $event; })("toggleSearch", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_toggleSearch_2_listener() { return ctx.getOutputToggleSearch(); })("clearButtonEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearButtonEvent_2_listener() { return ctx.clearMap(); })("clearSearchEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearSearchEvent_2_listener() { return ctx.getOutputClearSearch(); })("export", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_export_2_listener() { return ctx.activateExportTool(); })("openWorkspace", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_openWorkspace_2_listener() { return ctx.activateWorkspace(); })("entityChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_entityChange_2_listener($event) { return ctx.activateWorkspace($event); });
504
- i0.ɵɵelementEnd();
505
- i0.ɵɵelementEnd();
506
- i0.ɵɵelementStart(3, "igo-panel");
507
- i0.ɵɵtemplate(4, SpatialFilterToolComponent_ng_container_4_Template, 2, 1, "ng-container", 2);
508
- i0.ɵɵpipe(5, "async");
509
- i0.ɵɵelementEnd();
510
- } if (rf & 2) {
511
- i0.ɵɵadvance(1);
512
- i0.ɵɵproperty("store", ctx.spatialListStore)("selectedQueryType", ctx.queryType)("zone", ctx.zone)("layers", ctx.activeLayers);
513
- i0.ɵɵadvance(1);
514
- i0.ɵɵproperty("type", ctx.type)("queryType", ctx.queryType)("map", ctx.map)("zone", ctx.zone)("loading", ctx.loading)("store", ctx.store)("layers", ctx.activeLayers)("allLayers", ctx.layers)("thematicLength", ctx.thematicLength);
515
- i0.ɵɵadvance(2);
516
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(5, 14, ctx.selectedFeature$));
517
- } }, directives: [i2.SpatialFilterTypeComponent, i2.SpatialFilterItemComponent, i8.NgIf], pipes: [i8.AsyncPipe], styles: [""], changeDetection: 0 });
518
- SpatialFilterToolComponent = __decorate([
519
- ToolComponent({
520
- name: 'spatialFilter',
521
- title: 'igo.integration.tools.spatialFilter',
522
- icon: 'selection-marker'
523
- })
524
- /**
525
- * Spatial Filter Type
526
- */
527
- ], SpatialFilterToolComponent);
528
- export { SpatialFilterToolComponent };
529
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpatialFilterToolComponent, [{
530
- type: Component,
531
- args: [{
532
- selector: 'igo-spatial-filter-tool',
533
- templateUrl: './spatial-filter-tool.component.html',
534
- styleUrls: ['./spatial-filter-tool.component.scss'],
535
- changeDetection: ChangeDetectionStrategy.OnPush
536
- }]
537
- }], function () { return [{ type: i1.MatIconRegistry }, { type: i2.SpatialFilterService }, { type: i2.DataSourceService }, { type: i2.LayerService }, { type: i3.MapState }, { type: i4.MessageService }, { type: i4.LanguageService }, { type: i5.ImportExportState }, { type: i6.ToolState }, { type: i7.WorkspaceState }, { type: i0.ChangeDetectorRef }]; }, { type: [{
538
- type: Input
539
- }], itemType: [{
540
- type: Input
541
- }], freehandDrawIsActive: [{
542
- type: Input
543
- }] }); })();
544
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFjLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsV0FBVyxFQUlYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFJckIsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUNsQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoRyxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7SUNRbEMsNkJBQTBEO0lBQ3hELHlDQUErRDtJQUNqRSwwQkFBZTs7O0lBRFEsZUFBbUI7SUFBbkIsb0NBQW1C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LHlCQUFBLHNDQUFBO1FBMkJBLGVBQStCO1FBQS9CLGtFQUErQjs7QURlbkMsMEJBQTBCO0lBZHRDLGFBQWEsQ0FBQztRQUNiLElBQUksRUFBRSxlQUFlO1FBQ3JCLEtBQUssRUFBRSxxQ0FBcUM7UUFDNUMsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0lBQ0Y7O09BRUc7R0FPVSwwQkFBMEIsQ0FnaUJ0QztTQWhpQlksMEJBQTBCO3VGQUExQiwwQkFBMEI7Y0FOdEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFdBQVcsRUFBRSxzQ0FBc0M7Z0JBQ25ELFNBQVMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2dCQUNuRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDt1V0FNVSxJQUFJO2tCQUFaLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csb0JBQW9CO2tCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIElnb01hcCxcclxuICBEYXRhU291cmNlU2VydmljZSxcclxuICBMYXllclNlcnZpY2UsXHJcbiAgRmVhdHVyZSxcclxuICBtb3ZlVG9PbEZlYXR1cmVzLFxyXG4gIEZlYXR1cmVNb3Rpb24sXHJcbiAgQ2x1c3RlckRhdGFTb3VyY2UsXHJcbiAgZmVhdHVyZVRvT2wsXHJcbiAgRGF0YVNvdXJjZSxcclxuICBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyxcclxuICBTcGF0aWFsRmlsdGVyU2VydmljZSxcclxuICBTcGF0aWFsRmlsdGVyVHlwZSxcclxuICBTcGF0aWFsRmlsdGVySXRlbVR5cGUsXHJcbiAgU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZSxcclxuICBTcGF0aWFsRmlsdGVyVGhlbWF0aWMsXHJcbiAgTGF5ZXIsXHJcbiAgY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlLFxyXG4gIEV4cG9ydE9wdGlvbnMsXHJcbiAgTWVhc3VyZUxlbmd0aFVuaXRcclxufSBmcm9tICdAaWdvMi9nZW8nO1xyXG5pbXBvcnQgeyBFbnRpdHlTdG9yZSwgVG9vbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XHJcbmltcG9ydCBvbEZvcm1hdEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xyXG5pbXBvcnQgb2xTb3VyY2VWZWN0b3IgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCBvbFNvdXJjZUNsdXN0ZXIgZnJvbSAnb2wvc291cmNlL0NsdXN0ZXInO1xyXG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWFwU3RhdGUgfSBmcm9tICcuLi8uLi9tYXAvbWFwLnN0YXRlJztcclxuaW1wb3J0IHsgSW1wb3J0RXhwb3J0TW9kZSwgSW1wb3J0RXhwb3J0U3RhdGUgfSBmcm9tICcuLy4uLy4uL2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5zdGF0ZSc7XHJcbmltcG9ydCAqIGFzIG9sc3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XHJcbmltcG9ydCB7IFRvb2xTdGF0ZSB9IGZyb20gJy4uLy4uL3Rvb2wvdG9vbC5zdGF0ZSc7XHJcbmltcG9ydCB7IFdvcmtzcGFjZVN0YXRlIH0gZnJvbSAnLi4vLi4vd29ya3NwYWNlL3dvcmtzcGFjZS5zdGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XHJcblxyXG4vKipcclxuICogVG9vbCB0byBhcHBseSBzcGF0aWFsIGZpbHRlclxyXG4gKi9cclxuQFRvb2xDb21wb25lbnQoe1xyXG4gIG5hbWU6ICdzcGF0aWFsRmlsdGVyJyxcclxuICB0aXRsZTogJ2lnby5pbnRlZ3JhdGlvbi50b29scy5zcGF0aWFsRmlsdGVyJyxcclxuICBpY29uOiAnc2VsZWN0aW9uLW1hcmtlcidcclxufSlcclxuLyoqXHJcbiAqIFNwYXRpYWwgRmlsdGVyIFR5cGVcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWdvLXNwYXRpYWwtZmlsdGVyLXRvb2wnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwYXRpYWxGaWx0ZXJUb29sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcclxuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xyXG4gIEBJbnB1dCgpIGl0ZW1UeXBlOiBTcGF0aWFsRmlsdGVySXRlbVR5cGUgPSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcztcclxuICBASW5wdXQoKSBmcmVlaGFuZERyYXdJc0FjdGl2ZTogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIGxheWVyczogTGF5ZXJbXSA9IFtdO1xyXG4gIHB1YmxpYyBhY3RpdmVMYXllcnM6IExheWVyW10gPSBbXTtcclxuXHJcbiAgcHVibGljIHF1ZXJ5VHlwZTogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZTtcclxuICBwdWJsaWMgdGhlbWF0aWNzOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXTtcclxuICBwdWJsaWMgem9uZTogRmVhdHVyZTtcclxuICBwdWJsaWMgem9uZVdpdGhCdWZmZXI6IEZlYXR1cmU7XHJcbiAgcHVibGljIGJ1ZmZlciA9IDA7XHJcblxyXG4gIHB1YmxpYyBpdGVyYXRvciA9IDE7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmUkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxyXG4gICAgdW5kZWZpbmVkXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXQgPSBuZXcgb2xGb3JtYXRHZW9KU09OKCk7XHJcblxyXG4gIHB1YmxpYyBzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pOyAvLyBTdG9yZSB0byBwcmludCByZXN1bHRzIGF0IHRoZSBlbmRcclxuXHJcbiAgcHVibGljIHNwYXRpYWxMaXN0U3RvcmU6IEVudGl0eVN0b3JlPEZlYXR1cmU+ID0gbmV3IEVudGl0eVN0b3JlPEZlYXR1cmU+KFtdKTtcclxuXHJcbiAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHRoZW1hdGljTGVuZ3RoID0gMDtcclxuXHJcbiAgcHVibGljIG1lYXN1cmVVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycztcclxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgbW92ZWVuZEtleTogRXZlbnRzS2V5O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbWF0SWNvblJlZ2lzdHJ5OiBNYXRJY29uUmVnaXN0cnksXHJcbiAgICBwcml2YXRlIHNwYXRpYWxGaWx0ZXJTZXJ2aWNlOiBTcGF0aWFsRmlsdGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNvdXJjZVNlcnZpY2U6IERhdGFTb3VyY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYXllclNlcnZpY2U6IExheWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgbWFwU3RhdGU6IE1hcFN0YXRlLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpbXBvcnRFeHBvcnRTdGF0ZTogSW1wb3J0RXhwb3J0U3RhdGUsXHJcbiAgICBwcml2YXRlIHRvb2xTdGF0ZTogVG9vbFN0YXRlLFxyXG4gICAgcHJpdmF0ZSB3b3Jrc3BhY2VTdGF0ZTogV29ya3NwYWNlU3RhdGUsXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubWFwLmxheWVycykge1xyXG4gICAgICBpZiAobGF5ZXIudGl0bGUgJiYgbGF5ZXIudGl0bGUuaW5jbHVkZXModGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJykpKSB7XHJcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGdldE91dHB1dFR5cGUoZXZlbnQ6IFNwYXRpYWxGaWx0ZXJUeXBlKSB7XHJcbiAgICB0aGlzLnR5cGUgPSBldmVudDtcclxuICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3V0cHV0UXVlcnlUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyUXVlcnlUeXBlKSB7XHJcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGV2ZW50O1xyXG4gICAgaWYgKHRoaXMucXVlcnlUeXBlKSB7XHJcbiAgICAgIHRoaXMubG9hZEZpbHRlckxpc3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGl2YXRlRXhwb3J0VG9vbCgpIHtcclxuICAgIGNvbnN0IGlkcyA9IFtdO1xyXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeWm9uZSBcXFxcZCsnKTtcclxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgaWYgKCFsYXllci50aXRsZS5tYXRjaChyZSkpIHtcclxuICAgICAgICBpZHMucHVzaChsYXllci5pZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaW1wb3J0RXhwb3J0U3RhdGUuc2V0TW9kZShJbXBvcnRFeHBvcnRNb2RlLmV4cG9ydCk7XHJcbiAgICB0aGlzLmltcG9ydEV4cG9ydFN0YXRlLnNldHNFeHBvcnRPcHRpb25zKHsgbGF5ZXJzOiBpZHMgfSBhcyBFeHBvcnRPcHRpb25zKTtcclxuICAgIHRoaXMudG9vbFN0YXRlLnRvb2xib3guYWN0aXZhdGVUb29sKCdpbXBvcnRFeHBvcnQnKTtcclxuICB9XHJcblxyXG4gIGFjdGl2YXRlV29ya3NwYWNlKHJlY29yZD8pIHtcclxuICAgIGxldCBsYXllclRvT3BlbldrcztcclxuICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuZW50aXRpZXMkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKCFyZWNvcmQgJiYgdGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoICYmIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy50aGVtYXRpY3MpIHtcclxuICAgICAgICAgICAgICBpZiAoIXRoZW1hdGljLnplcm9SZXN1bHRzKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IHRoaXMuYWN0aXZlTGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudGl0bGUuaW5jbHVkZXModGhlbWF0aWMubmFtZSArICcgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gJ0FkcmVzc2VzICcgKyB0aGlzLml0ZXJhdG9yLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGxheWVyLnRpdGxlLmluY2x1ZGVzKHRpdGxlKSkge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXJUb09wZW5Xa3MgPSBsYXllcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxheWVyVG9PcGVuV2tzKSB7XHJcbiAgICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLndvcmtzcGFjZVBhbmVsRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zZXRBY3RpdmVXb3Jrc3BhY2VCeUlkKGxheWVyVG9PcGVuV2tzLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkICYmIHRoaXMuYWN0aXZlTGF5ZXJzLmxlbmd0aCAmJiB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmFsbCgpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xyXG4gICAgICAgIHRoaXMubW92ZWVuZEtleSA9IHRoaXMubWFwLm9sLm9uKCdtb3ZlZW5kJywgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RXb3Jrc3BhY2VFbnRpdHkocmVjb3JkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpIHtcclxuICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkuZm9yRWFjaCh3b3Jrc3BhY2UgPT4ge1xyXG4gICAgICB3b3Jrc3BhY2UuZW50aXR5U3RvcmUuc3RhdGUudXBkYXRlQWxsKHtzZWxlY3RlZDogZmFsc2V9KTtcclxuICAgICAgaWYgKHdvcmtzcGFjZS50aXRsZS5pbmNsdWRlcyhyZWNvcmQuYWRkZWRbMF0ubWV0YS50aXRsZSkpIHtcclxuICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQod29ya3NwYWNlLmlkKTtcclxuICAgICAgICB3b3Jrc3BhY2UuZW50aXR5U3RvcmUuc3RhdGUudXBkYXRlTWFueShyZWNvcmQuYWRkZWQsIHtzZWxlY3RlZDogdHJ1ZX0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEZpbHRlckxpc3QoKSB7XHJcbiAgICB0aGlzLnNwYXRpYWxGaWx0ZXJTZXJ2aWNlXHJcbiAgICAgIC5sb2FkRmlsdGVyTGlzdCh0aGlzLnF1ZXJ5VHlwZSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZmVhdHVyZXM6IEZlYXR1cmVbXSkgPT4ge1xyXG4gICAgICAgIGZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmIChhLnByb3BlcnRpZXMubm9tIDwgYi5wcm9wZXJ0aWVzLm5vbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoYS5wcm9wZXJ0aWVzLm5vbSA+IGIucHJvcGVydGllcy5ub20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNwYXRpYWxMaXN0U3RvcmUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLnNwYXRpYWxMaXN0U3RvcmUubG9hZChmZWF0dXJlcyk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3V0cHV0VG9nZ2xlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWF0aWNzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRPdXRwdXRDbGVhclNlYXJjaCgpIHtcclxuICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJNYXAoKSB7XHJcbiAgICB0aGlzLm1hcC5yZW1vdmVMYXllcnModGhpcy5sYXllcnMpO1xyXG4gICAgdGhpcy5sYXllcnMgPSBbXTtcclxuICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XHJcbiAgICB0aGlzLnRoZW1hdGljTGVuZ3RoID0gMDtcclxuICAgIHRoaXMuaXRlcmF0b3IgPSAxO1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnpvbmUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkVGhlbWF0aWNzKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCB6ZXJvUmVzdWx0cyA9IHRydWU7XHJcbiAgICBsZXQgdGhlbWF0aWNzO1xyXG4gICAgaWYgKHRoaXMuYnVmZmVyID09PSAwIHx8IHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcclxuICAgICAgdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFt0aGlzLnpvbmVdKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLml0ZW1UeXBlICE9PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XHJcbiAgICAgIGNvbnN0IHRoZW1lOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgPSB7XHJcbiAgICAgICAgbmFtZTogJydcclxuICAgICAgfTtcclxuICAgICAgdGhlbWF0aWNzID0gW3RoZW1lXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoZW1hdGljcyA9IHRoaXMudGhlbWF0aWNzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiYgdGhpcy50eXBlICE9PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCkge1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyICogMTAwMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb24pIHtcclxuICAgICAgdGhpcy5idWZmZXIgPSAwOyAvLyB0byBhdm9pZCBidWZmZXIgZW50ZXIgYSBzZWNvbmQgdGltZSBpbiB0ZXJyQVBJXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2JzZXJ2YWJsZXMkOiBPYnNlcnZhYmxlPEZlYXR1cmVbXT5bXSA9IFtdO1xyXG4gICAgdGhlbWF0aWNzLmZvckVhY2godGhlbWF0aWMgPT4ge1xyXG4gICAgICBvYnNlcnZhYmxlcyQucHVzaChcclxuICAgICAgICB0aGlzLnNwYXRpYWxGaWx0ZXJTZXJ2aWNlXHJcbiAgICAgICAgICAubG9hZEZpbHRlckl0ZW0oXHJcbiAgICAgICAgICAgIHRoaXMuem9uZSxcclxuICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSxcclxuICAgICAgICAgICAgdGhpcy5xdWVyeVR5cGUsXHJcbiAgICAgICAgICAgIHRoZW1hdGljLFxyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgoZmVhdHVyZXM6IEZlYXR1cmVbXSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RvcmUuaW5zZXJ0TWFueShmZWF0dXJlcyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXNQb2ludDogRmVhdHVyZVtdID0gW107XHJcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXNMaW5lUG9seTogRmVhdHVyZVtdID0gW107XHJcbiAgICAgICAgICAgICAgbGV0IGlkUG9pbnQ7XHJcbiAgICAgICAgICAgICAgbGV0IGlkTGluZVBvbHk7XHJcbiAgICAgICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcclxuICAgICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmxvbmdpdHVkZSA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XHJcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5sYXRpdHVkZSA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV07XHJcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzUG9pbnQucHVzaChmZWF0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgaWRQb2ludCA9IGZlYXR1cmUubWV0YS5pZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzTGluZVBvbHkucHVzaChmZWF0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgaWRMaW5lUG9seSA9IGZlYXR1cmUubWV0YS5pZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy50cnlBZGRQb2ludFRvTWFwKGZlYXR1cmVzUG9pbnQsIGlkUG9pbnQpO1xyXG4gICAgICAgICAgICAgIHRoaXMudHJ5QWRkTGF5ZXJUb01hcChmZWF0dXJlc0xpbmVQb2x5LCBpZExpbmVQb2x5KTtcclxuICAgICAgICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB6ZXJvUmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY0xlbmd0aCArPSAxO1xyXG4gICAgICAgICAgICAgICAgdGhlbWF0aWMuemVyb1Jlc3VsdHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGVtYXRpYy56ZXJvUmVzdWx0cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoID49IDEwMDAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLm1heFNpemVBbGVydCdcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci53YXJuaW5nJ1xyXG4gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICB7IHRpbWVPdXQ6IDEwMDAwIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMkKS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAoemVyb1Jlc3VsdHMpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxyXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuemVyb1Jlc3VsdHMnXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIud2FybmluZydcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICB7IHRpbWVPdXQ6IDEwMDAwIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uWm9uZUNoYW5nZShmZWF0dXJlOiBGZWF0dXJlLCBidWZmZXI/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnpvbmUgPSBmZWF0dXJlO1xyXG4gICAgaWYgKGZlYXR1cmUpIHtcclxuICAgICAgYnVmZmVyID8gdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFtmZWF0dXJlXSwgdHJ1ZSkgOiB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW2ZlYXR1cmVdKTtcclxuICAgICAgdGhpcy56b29tVG9GZWF0dXJlRXh0ZW50KGZlYXR1cmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJ5IHRvIGFkZCB6b25lIGZlYXR1cmUgdG8gdGhlIG1hcCBvdmVybGF5XHJcbiAgICovXHJcbiAgcHVibGljIHRyeUFkZEZlYXR1cmVzVG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgYnVmZmVyPzogYm9vbGVhbikge1xyXG4gICAgbGV0IGkgPSAxO1xyXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XHJcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuX2ludGVybmFsICYmXHJcbiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuX2ludGVybmFsLmNvZGUgPT09IGZlYXR1cmUucHJvcGVydGllcy5jb2RlICYmXHJcbiAgICAgICAgICAgICFidWZmZXJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoIWxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcclxuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmluZGV4T2YobGF5ZXIpO1xyXG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcclxuICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoYnVmZmVyKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYWN0aXZlTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggPT09IDEgJiYgbGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoJ1pvbmUnKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYXRhU291cmNlU2VydmljZVxyXG4gICAgICAgIC5jcmVhdGVBc3luY0RhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgdHlwZTogJ3ZlY3RvcicsXHJcbiAgICAgICAgICBxdWVyeWFibGU6IHRydWVcclxuICAgICAgICB9IGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb2xMYXllciA9IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyKHtcclxuICAgICAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogKCdab25lICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXHJcbiAgICAgICAgICAgICkpIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgd29ya3NwYWNlOiB7IGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICAgICAgX2ludGVybmFsOiB7XHJcbiAgICAgICAgICAgICAgY29kZTpcclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICA/IGZlYXR1cmUucHJvcGVydGllcy5jb2RlXHJcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgc3R5bGU6IChfZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gKGZlYXR1cmVzWzBdIGFzIGFueSkuY29vcmRpbmF0ZXM7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvbHN0eWxlLlN0eWxlKHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiBuZXcgb2xzdHlsZS5DaXJjbGUoe1xyXG4gICAgICAgICAgICAgICAgICByYWRpdXM6IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmJ1ZmZlciAvXHJcbiAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiBjb29yZGluYXRlc1sxXSkgL1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvblxyXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICBmaWxsOiBuZXcgb2xzdHlsZS5GaWxsKHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMjAwLCAyMDAsIDIwLCAwLjIpJ1xyXG4gICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBuZXcgb2xzdHlsZS5TdHJva2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJ1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLFxyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJ29yYW5nZSdcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgZmlsbDogbmV3IG9sc3R5bGUuRmlsbCh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgyMDAsIDIwMCwgMjAsIDAuMiknXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzT2wgPSBmZWF0dXJlcy5tYXAoZiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCA/ICdDZXJjbGUnIDogJ1BvbHlnb25lJztcclxuICAgICAgICAgICAgZmVhdHVyZXNPbFswXS5zZXQoJ25vbScsICdab25lJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGZlYXR1cmVzT2xbMF0uc2V0KCd0eXBlJywgdHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VWZWN0b3I8T2xHZW9tZXRyeT4gfCBvbFNvdXJjZUNsdXN0ZXI7XHJcbiAgICAgICAgICBvbC5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcclxuICAgICAgICAgIHRoaXMubWFwLmFkZExheWVyKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLnB1c2gob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyeSB0byBhZGQgcG9pbnQgZmVhdHVyZXMgdG8gdGhlIG1hcFxyXG4gICAqIE5lY2Vzc2FyeSB0byBjcmVhdGUgY2x1c3RlcnNcclxuICAgKi9cclxuICBwcml2YXRlIHRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgaWQpIHtcclxuICAgIGxldCBpID0gMTtcclxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMubWFwID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aChmZWF0dXJlc1swXS5tZXRhLnRpdGxlKSkge1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2VTZXJ2aWNlXHJcbiAgICAgICAgLmNyZWF0ZUFzeW5jRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICB0eXBlOiAnY2x1c3RlcicsXHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGRpc3RhbmNlOiAxMjAsXHJcbiAgICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnQ2x1c3RlcidcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZTogQ2x1c3RlckRhdGFTb3VyY2UpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGljb24gPSBmZWF0dXJlc1swXS5tZXRhLmljb247XHJcbiAgICAgICAgICBsZXQgc3R5bGU6IG9sc3R5bGUuU3R5bGU7XHJcbiAgICAgICAgICBpZiAoIWljb24pIHtcclxuICAgICAgICAgICAgc3R5bGUgPSBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5jcmVhdGVTdmdJY29uKGljb24pIHx8IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllcih7XHJcbiAgICAgICAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xyXG4gICAgICAgICAgICApKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzT2wgPSBmZWF0dXJlcy5tYXAoZmVhdHVyZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmZWF0dXJlLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3Qgb2wgPSBkYXRhU291cmNlLm9sIGFzIG9sU291cmNlQ2x1c3RlcjtcclxuICAgICAgICAgIG9sLmdldFNvdXJjZSgpLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xyXG4gICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKFxyXG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGkgPSBpIC0gMTtcclxuICAgICAgICAgICAgb2xMYXllci50aXRsZSA9IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xyXG4gICAgICAgICAgICApKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgIG9sTGF5ZXIub3B0aW9ucy50aXRsZSA9IG9sTGF5ZXIudGl0bGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaTtcclxuICAgICAgICAgIHRoaXMubWFwLmFkZExheWVyKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMucHVzaExheWVyKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVN2Z0ljb24oaWNvbik6IG9sc3R5bGUuU3R5bGUge1xyXG4gICAgbGV0IHN0eWxlOiBvbHN0eWxlLlN0eWxlO1xyXG4gICAgdGhpcy5tYXRJY29uUmVnaXN0cnkuZ2V0TmFtZWRTdmdJY29uKGljb24pLnN1YnNjcmliZShzdmdPYmogPT4ge1xyXG4gICAgICBjb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcclxuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMzAnKTtcclxuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzMwJyk7XHJcbiAgICAgIHN2Z09iai5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAncmdiYSgwLCAxMjgsIDI1NSknKTtcclxuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ3doaXRlJyk7XHJcbiAgICAgIGNvbnN0IHN2ZyA9IHhtbFNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoc3ZnT2JqKTtcclxuICAgICAgc3R5bGUgPSBuZXcgb2xzdHlsZS5TdHlsZSh7XHJcbiAgICAgICAgaW1hZ2U6IG5ldyBvbHN0eWxlLkljb24oe1xyXG4gICAgICAgICAgc3JjOiAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArIHN2Z1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc3R5bGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRyeSB0byBhZGQgbGluZSBvciBwb2x5Z29uIGZlYXR1cmVzIHRvIHRoZSBtYXBcclxuICAgKi9cclxuICBwcml2YXRlIHRyeUFkZExheWVyVG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgaWQpIHtcclxuICAgIGxldCBpID0gMTtcclxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMubWFwID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aChmZWF0dXJlc1swXS5tZXRhLnRpdGxlKSkge1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2VTZXJ2aWNlXHJcbiAgICAgICAgLmNyZWF0ZUFzeW5jRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICB0eXBlOiAndmVjdG9yJyxcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlXHJcbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucylcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllcih7XHJcbiAgICAgICAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xyXG4gICAgICAgICAgICApKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKGZlYXR1cmUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZVRvT2woZmVhdHVyZSwgdGhpcy5tYXAucHJvamVjdGlvbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IG9sID0gZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZVZlY3RvcjxPbEdlb21ldHJ5PjtcclxuICAgICAgICAgIG9sLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xyXG4gICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKFxyXG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGkgPSBpIC0gMTtcclxuICAgICAgICAgICAgb2xMYXllci50aXRsZSA9IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xyXG4gICAgICAgICAgICApKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgIG9sTGF5ZXIub3B0aW9ucy50aXRsZSA9IG9sTGF5ZXIudGl0bGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm1hcC5hZGRMYXllcihvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLnB1c2hMYXllcihvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgem9vbVRvRmVhdHVyZUV4dGVudChmZWF0dXJlKSB7XHJcbiAgICBpZiAoZmVhdHVyZSkge1xyXG4gICAgICBjb25zdCBvbEZlYXR1cmUgPSB0aGlzLmZvcm1hdC5yZWFkRmVhdHVyZShmZWF0dXJlLCB7XHJcbiAgICAgICAgZGF0YVByb2plY3Rpb246IGZlYXR1cmUucHJvamVjdGlvbixcclxuICAgICAgICBmZWF0dXJlUHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvblxyXG4gICAgICB9KTtcclxuICAgICAgbW92ZVRvT2xGZWF0dXJlcyh0aGlzLm1hcCwgW29sRmVhdHVyZV0sIEZlYXR1cmVNb3Rpb24uWm9vbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdXNoTGF5ZXIobGF5ZXIpIHtcclxuICAgIGZvciAoY29uc3QgbGF5IG9mIHRoaXMuYWN0aXZlTGF5ZXJzKSB7XHJcbiAgICAgIGlmIChsYXkuaWQgPT09IGxheWVyLmlkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3RpdmVMYXllcnMucHVzaChsYXllcik7XHJcbiAgfVxyXG59XHJcbiIsIjxpZ28tcGFuZWw+XHJcbiAgPGlnby1zcGF0aWFsLWZpbHRlci10eXBlXHJcbiAgICBbc3RvcmVdPVwic3BhdGlhbExpc3RTdG9yZVwiXHJcbiAgICBbc2VsZWN0ZWRRdWVyeVR5cGVdPVwicXVlcnlUeXBlXCJcclxuICAgIFt6b25lXT1cInpvbmVcIlxyXG4gICAgW2xheWVyc109XCJhY3RpdmVMYXllcnNcIlxyXG4gICAgKGV2ZW50VHlwZSk9XCJnZXRPdXRwdXRUeXBlKCRldmVudClcIlxyXG4gICAgKGV2ZW50UXVlcnlUeXBlKT1cImdldE91dHB1dFF1ZXJ5VHlwZSgkZXZlbnQpXCJcclxuICAgICh6b25lQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICh6b25lV2l0aEJ1ZmZlckNoYW5nZSk9XCJvblpvbmVDaGFuZ2UoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAoYnVmZmVyQ2hhbmdlKT1cImJ1ZmZlciA9ICRldmVudFwiXHJcbiAgICAobWVhc3VyZVVuaXRDaGFuZ2UpPVwibWVhc3VyZVVuaXQgPSAkZXZlbnRcIj5cclxuICA8L2lnby1zcGF0aWFsLWZpbHRlci10eXBlPlxyXG5cclxuICA8aWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW1cclxuICAgIFt0eXBlXT1cInR5cGVcIlxyXG4gICAgW3F1ZXJ5VHlwZV09XCJxdWVyeVR5cGVcIlxyXG4gICAgW21hcF09XCJtYXBcIlxyXG4gICAgW3pvbmVdPVwiem9uZVwiXHJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcclxuICAgIFtzdG9yZV09XCJzdG9yZVwiXHJcbiAgICBbbGF5ZXJzXT1cImFjdGl2ZUxheWVyc1wiXHJcbiAgICBbYWxsTGF5ZXJzXT1cImxheWVyc1wiXHJcbiAgICBbdGhlbWF0aWNMZW5ndGhdPVwidGhlbWF0aWNMZW5ndGhcIlxyXG4gICAgKHJhZGl1c0V2ZW50KT1cImJ1ZmZlciA9ICRldmVudFwiXHJcbiAgICAoYnVmZmVyRXZlbnQpPVwiYnVmZmVyID0gJGV2ZW50XCJcclxuICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJtZWFzdXJlVW5pdCA9ICRldmVudFwiXHJcbiAgICAoZnJlZWhhbmRDb250cm9sKT1cImZyZWVoYW5kRHJhd0lzQWN0aXZlID0gJGV2ZW50XCJcclxuICAgIChkcmF3Wm9uZUV2ZW50KT1cInpvbmUgPSAkZXZlbnRcIlxyXG4gICAgKHpvbmVXaXRoQnVmZmVyQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQsIHRydWUpXCJcclxuICAgIChpdGVtVHlwZUNoYW5nZSk9XCJpdGVtVHlwZSA9ICRldmVudFwiXHJcbiAgICAodGhlbWF0aWNDaGFuZ2UpPVwidGhlbWF0aWNzID0gJGV2ZW50XCJcclxuICAgICh0b2dnbGVTZWFyY2gpPVwiZ2V0T3V0cHV0VG9nZ2xlU2VhcmNoKClcIlxyXG4gICAgKGNsZWFyQnV0dG9uRXZlbnQpPVwiY2xlYXJNYXAoKVwiXHJcbiAgICAoY2xlYXJTZWFyY2hFdmVudCk9XCJnZXRPdXRwdXRDbGVhclNlYXJjaCgpXCJcclxuICAgIChleHBvcnQpPVwiYWN0aXZhdGVFeHBvcnRUb29sKClcIlxyXG4gICAgKG9wZW5Xb3Jrc3BhY2UpPVwiYWN0aXZhdGVXb3Jrc3BhY2UoKVwiXHJcbiAgICAoZW50aXR5Q2hhbmdlKT1cImFjdGl2YXRlV29ya3NwYWNlKCRldmVudClcIj5cclxuICA8L2lnby1zcGF0aWFsLWZpbHRlci1pdGVtPlxyXG48L2lnby1wYW5lbD5cclxuXHJcbjxpZ28tcGFuZWw+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRmVhdHVyZSQgfCBhc3luYyBhcyBmZWF0dXJlXCI+XHJcbiAgICA8aWdvLWZlYXR1cmUtZGV0YWlscyBbZmVhdHVyZV09XCJmZWF0dXJlXCI+PC9pZ28tZmVhdHVyZS1kZXRhaWxzPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2lnby1wYW5lbD4iXX0=