@igo2/geo 1.13.3 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +4 -1
  2. package/esm2020/lib/catalog/shared/catalog.abstract.mjs +1 -1
  3. package/esm2020/lib/draw/draw/draw-popup.component.mjs +562 -32
  4. package/esm2020/lib/draw/draw/draw.component.mjs +358 -130
  5. package/esm2020/lib/draw/draw/draw.module.mjs +12 -4
  6. package/esm2020/lib/draw/shared/draw-style.service.mjs +2 -2
  7. package/esm2020/lib/draw/shared/draw.enum.mjs +14 -1
  8. package/esm2020/lib/draw/shared/draw.interface.mjs +1 -1
  9. package/esm2020/lib/draw/shared/draw.utils.mjs +19 -1
  10. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +21 -8
  11. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +12 -2
  12. package/esm2020/lib/geometry/shared/controls/draw.mjs +53 -10
  13. package/esm2020/lib/import-export/shared/export.service.mjs +2 -2
  14. package/esm2020/lib/import-export/shared/import.interface.mjs +1 -1
  15. package/esm2020/lib/import-export/shared/import.service.mjs +26 -6
  16. package/esm2020/lib/layer/shared/layers/layer.interface.mjs +1 -1
  17. package/esm2020/lib/map/shared/hover-feature.directive.mjs +2 -2
  18. package/esm2020/lib/map/shared/map.utils.mjs +4 -1
  19. package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +33 -4
  20. package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +1 -1
  21. package/esm2020/lib/offline/geoDB/geoDB.service.mjs +12 -12
  22. package/esm2020/lib/print/shared/geopdf.mjs +58 -0
  23. package/esm2020/lib/print/shared/index.mjs +2 -1
  24. package/esm2020/lib/print/shared/print.interface.mjs +1 -1
  25. package/esm2020/lib/print/shared/print.service.mjs +118 -64
  26. package/esm2020/lib/query/shared/query.service.mjs +3 -3
  27. package/esm2020/lib/search/shared/sources/index.mjs +1 -3
  28. package/fesm2015/igo2-geo.mjs +1320 -409
  29. package/fesm2015/igo2-geo.mjs.map +1 -1
  30. package/fesm2020/igo2-geo.mjs +1272 -405
  31. package/fesm2020/igo2-geo.mjs.map +1 -1
  32. package/lib/catalog/shared/catalog.abstract.d.ts +1 -0
  33. package/lib/draw/draw/draw-popup.component.d.ts +52 -5
  34. package/lib/draw/draw/draw.component.d.ts +34 -4
  35. package/lib/draw/draw/draw.module.d.ts +3 -1
  36. package/lib/draw/shared/draw.enum.d.ts +11 -0
  37. package/lib/draw/shared/draw.interface.d.ts +4 -0
  38. package/lib/draw/shared/draw.utils.d.ts +2 -0
  39. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +2 -1
  40. package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +7 -1
  41. package/lib/geometry/shared/controls/draw.d.ts +18 -0
  42. package/lib/import-export/shared/import.interface.d.ts +2 -1
  43. package/lib/import-export/shared/import.service.d.ts +7 -0
  44. package/lib/layer/shared/layers/layer.interface.d.ts +4 -0
  45. package/lib/map/shared/map.utils.d.ts +1 -0
  46. package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +1 -0
  47. package/lib/offline/geoDB/geoDB.interface.d.ts +1 -0
  48. package/lib/offline/geoDB/geoDB.service.d.ts +3 -3
  49. package/lib/print/shared/geopdf.d.ts +1 -0
  50. package/lib/print/shared/index.d.ts +1 -0
  51. package/lib/print/shared/print.interface.d.ts +5 -0
  52. package/lib/print/shared/print.service.d.ts +17 -8
  53. package/lib/search/shared/sources/index.d.ts +0 -2
  54. package/package.json +4 -4
  55. package/esm2020/lib/search/shared/sources/cadastre.mjs +0 -126
  56. package/esm2020/lib/search/shared/sources/cadastre.providers.mjs +0 -23
  57. package/lib/search/shared/sources/cadastre.d.ts +0 -33
  58. package/lib/search/shared/sources/cadastre.providers.d.ts +0 -18
@@ -1,61 +1,591 @@
1
1
  import { Component, Inject, Input } from '@angular/core';
2
2
  import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { CoordinatesUnit, GeometryType, LabelType } from '../shared/draw.enum';
4
+ import { transform } from 'ol/proj';
5
+ import { roundCoordTo } from '../../map/shared';
6
+ import OlFeature from 'ol/Feature';
7
+ import { measureOlGeometryLength, measureOlGeometryArea, metersToUnit, squareMetersToUnit } from '../../measure/shared/measure.utils';
8
+ import { MeasureLengthUnit, MeasureLengthUnitAbbreviation, MeasureAreaUnit, MeasureAreaUnitAbbreviation, } from '../../measure/shared/measure.enum';
9
+ import { fromCircle } from 'ol/geom/Polygon';
10
+ import { getLength } from 'ol/sphere';
11
+ import Circle from 'ol/geom/Circle';
12
+ import { DDtoDMS } from '../shared/draw.utils';
3
13
  import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/material/dialog";
5
- import * as i2 from "@angular/material/button";
6
- import * as i3 from "@angular/material/form-field";
7
- import * as i4 from "@angular/material/input";
8
- import * as i5 from "@ngx-translate/core";
14
+ import * as i1 from "@igo2/core";
15
+ import * as i2 from "@angular/material/dialog";
16
+ import * as i3 from "@angular/common";
17
+ import * as i4 from "@angular/material/button";
18
+ import * as i5 from "@angular/material/button-toggle";
19
+ import * as i6 from "@angular/material/form-field";
20
+ import * as i7 from "@angular/material/input";
21
+ import * as i8 from "@angular/material/select";
22
+ import * as i9 from "@angular/material/core";
23
+ import * as i10 from "@angular/material/radio";
24
+ import * as i11 from "@angular/material/checkbox";
25
+ import * as i12 from "@ngx-translate/core";
26
+ function DrawPopupComponent_div_12_mat_radio_group_5_mat_radio_button_1_Template(rf, ctx) { if (rf & 1) {
27
+ const _r10 = i0.ɵɵgetCurrentView();
28
+ i0.ɵɵelementStart(0, "mat-radio-button", 11);
29
+ i0.ɵɵlistener("change", function DrawPopupComponent_div_12_mat_radio_group_5_mat_radio_button_1_Template_mat_radio_button_change_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r9.onLabelTypeChange($event.value)); });
30
+ i0.ɵɵtext(1);
31
+ i0.ɵɵelementEnd();
32
+ } if (rf & 2) {
33
+ const option_r8 = ctx.$implicit;
34
+ const ctx_r7 = i0.ɵɵnextContext(3);
35
+ i0.ɵɵproperty("value", option_r8.value)("disabled", ctx_r7.optionAvailable(option_r8.value))("checked", option_r8.checked);
36
+ i0.ɵɵadvance(1);
37
+ i0.ɵɵtextInterpolate1(" ", ctx_r7.getProperLengthLabel(option_r8.value), " ");
38
+ } }
39
+ function DrawPopupComponent_div_12_mat_radio_group_5_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "mat-radio-group", 5);
41
+ i0.ɵɵtemplate(1, DrawPopupComponent_div_12_mat_radio_group_5_mat_radio_button_1_Template, 2, 4, "mat-radio-button", 10);
42
+ i0.ɵɵelementEnd();
43
+ } if (rf & 2) {
44
+ const ctx_r2 = i0.ɵɵnextContext(2);
45
+ i0.ɵɵadvance(1);
46
+ i0.ɵɵproperty("ngForOf", ctx_r2.arrayBuiltInType);
47
+ } }
48
+ function DrawPopupComponent_div_12_ng_container_6_mat_checkbox_1_Template(rf, ctx) { if (rf & 1) {
49
+ const _r14 = i0.ɵɵgetCurrentView();
50
+ i0.ɵɵelementStart(0, "mat-checkbox", 13);
51
+ i0.ɵɵlistener("change", function DrawPopupComponent_div_12_ng_container_6_mat_checkbox_1_Template_mat_checkbox_change_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r13.onLabelTypeChange($event.source.value, $event.checked)); });
52
+ i0.ɵɵtext(1);
53
+ i0.ɵɵelementEnd();
54
+ } if (rf & 2) {
55
+ const option_r12 = ctx.$implicit;
56
+ const ctx_r11 = i0.ɵɵnextContext(3);
57
+ i0.ɵɵproperty("value", option_r12.value)("disabled", ctx_r11.optionAvailable(option_r12.value))("checked", option_r12.checked);
58
+ i0.ɵɵadvance(1);
59
+ i0.ɵɵtextInterpolate1(" ", ctx_r11.getProperLengthLabel(option_r12.value), " ");
60
+ } }
61
+ function DrawPopupComponent_div_12_ng_container_6_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementContainerStart(0, 5);
63
+ i0.ɵɵtemplate(1, DrawPopupComponent_div_12_ng_container_6_mat_checkbox_1_Template, 2, 4, "mat-checkbox", 12);
64
+ i0.ɵɵelementContainerEnd();
65
+ } if (rf & 2) {
66
+ const ctx_r3 = i0.ɵɵnextContext(2);
67
+ i0.ɵɵadvance(1);
68
+ i0.ɵɵproperty("ngForOf", ctx_r3.arrayBuiltInType);
69
+ } }
70
+ function DrawPopupComponent_div_12_div_7_mat_option_6_Template(rf, ctx) { if (rf & 1) {
71
+ i0.ɵɵelementStart(0, "mat-option", 3);
72
+ i0.ɵɵtext(1);
73
+ i0.ɵɵelementEnd();
74
+ } if (rf & 2) {
75
+ const unit_r17 = ctx.$implicit;
76
+ i0.ɵɵproperty("value", unit_r17);
77
+ i0.ɵɵadvance(1);
78
+ i0.ɵɵtextInterpolate1(" ", unit_r17, " ");
79
+ } }
80
+ function DrawPopupComponent_div_12_div_7_Template(rf, ctx) { if (rf & 1) {
81
+ const _r19 = i0.ɵɵgetCurrentView();
82
+ i0.ɵɵelementStart(0, "div")(1, "mat-form-field", 14);
83
+ i0.ɵɵelement(2, "input", 15, 16);
84
+ i0.ɵɵelementEnd();
85
+ i0.ɵɵelementStart(4, "mat-form-field", 17)(5, "mat-select", 18);
86
+ i0.ɵɵlistener("selectionChange", function DrawPopupComponent_div_12_div_7_Template_mat_select_selectionChange_5_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r18 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r18.onChangeCoordinateUnit($event.value)); });
87
+ i0.ɵɵtemplate(6, DrawPopupComponent_div_12_div_7_mat_option_6_Template, 2, 2, "mat-option", 19);
88
+ i0.ɵɵelementEnd()()();
89
+ } if (rf & 2) {
90
+ const ctx_r4 = i0.ɵɵnextContext(2);
91
+ i0.ɵɵadvance(2);
92
+ i0.ɵɵpropertyInterpolate("value", ctx_r4.currentCoordinates);
93
+ i0.ɵɵadvance(3);
94
+ i0.ɵɵproperty("value", ctx_r4.coordinatesMeasureUnit);
95
+ i0.ɵɵadvance(1);
96
+ i0.ɵɵproperty("ngForOf", ctx_r4.allCoordinatesUnits);
97
+ } }
98
+ function DrawPopupComponent_div_12_div_8_mat_option_6_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "mat-option", 3);
100
+ i0.ɵɵtext(1);
101
+ i0.ɵɵelementEnd();
102
+ } if (rf & 2) {
103
+ const unit_r22 = ctx.$implicit;
104
+ const ctx_r21 = i0.ɵɵnextContext(3);
105
+ i0.ɵɵproperty("value", unit_r22);
106
+ i0.ɵɵadvance(1);
107
+ i0.ɵɵtextInterpolate1(" ", ctx_r21.getLengthUnitEnum(unit_r22), " ");
108
+ } }
109
+ function DrawPopupComponent_div_12_div_8_Template(rf, ctx) { if (rf & 1) {
110
+ const _r24 = i0.ɵɵgetCurrentView();
111
+ i0.ɵɵelementStart(0, "div")(1, "mat-form-field", 14);
112
+ i0.ɵɵelement(2, "input", 20, 16);
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(4, "mat-form-field", 17)(5, "mat-select", 18);
115
+ i0.ɵɵlistener("selectionChange", function DrawPopupComponent_div_12_div_8_Template_mat_select_selectionChange_5_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r23.onChangeLengthUnit($event.value)); });
116
+ i0.ɵɵtemplate(6, DrawPopupComponent_div_12_div_8_mat_option_6_Template, 2, 2, "mat-option", 19);
117
+ i0.ɵɵelementEnd()()();
118
+ } if (rf & 2) {
119
+ const ctx_r5 = i0.ɵɵnextContext(2);
120
+ i0.ɵɵadvance(2);
121
+ i0.ɵɵpropertyInterpolate("placeholder", ctx_r5.lengthLabelT);
122
+ i0.ɵɵpropertyInterpolate("value", ctx_r5.currentLength);
123
+ i0.ɵɵadvance(3);
124
+ i0.ɵɵproperty("value", ctx_r5.lengthMeasureUnit);
125
+ i0.ɵɵadvance(1);
126
+ i0.ɵɵproperty("ngForOf", ctx_r5.allLengthUnits);
127
+ } }
128
+ function DrawPopupComponent_div_12_div_9_mat_option_7_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "mat-option", 3);
130
+ i0.ɵɵtext(1);
131
+ i0.ɵɵelementEnd();
132
+ } if (rf & 2) {
133
+ const unit_r27 = ctx.$implicit;
134
+ const ctx_r26 = i0.ɵɵnextContext(3);
135
+ i0.ɵɵproperty("value", unit_r27);
136
+ i0.ɵɵadvance(1);
137
+ i0.ɵɵtextInterpolate1(" ", ctx_r26.getAreaUnitEnum(unit_r27), " ");
138
+ } }
139
+ function DrawPopupComponent_div_12_div_9_Template(rf, ctx) { if (rf & 1) {
140
+ const _r29 = i0.ɵɵgetCurrentView();
141
+ i0.ɵɵelementStart(0, "div")(1, "mat-form-field", 14);
142
+ i0.ɵɵelement(2, "input", 20, 16);
143
+ i0.ɵɵpipe(4, "translate");
144
+ i0.ɵɵelementEnd();
145
+ i0.ɵɵelementStart(5, "mat-form-field", 17)(6, "mat-select", 18);
146
+ i0.ɵɵlistener("selectionChange", function DrawPopupComponent_div_12_div_9_Template_mat_select_selectionChange_6_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r28 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r28.onChangeAreaUnit($event.value)); });
147
+ i0.ɵɵtemplate(7, DrawPopupComponent_div_12_div_9_mat_option_7_Template, 2, 2, "mat-option", 19);
148
+ i0.ɵɵelementEnd()()();
149
+ } if (rf & 2) {
150
+ const ctx_r6 = i0.ɵɵnextContext(2);
151
+ i0.ɵɵadvance(2);
152
+ i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(4, 4, "igo.geo.draw.labelType.Area"));
153
+ i0.ɵɵpropertyInterpolate("value", ctx_r6.currentArea);
154
+ i0.ɵɵadvance(4);
155
+ i0.ɵɵproperty("value", ctx_r6.areaMeasureUnit);
156
+ i0.ɵɵadvance(1);
157
+ i0.ɵɵproperty("ngForOf", ctx_r6.allAreaUnits);
158
+ } }
159
+ function DrawPopupComponent_div_12_Template(rf, ctx) { if (rf & 1) {
160
+ const _r31 = i0.ɵɵgetCurrentView();
161
+ i0.ɵɵelementStart(0, "div")(1, "div")(2, "p", 5);
162
+ i0.ɵɵtext(3);
163
+ i0.ɵɵpipe(4, "translate");
164
+ i0.ɵɵelementEnd();
165
+ i0.ɵɵtemplate(5, DrawPopupComponent_div_12_mat_radio_group_5_Template, 2, 1, "mat-radio-group", 6);
166
+ i0.ɵɵtemplate(6, DrawPopupComponent_div_12_ng_container_6_Template, 2, 1, "ng-container", 6);
167
+ i0.ɵɵtemplate(7, DrawPopupComponent_div_12_div_7_Template, 7, 3, "div", 4);
168
+ i0.ɵɵtemplate(8, DrawPopupComponent_div_12_div_8_Template, 7, 4, "div", 4);
169
+ i0.ɵɵtemplate(9, DrawPopupComponent_div_12_div_9_Template, 8, 6, "div", 4);
170
+ i0.ɵɵelementEnd();
171
+ i0.ɵɵelementStart(10, "div", 7)(11, "button", 8);
172
+ i0.ɵɵlistener("click", function DrawPopupComponent_div_12_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r31); const ctx_r30 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r30.cancelDrawing()); });
173
+ i0.ɵɵtext(12);
174
+ i0.ɵɵpipe(13, "translate");
175
+ i0.ɵɵelementEnd();
176
+ i0.ɵɵelementStart(14, "button", 9);
177
+ i0.ɵɵlistener("click", function DrawPopupComponent_div_12_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r31); const ctx_r32 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r32.confirm()); });
178
+ i0.ɵɵtext(15);
179
+ i0.ɵɵelementEnd()()();
180
+ } if (rf & 2) {
181
+ const ctx_r0 = i0.ɵɵnextContext();
182
+ i0.ɵɵadvance(3);
183
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 8, "igo.geo.draw.builtInInstructions"));
184
+ i0.ɵɵadvance(2);
185
+ i0.ɵɵproperty("ngIf", ctx_r0.olGeometryType !== "Polygon");
186
+ i0.ɵɵadvance(1);
187
+ i0.ɵɵproperty("ngIf", ctx_r0.olGeometryType === "Polygon");
188
+ i0.ɵɵadvance(1);
189
+ i0.ɵɵproperty("ngIf", ctx_r0.labelFlag === ctx_r0.labelType.Coordinates);
190
+ i0.ɵɵadvance(1);
191
+ i0.ɵɵproperty("ngIf", ctx_r0.labelFlag === ctx_r0.labelType.Length || ctx_r0.polygonCheck === 2);
192
+ i0.ɵɵadvance(1);
193
+ i0.ɵɵproperty("ngIf", ctx_r0.labelFlag === ctx_r0.labelType.Area || ctx_r0.polygonCheck === 2);
194
+ i0.ɵɵadvance(3);
195
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(13, 10, "igo.geo.draw.cancel"), " ");
196
+ i0.ɵɵadvance(3);
197
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.noLabelButton(), " ");
198
+ } }
199
+ function DrawPopupComponent_div_13_Template(rf, ctx) { if (rf & 1) {
200
+ const _r36 = i0.ɵɵgetCurrentView();
201
+ i0.ɵɵelementStart(0, "div")(1, "div")(2, "p", 5);
202
+ i0.ɵɵtext(3);
203
+ i0.ɵɵpipe(4, "translate");
204
+ i0.ɵɵelementEnd();
205
+ i0.ɵɵelementStart(5, "mat-form-field", 21)(6, "input", 22, 16);
206
+ i0.ɵɵlistener("select", function DrawPopupComponent_div_13_Template_input_select_6_listener() { return true; })("input", function DrawPopupComponent_div_13_Template_input_input_6_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r35 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r35.getLabelLength($event.target.value)); });
207
+ i0.ɵɵpipe(8, "translate");
208
+ i0.ɵɵelementEnd()()();
209
+ i0.ɵɵelementStart(9, "div", 7)(10, "button", 8);
210
+ i0.ɵɵlistener("click", function DrawPopupComponent_div_13_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r36); const ctx_r37 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r37.cancelDrawing()); });
211
+ i0.ɵɵtext(11);
212
+ i0.ɵɵpipe(12, "translate");
213
+ i0.ɵɵelementEnd();
214
+ i0.ɵɵelementStart(13, "button", 9);
215
+ i0.ɵɵlistener("click", function DrawPopupComponent_div_13_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r36); const _r33 = i0.ɵɵreference(7); const ctx_r38 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r38.confirm(_r33.value)); });
216
+ i0.ɵɵtext(14);
217
+ i0.ɵɵelementEnd()()();
218
+ } if (rf & 2) {
219
+ const ctx_r1 = i0.ɵɵnextContext();
220
+ i0.ɵɵadvance(3);
221
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 5, "igo.geo.draw.dialogInstruction"));
222
+ i0.ɵɵadvance(3);
223
+ i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(8, 7, "igo.geo.draw.dialogTitle"));
224
+ i0.ɵɵpropertyInterpolate("value", ctx_r1.currentLabel);
225
+ i0.ɵɵadvance(5);
226
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(12, 9, "igo.geo.draw.cancel"), " ");
227
+ i0.ɵɵadvance(3);
228
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.noLabelButton(), " ");
229
+ } }
9
230
  export class DrawPopupComponent {
10
- constructor(dialogRef, data) {
231
+ constructor(languageService, dialogRef, data) {
232
+ this.languageService = languageService;
11
233
  this.dialogRef = dialogRef;
12
234
  this.data = data;
13
235
  this.confirmFlag = false;
236
+ this.labelFlag = LabelType.Custom;
237
+ this.geometryType = GeometryType;
238
+ this.labelType = LabelType;
239
+ this.arrayBuiltInType = [];
240
+ this.olGeometryType = undefined;
241
+ this.polygonCheck = 0; // Count for polygon label types checkboxes
242
+ this.currentLabel = this.data.olGeometry.get('draw');
243
+ this.labelLength = this.currentLabel ? this.currentLabel.length : 0;
244
+ let olGeometry;
245
+ const projection = this.data.map.ol.getView().getProjection();
246
+ if (this.data.olGeometry instanceof OlFeature) {
247
+ if (this.data.olGeometry.get('rad')) {
248
+ const longitudeLatitude = [this.data.olGeometry.get('longitude'), this.data.olGeometry.get('latitude')];
249
+ this.olGeometryType = GeometryType.Circle;
250
+ olGeometry = new Circle(longitudeLatitude, this.data.olGeometry.get('rad'));
251
+ }
252
+ else {
253
+ this.olGeometryType = this.data.olGeometry.getGeometry().getType();
254
+ olGeometry = this.data.olGeometry.get('geometry');
255
+ }
256
+ }
257
+ else {
258
+ this.olGeometryType = this.data.olGeometry.getType();
259
+ olGeometry = this.data.olGeometry;
260
+ }
261
+ if (this.olGeometryType === GeometryType.Point || this.olGeometryType === GeometryType.Circle) {
262
+ if (this.data.olGeometry instanceof OlFeature) {
263
+ let longitude = this.data.olGeometry.get('longitude');
264
+ let latitude = this.data.olGeometry.get('latitude');
265
+ this.longlatDD = roundCoordTo([longitude, latitude], 5);
266
+ this.coordinatesInDD = '(' + latitude + ', '
267
+ + longitude + ')';
268
+ }
269
+ else {
270
+ let point4326 = transform(this.data.olGeometry.getFlatCoordinates(), projection, 'EPSG:4326');
271
+ this.longlatDD = roundCoordTo([point4326[0], point4326[1]], 5);
272
+ this.coordinatesInDD =
273
+ '(' + this.longlatDD[1] + ', ' + this.longlatDD[0] + ')';
274
+ }
275
+ this.currentCoordinates = this.coordinatesInDD;
276
+ }
277
+ if (this.olGeometryType === GeometryType.LineString) {
278
+ this.lengthInMeters = measureOlGeometryLength(olGeometry, projection.getCode()).toFixed(2);
279
+ this.currentLength = this.lengthInMeters;
280
+ }
281
+ else if (this.olGeometryType === GeometryType.Polygon) {
282
+ this.lengthInMeters = measureOlGeometryLength(olGeometry, projection.getCode()).toFixed(2);
283
+ this.currentLength = this.lengthInMeters;
284
+ this.areaInMetersSquare = measureOlGeometryArea(olGeometry, projection.getCode()).toFixed(2);
285
+ this.currentArea = this.areaInMetersSquare;
286
+ }
287
+ else if (this.olGeometryType === GeometryType.Circle) {
288
+ let circularPolygon = fromCircle(olGeometry, 10000);
289
+ const radius = this.getRadius(circularPolygon);
290
+ this.lengthInMeters = radius.toFixed(2);
291
+ this.currentLength = this.lengthInMeters;
292
+ this.areaInMetersSquare = measureOlGeometryArea(circularPolygon, projection.getCode()).toFixed(2);
293
+ this.currentArea = this.areaInMetersSquare;
294
+ }
295
+ if (data.olGeometry.get('labelType') === LabelType.Coordinates) {
296
+ this.onLabelTypeChange(LabelType.Predefined);
297
+ this.onLabelTypeChange(LabelType.Coordinates, true);
298
+ this.coordinatesMeasureUnit = data.olGeometry.get('measureUnit');
299
+ }
300
+ else if (data.olGeometry.get('labelType') === LabelType.Length) {
301
+ this.onLabelTypeChange(LabelType.Predefined);
302
+ this.onLabelTypeChange(LabelType.Length, true);
303
+ this.lengthMeasureUnit = data.olGeometry.get('measureUnit');
304
+ }
305
+ else if (data.olGeometry.get('labelType') === LabelType.Area) {
306
+ this.onLabelTypeChange(LabelType.Predefined);
307
+ this.onLabelTypeChange(LabelType.Area, true);
308
+ this.areaMeasureUnit = data.olGeometry.get('measureUnit');
309
+ }
310
+ else if (data.olGeometry.get('labelType')?.length === 2) {
311
+ this.onLabelTypeChange(LabelType.Predefined);
312
+ this.onLabelTypeChange(LabelType.Length, true);
313
+ this.onLabelTypeChange(LabelType.Area, true);
314
+ this.lengthMeasureUnit = data.olGeometry.get('measureUnit')[0];
315
+ this.areaMeasureUnit = data.olGeometry.get('measureUnit')[1];
316
+ }
317
+ this.buildArrayType();
14
318
  }
319
+ /**
320
+ * HTML Interactions
321
+ */
15
322
  cancelDrawing() {
16
323
  this.dialogRef.close();
17
324
  }
18
- confirm(labelString) {
325
+ confirm(input) {
19
326
  this.confirmFlag = true;
20
- this.dialogRef.close(labelString);
327
+ if (this.labelFlag === LabelType.Predefined) {
328
+ this.dialogRef.close();
329
+ }
330
+ else if (this.labelFlag === LabelType.Custom) {
331
+ this.dialogRef.close({
332
+ label: input
333
+ });
334
+ }
335
+ else if (this.labelFlag === LabelType.Coordinates) {
336
+ this.dialogRef.close({
337
+ label: this.currentCoordinates,
338
+ measureUnit: this.coordinatesMeasureUnit
339
+ });
340
+ }
341
+ else if (this.olGeometryType === GeometryType.Polygon) {
342
+ if (this.polygonCheck === 2) {
343
+ this.labelFlag = [LabelType.Length, LabelType.Area];
344
+ this.dialogRef.close({
345
+ label: 'P: ' + this.currentLength + ' ' + MeasureLengthUnitAbbreviation[MeasureLengthUnit.Meters] + '\n'
346
+ + this.languageService.translate.instant('igo.geo.draw.labelType.A') + this.currentArea + ' ' +
347
+ MeasureAreaUnitAbbreviation[MeasureAreaUnit.SquareMeters], measureUnit: [this.lengthMeasureUnit, this.areaMeasureUnit]
348
+ });
349
+ }
350
+ else {
351
+ this.labelFlag === LabelType.Length ?
352
+ this.dialogRef.close({
353
+ label: 'P: ' + this.currentLength + ' ' + MeasureLengthUnitAbbreviation[this.lengthMeasureUnit],
354
+ measureUnit: this.lengthMeasureUnit
355
+ }) :
356
+ this.dialogRef.close({
357
+ label: this.currentArea + ' ' + MeasureAreaUnitAbbreviation[this.areaMeasureUnit],
358
+ measureUnit: this.areaMeasureUnit
359
+ });
360
+ }
361
+ }
362
+ else if (this.labelFlag === LabelType.Length) {
363
+ if (this.olGeometryType === GeometryType.Circle) {
364
+ this.dialogRef.close({
365
+ label: 'R: ' + this.currentLength + ' ' + MeasureLengthUnitAbbreviation[this.lengthMeasureUnit],
366
+ measureUnit: this.lengthMeasureUnit
367
+ });
368
+ }
369
+ else if (this.olGeometryType === GeometryType.LineString) {
370
+ this.dialogRef.close({
371
+ label: this.currentLength + ' ' + MeasureLengthUnitAbbreviation[this.lengthMeasureUnit],
372
+ measureUnit: this.lengthMeasureUnit
373
+ });
374
+ }
375
+ }
376
+ else if (this.labelFlag === LabelType.Area) {
377
+ this.dialogRef.close({
378
+ label: this.currentArea + ' ' + MeasureAreaUnitAbbreviation[this.areaMeasureUnit],
379
+ measureUnit: this.areaMeasureUnit
380
+ });
381
+ }
382
+ }
383
+ onLabelTypeChange(labelType, checked) {
384
+ if (labelType !== LabelType.Predefined &&
385
+ labelType !== LabelType.Custom &&
386
+ this.olGeometryType === GeometryType.Polygon) {
387
+ this.arrayBuiltInType.find(type => type.value === labelType) ?
388
+ this.arrayBuiltInType.find(type => type.value === labelType).checked = checked : this.labelFlag = undefined;
389
+ checked ? this.labelFlag = labelType : this.labelFlag = this.arrayBuiltInType.find(type => type.checked)?.value;
390
+ }
391
+ else {
392
+ this.labelFlag = labelType;
393
+ }
394
+ if (labelType === LabelType.Predefined) {
395
+ if (this.olGeometryType === GeometryType.Point) {
396
+ this.labelFlag = LabelType.Coordinates;
397
+ this.currentCoordinates = this.coordinatesInDD;
398
+ this.coordinatesMeasureUnit = CoordinatesUnit.DecimalDegree;
399
+ }
400
+ else if (this.olGeometryType === GeometryType.LineString) {
401
+ this.labelFlag = LabelType.Length;
402
+ this.currentLength = this.lengthInMeters;
403
+ this.lengthMeasureUnit = MeasureLengthUnit.Meters;
404
+ }
405
+ }
406
+ else if (labelType === LabelType.Area) {
407
+ this.currentArea = this.areaInMetersSquare;
408
+ this.areaMeasureUnit = MeasureAreaUnit.SquareMeters;
409
+ }
410
+ else if (labelType === LabelType.Length) {
411
+ this.currentLength = this.lengthInMeters;
412
+ this.lengthMeasureUnit = MeasureLengthUnit.Meters;
413
+ }
414
+ else if (this.labelFlag === LabelType.Coordinates) {
415
+ this.currentCoordinates = this.coordinatesInDD;
416
+ this.coordinatesMeasureUnit = CoordinatesUnit.DecimalDegree;
417
+ }
418
+ const labeltypes = [this.labelType.Length, this.labelType.Area];
419
+ if (this.olGeometryType === GeometryType.Polygon &&
420
+ labeltypes.includes(labelType)) {
421
+ checked ? this.polygonCheck += 1 : this.polygonCheck -= 1;
422
+ ;
423
+ }
424
+ else {
425
+ this.polygonCheck = 0;
426
+ }
427
+ }
428
+ onChangeLengthUnit(lengthUnit) {
429
+ this.lengthMeasureUnit = lengthUnit;
430
+ this.currentLength = metersToUnit(Number(this.lengthInMeters), lengthUnit).toFixed(2);
431
+ }
432
+ onChangeAreaUnit(areaUnit) {
433
+ this.areaMeasureUnit = areaUnit;
434
+ this.currentArea = squareMetersToUnit(Number(this.areaInMetersSquare), areaUnit).toFixed(2);
435
+ }
436
+ onChangeCoordinateUnit(coordinatesUnit) {
437
+ this.coordinatesMeasureUnit = coordinatesUnit;
438
+ let coordinates = DDtoDMS(this.longlatDD, coordinatesUnit);
439
+ this.currentCoordinates = '(' + coordinates[1] + ', ' + coordinates[0] + ')';
440
+ }
441
+ buildArrayType() {
442
+ for (const labelType of Object.values(LabelType)) {
443
+ if (labelType !== LabelType.Custom && labelType !== LabelType.Predefined) {
444
+ this.arrayBuiltInType.push({
445
+ value: labelType,
446
+ checked: this.selectOptions(labelType) ||
447
+ this.labelFlag === labelType ||
448
+ (this.polygonCheck === 2 && labelType !== LabelType.Coordinates)
449
+ });
450
+ }
451
+ }
452
+ }
453
+ noLabelButton() {
454
+ if (this.labelFlag === LabelType.Predefined || (this.labelFlag === LabelType.Custom && this.labelLength === 0)) {
455
+ return this.languageService.translate.instant('igo.geo.draw.noLabel');
456
+ }
457
+ return 'OK';
458
+ }
459
+ get customOrPredefined() {
460
+ if (this.labelFlag === LabelType.Custom) {
461
+ return LabelType.Custom;
462
+ }
463
+ return LabelType.Predefined;
464
+ }
465
+ optionAvailable(currentOption) {
466
+ switch (this.olGeometryType) {
467
+ case GeometryType.Point:
468
+ if (currentOption === LabelType.Coordinates) {
469
+ return false;
470
+ }
471
+ return true;
472
+ case GeometryType.LineString:
473
+ if (currentOption === LabelType.Length) {
474
+ return false;
475
+ }
476
+ return true;
477
+ case GeometryType.Polygon:
478
+ if (currentOption === LabelType.Coordinates) {
479
+ return true;
480
+ }
481
+ return false;
482
+ default:
483
+ return false;
484
+ }
485
+ }
486
+ get allLengthUnits() {
487
+ return Object.values(MeasureLengthUnit);
488
+ }
489
+ getLengthUnitEnum(lengthUnit) {
490
+ return MeasureLengthUnitAbbreviation[lengthUnit];
491
+ }
492
+ get allAreaUnits() {
493
+ return Object.values(MeasureAreaUnit);
494
+ }
495
+ get allCoordinatesUnits() {
496
+ return Object.values(CoordinatesUnit);
497
+ }
498
+ getAreaUnitEnum(areaUnit) {
499
+ return MeasureAreaUnitAbbreviation[areaUnit];
500
+ }
501
+ getRadius(olGeometry) {
502
+ const length = getLength(olGeometry);
503
+ return Number(length / (2 * Math.PI));
504
+ }
505
+ get lengthLabelT() {
506
+ if (this.olGeometryType === GeometryType.Polygon) {
507
+ return this.languageService.translate.instant('igo.geo.measure.perimeter');
508
+ }
509
+ if (this.olGeometryType === GeometryType.Circle) {
510
+ return this.languageService.translate.instant('igo.geo.search.coordinates.radius');
511
+ }
512
+ return this.languageService.translate.instant('igo.geo.draw.labelType.Length');
513
+ }
514
+ getLabelLength(event) {
515
+ this.labelLength = event.length;
516
+ }
517
+ selectOptions(option) {
518
+ if (this.olGeometryType === GeometryType.Point) {
519
+ return option === LabelType.Coordinates;
520
+ }
521
+ else if (this.olGeometryType === GeometryType.LineString) {
522
+ return option === LabelType.Length;
523
+ }
524
+ }
525
+ getProperLengthLabel(option) {
526
+ if (option === LabelType.Length) {
527
+ if (this.olGeometryType === GeometryType.Polygon) {
528
+ return this.languageService.translate.instant('igo.geo.measure.perimeter');
529
+ }
530
+ if (this.olGeometryType === GeometryType.Circle) {
531
+ return this.languageService.translate.instant('igo.geo.search.coordinates.radius');
532
+ }
533
+ return this.languageService.translate.instant('igo.geo.draw.labelType.Length');
534
+ }
535
+ return this.languageService.translate.instant('igo.geo.draw.labelType.' + option);
21
536
  }
22
537
  }
23
- DrawPopupComponent.ɵfac = function DrawPopupComponent_Factory(t) { return new (t || DrawPopupComponent)(i0.ɵɵdirectiveInject(i1.MatDialogRef), i0.ɵɵdirectiveInject(MAT_DIALOG_DATA)); };
24
- DrawPopupComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawPopupComponent, selectors: [["igo-draw-popup-component"]], inputs: { confirmFlag: "confirmFlag" }, decls: 14, vars: 10, consts: [["mat-dialog-content", ""], [1, "mat-typography"], [1, "example-full-width"], ["matInput", "", 3, "placeholder", "value"], ["input", ""], ["mat-dialog-actions", ""], ["mat-raised-button", "", 3, "click"], ["mat-raised-button", "", "color", "primary", 3, "click"]], template: function DrawPopupComponent_Template(rf, ctx) { if (rf & 1) {
25
- const _r1 = i0.ɵɵgetCurrentView();
26
- i0.ɵɵelementStart(0, "div", 0)(1, "p", 1);
538
+ DrawPopupComponent.ɵfac = function DrawPopupComponent_Factory(t) { return new (t || DrawPopupComponent)(i0.ɵɵdirectiveInject(i1.LanguageService), i0.ɵɵdirectiveInject(i2.MatDialogRef), i0.ɵɵdirectiveInject(MAT_DIALOG_DATA)); };
539
+ DrawPopupComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawPopupComponent, selectors: [["igo-draw-popup-component"]], inputs: { confirmFlag: "confirmFlag", labelFlag: "labelFlag", coordinatesMeasureUnit: "coordinatesMeasureUnit", lengthMeasureUnit: "lengthMeasureUnit", areaMeasureUnit: "areaMeasureUnit" }, decls: 14, vars: 14, consts: [["mat-dialog-title", ""], [1, "geometry-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [4, "ngIf"], [1, "mat-typography"], ["class", "mat-typography", 4, "ngIf"], ["mat-dialog-actions", ""], ["mat-raised-button", "", 3, "click"], ["mat-raised-button", "", "color", "primary", 3, "click"], [3, "value", "disabled", "checked", "change", 4, "ngFor", "ngForOf"], [3, "value", "disabled", "checked", "change"], ["class", "mat-typography", 3, "value", "disabled", "checked", "change", 4, "ngFor", "ngForOf"], [1, "mat-typography", 3, "value", "disabled", "checked", "change"], [1, "readOnly-Input"], ["matInput", "", "placeholder", "(Latitude, Longitude)", "readonly", "", 3, "value"], ["input", ""], [1, "unit-field"], [3, "value", "selectionChange"], [3, "value", 4, "ngFor", "ngForOf"], ["matInput", "", "readonly", "", 3, "placeholder", "value"], [1, "input"], ["matInput", "", "cdkFocusInitial", "", 3, "placeholder", "value", "select", "input"]], template: function DrawPopupComponent_Template(rf, ctx) { if (rf & 1) {
540
+ i0.ɵɵelementStart(0, "div")(1, "h2", 0);
27
541
  i0.ɵɵtext(2);
28
542
  i0.ɵɵpipe(3, "translate");
29
- i0.ɵɵelementEnd();
30
- i0.ɵɵelementStart(4, "mat-form-field", 2);
31
- i0.ɵɵelement(5, "input", 3, 4);
32
- i0.ɵɵpipe(7, "translate");
33
543
  i0.ɵɵelementEnd()();
34
- i0.ɵɵelementStart(8, "div", 5)(9, "button", 6);
35
- i0.ɵɵlistener("click", function DrawPopupComponent_Template_button_click_9_listener() { return ctx.cancelDrawing(); });
544
+ i0.ɵɵelementStart(4, "div", 1)(5, "mat-button-toggle-group", 2);
545
+ i0.ɵɵlistener("change", function DrawPopupComponent_Template_mat_button_toggle_group_change_5_listener($event) { return ctx.onLabelTypeChange($event.value); });
546
+ i0.ɵɵelementStart(6, "mat-button-toggle", 3);
547
+ i0.ɵɵtext(7);
548
+ i0.ɵɵpipe(8, "translate");
549
+ i0.ɵɵelementEnd();
550
+ i0.ɵɵelementStart(9, "mat-button-toggle", 3);
36
551
  i0.ɵɵtext(10);
37
552
  i0.ɵɵpipe(11, "translate");
38
- i0.ɵɵelementEnd();
39
- i0.ɵɵelementStart(12, "button", 7);
40
- i0.ɵɵlistener("click", function DrawPopupComponent_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const _r0 = i0.ɵɵreference(6); return i0.ɵɵresetView(ctx.confirm(_r0.value)); });
41
- i0.ɵɵtext(13, "OK ");
42
- i0.ɵɵelementEnd()();
553
+ i0.ɵɵelementEnd()()();
554
+ i0.ɵɵtemplate(12, DrawPopupComponent_div_12_Template, 16, 12, "div", 4);
555
+ i0.ɵɵtemplate(13, DrawPopupComponent_div_13_Template, 15, 11, "div", 4);
43
556
  } if (rf & 2) {
44
557
  i0.ɵɵadvance(2);
45
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 4, "igo.geo.draw.dialogInstruction"));
558
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 8, "igo.geo.draw.popupTitle"), " ");
46
559
  i0.ɵɵadvance(3);
47
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(7, 6, "igo.geo.draw.dialogTitle"));
48
- i0.ɵɵpropertyInterpolate("value", ctx.data.currentLabel);
49
- i0.ɵɵadvance(5);
50
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(11, 8, "igo.geo.draw.cancel"), " ");
51
- } }, dependencies: [i2.MatButton, i3.MatFormField, i4.MatInput, i1.MatDialogContent, i1.MatDialogActions, i5.TranslatePipe] });
560
+ i0.ɵɵproperty("value", ctx.customOrPredefined);
561
+ i0.ɵɵadvance(1);
562
+ i0.ɵɵproperty("value", ctx.labelType.Custom);
563
+ i0.ɵɵadvance(1);
564
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 10, "igo.geo.draw.labelType.custom"), " ");
565
+ i0.ɵɵadvance(2);
566
+ i0.ɵɵproperty("value", ctx.labelType.Predefined);
567
+ i0.ɵɵadvance(1);
568
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 12, "igo.geo.draw.labelType.predefined"), " ");
569
+ i0.ɵɵadvance(2);
570
+ i0.ɵɵproperty("ngIf", ctx.labelFlag !== ctx.labelType.Custom);
571
+ i0.ɵɵadvance(1);
572
+ i0.ɵɵproperty("ngIf", ctx.labelFlag === ctx.labelType.Custom);
573
+ } }, dependencies: [i3.NgForOf, i3.NgIf, i4.MatButton, i5.MatButtonToggleGroup, i5.MatButtonToggle, i6.MatFormField, i7.MatInput, i8.MatSelect, i9.MatOption, i2.MatDialogTitle, i2.MatDialogActions, i10.MatRadioGroup, i10.MatRadioButton, i11.MatCheckbox, i12.TranslatePipe], styles: [".mat-radio-button[_ngcontent-%COMP%] ~ .mat-radio-button[_ngcontent-%COMP%]{margin-left:16px}.readOnly-Input[_ngcontent-%COMP%]{width:200px!important}.unit-field[_ngcontent-%COMP%]{width:50px;margin-left:10px;margin-top:10px}.mat-form-field[_ngcontent-%COMP%]{position:-webkit-sticky!important;position:sticky!important}.coordinatesInputView[_ngcontent-%COMP%]{top:5em!important} .mat-form-field-wrapper{margin-bottom:-1.25em;margin-top:.25em}.geometry-type-toggle[_ngcontent-%COMP%], .mat-dialog-actions[_ngcontent-%COMP%]{display:flex!important;justify-content:center}.input[_ngcontent-%COMP%]{width:auto!important}.mat-button-toggle-group[_ngcontent-%COMP%], .mat-button-toggle[_ngcontent-%COMP%]{width:100%}mat-checkbox[_ngcontent-%COMP%]{margin-right:10px}"] });
52
574
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DrawPopupComponent, [{
53
575
  type: Component,
54
- args: [{ selector: 'igo-draw-popup-component', template: "<div mat-dialog-content>\r\n <p class=\"mat-typography\">{{ 'igo.geo.draw.dialogInstruction' | translate }}</p>\r\n <mat-form-field class=\"example-full-width\">\r\n <input\r\n #input\r\n matInput\r\n placeholder=\"{{'igo.geo.draw.dialogTitle' | translate}}\"\r\n value=\"{{data.currentLabel}}\"/>\r\n </mat-form-field>\r\n</div>\r\n<div mat-dialog-actions>\r\n <button \r\n mat-raised-button \r\n (click)=\"cancelDrawing()\">{{'igo.geo.draw.cancel' | translate}}\r\n </button>\r\n <button \r\n mat-raised-button \r\n color=\"primary\" \r\n (click)=\"confirm(input.value)\">OK\r\n </button>\r\n</div>\r\n" }]
55
- }], function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
576
+ args: [{ selector: 'igo-draw-popup-component', template: "<div>\r\n <h2 mat-dialog-title>\r\n {{ 'igo.geo.draw.popupTitle' | translate }}\r\n </h2>\r\n</div>\r\n\r\n\r\n<div class=\"geometry-type-toggle mat-typography\">\r\n <mat-button-toggle-group\r\n (change)=\"onLabelTypeChange($event.value)\" [value]=\"customOrPredefined\">\r\n <mat-button-toggle [value]=\"labelType.Custom\" >\r\n {{ 'igo.geo.draw.labelType.custom' | translate }}\r\n </mat-button-toggle>\r\n <mat-button-toggle [value]=\"labelType.Predefined\">\r\n {{ 'igo.geo.draw.labelType.predefined' | translate }}\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n<div *ngIf=\"labelFlag !== labelType.Custom\">\r\n <div>\r\n <p class=\"mat-typography\">{{ 'igo.geo.draw.builtInInstructions' | translate }}</p>\r\n <mat-radio-group *ngIf=\"olGeometryType !== 'Polygon'\" class=\"mat-typography\">\r\n <mat-radio-button *ngFor=\"let option of arrayBuiltInType\" [value]=\"option.value\" [disabled]=\"optionAvailable(option.value)\" \r\n (change)=\"onLabelTypeChange($event.value)\" [checked]=\"option.checked\">\r\n {{getProperLengthLabel(option.value)}}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n <ng-container class=\"mat-typography\" *ngIf=\"olGeometryType === 'Polygon'\">\r\n <mat-checkbox\r\n *ngFor=\"let option of arrayBuiltInType\"\r\n class=\"mat-typography\"\r\n [value]=\"option.value\"\r\n [disabled]=\"optionAvailable(option.value)\"\r\n (change)=\"onLabelTypeChange($event.source.value, $event.checked)\"\r\n [checked]=\"option.checked\">\r\n {{getProperLengthLabel(option.value)}}\r\n </mat-checkbox>\r\n </ng-container>\r\n <div *ngIf=\"labelFlag === labelType.Coordinates\">\r\n <mat-form-field class=\"readOnly-Input\">\r\n <input\r\n #input\r\n matInput\r\n placeholder=\"(Latitude, Longitude)\"\r\n value=\"{{currentCoordinates}}\" readonly>\r\n </mat-form-field>\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select [value]=\"coordinatesMeasureUnit\" (selectionChange)=\"onChangeCoordinateUnit($event.value)\">\r\n <mat-option *ngFor=\"let unit of allCoordinatesUnits\" [value]=\"unit\">\r\n {{unit}}\r\n </mat-option>\r\n </mat-select> \r\n </mat-form-field>\r\n </div>\r\n <div *ngIf=\"labelFlag === labelType.Length || polygonCheck === 2\">\r\n <mat-form-field class=\"readOnly-Input\">\r\n <input\r\n #input\r\n matInput\r\n placeholder={{lengthLabelT}}\r\n value=\"{{currentLength}}\" readonly>\r\n </mat-form-field>\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select [value]=\"lengthMeasureUnit\" (selectionChange)=\"onChangeLengthUnit($event.value)\">\r\n <mat-option *ngFor=\"let unit of allLengthUnits\" [value]=\"unit\">\r\n {{getLengthUnitEnum(unit)}}\r\n </mat-option>\r\n </mat-select> \r\n </mat-form-field>\r\n </div>\r\n <div *ngIf=\"labelFlag === labelType.Area || polygonCheck === 2\">\r\n <mat-form-field class=\"readOnly-Input\">\r\n <input\r\n #input\r\n matInput\r\n placeholder=\"{{ 'igo.geo.draw.labelType.Area' | translate }}\"\r\n value=\"{{currentArea}}\" readonly>\r\n </mat-form-field>\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select [value]=\"areaMeasureUnit\" (selectionChange)=\"onChangeAreaUnit($event.value)\">\r\n <mat-option *ngFor=\"let unit of allAreaUnits\" [value]=\"unit\">\r\n {{getAreaUnitEnum(unit)}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <div mat-dialog-actions>\r\n <button mat-raised-button (click)=\"cancelDrawing()\" >\r\n {{'igo.geo.draw.cancel' | translate}}\r\n </button>\r\n <button \r\n mat-raised-button \r\n color=\"primary\" \r\n (click)=\"confirm()\"> \r\n {{noLabelButton()}} \r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"labelFlag === labelType.Custom\">\r\n <div>\r\n <p class=\"mat-typography\">{{ 'igo.geo.draw.dialogInstruction' | translate }}</p>\r\n <mat-form-field class=\"input\">\r\n <input\r\n #input\r\n matInput\r\n (select)=\"true\"\r\n (input)=\"getLabelLength($event.target.value)\"\r\n placeholder=\"{{'igo.geo.draw.dialogTitle' | translate}}\"\r\n value=\"{{ currentLabel }}\"\r\n cdkFocusInitial/>\r\n </mat-form-field>\r\n </div>\r\n \r\n <div mat-dialog-actions>\r\n <button mat-raised-button (click)=\"cancelDrawing()\" >\r\n {{'igo.geo.draw.cancel' | translate}}\r\n </button>\r\n <button \r\n mat-raised-button \r\n color=\"primary\" \r\n (click)=\"confirm(input.value)\">\r\n {{noLabelButton()}}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".mat-radio-button~.mat-radio-button{margin-left:16px}.readOnly-Input{width:200px!important}.unit-field{width:50px;margin-left:10px;margin-top:10px}.mat-form-field{position:-webkit-sticky!important;position:sticky!important}.coordinatesInputView{top:5em!important}::ng-deep .mat-form-field-wrapper{margin-bottom:-1.25em;margin-top:.25em}.geometry-type-toggle,.mat-dialog-actions{display:flex!important;justify-content:center}.input{width:auto!important}.mat-button-toggle-group,.mat-button-toggle{width:100%}mat-checkbox{margin-right:10px}\n"] }]
577
+ }], function () { return [{ type: i1.LanguageService }, { type: i2.MatDialogRef }, { type: undefined, decorators: [{
56
578
  type: Inject,
57
579
  args: [MAT_DIALOG_DATA]
58
580
  }] }]; }, { confirmFlag: [{
59
581
  type: Input
582
+ }], labelFlag: [{
583
+ type: Input
584
+ }], coordinatesMeasureUnit: [{
585
+ type: Input
586
+ }], lengthMeasureUnit: [{
587
+ type: Input
588
+ }], areaMeasureUnit: [{
589
+ type: Input
60
590
  }] }); })();
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1wb3B1cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQU96RSxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLFlBQ1MsU0FBMkMsRUFDbEIsSUFBOEI7UUFEdkQsY0FBUyxHQUFULFNBQVMsQ0FBa0M7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBMEI7UUFKdkQsZ0JBQVcsR0FBWSxLQUFLLENBQUM7SUFJNEIsQ0FBQztJQUVuRSxhQUFhO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsT0FBTyxDQUFDLFdBQW1CO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O29GQWRVLGtCQUFrQiw4REFLbkIsZUFBZTtxRUFMZCxrQkFBa0I7O1FDUi9CLDhCQUF3QixXQUFBO1FBQ0ksWUFBa0Q7O1FBQUEsaUJBQUk7UUFDaEYseUNBQTJDO1FBQ3pDLDhCQUlpQzs7UUFDbkMsaUJBQWlCLEVBQUE7UUFFbkIsOEJBQXdCLGdCQUFBO1FBR3BCLCtGQUFTLG1CQUFlLElBQUM7UUFBQyxhQUM1Qjs7UUFBQSxpQkFBUztRQUNULGtDQUdpQztRQUEvQixzSkFBUyxlQUFBLHNCQUFvQixDQUFBLElBQUM7UUFBQyxvQkFDakM7UUFBQSxpQkFBUyxFQUFBOztRQWxCaUIsZUFBa0Q7UUFBbEQsNEVBQWtEO1FBS3hFLGVBQXdEO1FBQXhELHlGQUF3RDtRQUN4RCx3REFBNkI7UUFNTCxlQUM1QjtRQUQ0Qiw0RUFDNUI7O3VGRE5XLGtCQUFrQjtjQUw5QixTQUFTOzJCQUNFLDBCQUEwQjs7c0JBU2pDLE1BQU07dUJBQUMsZUFBZTt3QkFKaEIsV0FBVztrQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1kcmF3LXBvcHVwLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYXctcG9wdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RyYXctcG9wdXAuY29tcG9uZW50LnNjc3MnXVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3UG9wdXBDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGNvbmZpcm1GbGFnOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPERyYXdQb3B1cENvbXBvbmVudD4sXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IHsgY3VycmVudExhYmVsOiBzdHJpbmcgfSl7fVxyXG5cclxuICBjYW5jZWxEcmF3aW5nKCkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm0obGFiZWxTdHJpbmc6IHN0cmluZykge1xyXG4gICAgdGhpcy5jb25maXJtRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShsYWJlbFN0cmluZyk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxwIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIj57eyAnaWdvLmdlby5kcmF3LmRpYWxvZ0luc3RydWN0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvcD5cclxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICAjaW5wdXRcclxuICAgICAgbWF0SW5wdXRcclxuICAgICAgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRyYXcuZGlhbG9nVGl0bGUnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICB2YWx1ZT1cInt7ZGF0YS5jdXJyZW50TGFiZWx9fVwiLz5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgPGJ1dHRvbiBcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uIFxyXG4gICAgKGNsaWNrKT1cImNhbmNlbERyYXdpbmcoKVwiPnt7J2lnby5nZW8uZHJhdy5jYW5jZWwnIHwgdHJhbnNsYXRlfX1cclxuICA8L2J1dHRvbj5cclxuICA8YnV0dG9uIFxyXG4gICAgbWF0LXJhaXNlZC1idXR0b24gXHJcbiAgICBjb2xvcj1cInByaW1hcnlcIiBcclxuICAgIChjbGljayk9XCJjb25maXJtKGlucHV0LnZhbHVlKVwiPk9LXHJcbiAgPC9idXR0b24+XHJcbjwvZGl2PlxyXG4iXX0=
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1wb3B1cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBVSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLGtCQUFrQixFQUNuQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsNkJBQTZCLEVBQzdCLGVBQWUsRUFDZiwyQkFBMkIsR0FDNUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUNBekMsNENBQ3NFO0lBQXRFLHlOQUFVLGVBQUEs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ZUFBNEI7UUFBNUIsOENBQTRCO1FBQ3BELGVBQTBCO1FBQTFCLDRDQUEwQjtRQUMzQyxlQUNGO1FBREUsdUZBQ0Y7UUFDbUIsZUFBOEI7UUFBOUIsZ0RBQThCO1FBQy9DLGVBQ0Y7UUFERSw0RkFDRjtRQUlFLGVBQW9DO1FBQXBDLDZEQUFvQztRQW9GcEMsZUFBb0M7UUFBcEMsNkRBQW9DOzt1RkR4RTdCLGtCQUFrQjtjQUw5QixTQUFTOzJCQUNFLDBCQUEwQjs7c0JBa0NqQyxNQUFNO3VCQUFDLGVBQWU7d0JBN0JoQixXQUFXO2tCQUFuQixLQUFLO1lBQ0csU0FBUztrQkFBakIsS0FBSztZQUNHLHNCQUFzQjtrQkFBOUIsS0FBSztZQUNHLGlCQUFpQjtrQkFBekIsS0FBSztZQUNHLGVBQWU7a0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29vcmRpbmF0ZXNVbml0LCBHZW9tZXRyeVR5cGUsIExhYmVsVHlwZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LmVudW0nO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICdvbC9wcm9qJztcclxuaW1wb3J0IHsgSWdvTWFwLCByb3VuZENvb3JkVG8gfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkJztcclxuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcclxuaW1wb3J0IHtcclxuICBtZWFzdXJlT2xHZW9tZXRyeUxlbmd0aCxcclxuICBtZWFzdXJlT2xHZW9tZXRyeUFyZWEsXHJcbiAgbWV0ZXJzVG9Vbml0LFxyXG4gIHNxdWFyZU1ldGVyc1RvVW5pdFxyXG59IGZyb20gJy4uLy4uL21lYXN1cmUvc2hhcmVkL21lYXN1cmUudXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIE1lYXN1cmVMZW5ndGhVbml0LFxyXG4gIE1lYXN1cmVMZW5ndGhVbml0QWJicmV2aWF0aW9uLFxyXG4gIE1lYXN1cmVBcmVhVW5pdCxcclxuICBNZWFzdXJlQXJlYVVuaXRBYmJyZXZpYXRpb24sXHJcbn0gZnJvbSAnLi4vLi4vbWVhc3VyZS9zaGFyZWQvbWVhc3VyZS5lbnVtJztcclxuXHJcbmltcG9ydCB7ZnJvbUNpcmNsZX0gZnJvbSAnb2wvZ2VvbS9Qb2x5Z29uJztcclxuaW1wb3J0IHsgZ2V0TGVuZ3RoIH0gZnJvbSAnb2wvc3BoZXJlJztcclxuaW1wb3J0IENpcmNsZSBmcm9tICdvbC9nZW9tL0NpcmNsZSc7XHJcbmltcG9ydCB7IEREdG9ETVMgfSBmcm9tICcuLi9zaGFyZWQvZHJhdy51dGlscyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZ28tZHJhdy1wb3B1cC1jb21wb25lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kcmF3LXBvcHVwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kcmF3LXBvcHVwLmNvbXBvbmVudC5zY3NzJ11cclxuICB9KVxyXG5leHBvcnQgY2xhc3MgRHJhd1BvcHVwQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maXJtRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGxhYmVsRmxhZzogTGFiZWxUeXBlIHwgW0xhYmVsVHlwZSwgTGFiZWxUeXBlXSA9IExhYmVsVHlwZS5DdXN0b207XHJcbiAgQElucHV0KCkgY29vcmRpbmF0ZXNNZWFzdXJlVW5pdDogQ29vcmRpbmF0ZXNVbml0O1xyXG4gIEBJbnB1dCgpIGxlbmd0aE1lYXN1cmVVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdDtcclxuICBASW5wdXQoKSBhcmVhTWVhc3VyZVVuaXQ6IE1lYXN1cmVBcmVhVW5pdDtcclxuXHJcbiAgcHVibGljIGdlb21ldHJ5VHlwZSA9IEdlb21ldHJ5VHlwZTtcclxuICBwdWJsaWMgbGFiZWxUeXBlID0gTGFiZWxUeXBlO1xyXG4gIHB1YmxpYyBhcnJheUJ1aWx0SW5UeXBlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgY3VycmVudExhYmVsOiBzdHJpbmc7XHJcbiAgcHVibGljIGN1cnJlbnRDb29yZGluYXRlczogc3RyaW5nO1xyXG4gIHB1YmxpYyBjdXJyZW50QXJlYTogc3RyaW5nO1xyXG4gIHB1YmxpYyBjdXJyZW50TGVuZ3RoOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBvbEdlb21ldHJ5VHlwZTogR2VvbWV0cnlUeXBlID0gdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBsZW5ndGhJbk1ldGVyczogc3RyaW5nO1xyXG4gIHB1YmxpYyBhcmVhSW5NZXRlcnNTcXVhcmU6IHN0cmluZztcclxuICBwdWJsaWMgY29vcmRpbmF0ZXNJbkREOiBzdHJpbmc7XHJcbiAgcHVibGljIGN1cnJlbnRDb29yZGluYXRlc1VuaXQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBsb25nbGF0REQ6IFtudW1iZXIsIG51bWJlcl07XHJcbiAgcHJpdmF0ZSBsYWJlbExlbmd0aDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgcG9seWdvbkNoZWNrID0gMDsgLy8gQ291bnQgZm9yIHBvbHlnb24gbGFiZWwgdHlwZXMgY2hlY2tib3hlc1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RHJhd1BvcHVwQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogeyBvbEdlb21ldHJ5OiBhbnksIG1hcDogSWdvTWFwIH1cclxuICAgICkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYWJlbCA9IHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldCgnZHJhdycpO1xyXG4gICAgICB0aGlzLmxhYmVsTGVuZ3RoID0gdGhpcy5jdXJyZW50TGFiZWwgPyB0aGlzLmN1cnJlbnRMYWJlbC5sZW5ndGg6IDA7XHJcbiAgICAgIGxldCBvbEdlb21ldHJ5O1xyXG5cclxuICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMuZGF0YS5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKTtcclxuXHJcbiAgICAgIGlmKHRoaXMuZGF0YS5vbEdlb21ldHJ5IGluc3RhbmNlb2YgT2xGZWF0dXJlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldCgncmFkJykpe1xyXG4gICAgICAgICAgY29uc3QgbG9uZ2l0dWRlTGF0aXR1ZGUgPSBbdGhpcy5kYXRhLm9sR2VvbWV0cnkuZ2V0KCdsb25naXR1ZGUnKSwgdGhpcy5kYXRhLm9sR2VvbWV0cnkuZ2V0KCdsYXRpdHVkZScpXTtcclxuICAgICAgICAgIHRoaXMub2xHZW9tZXRyeVR5cGUgPSBHZW9tZXRyeVR5cGUuQ2lyY2xlO1xyXG4gICAgICAgICAgb2xHZW9tZXRyeSA9IG5ldyBDaXJjbGUobG9uZ2l0dWRlTGF0aXR1ZGUsIHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldCgncmFkJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgdGhpcy5vbEdlb21ldHJ5VHlwZSA9IHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldEdlb21ldHJ5KCkuZ2V0VHlwZSgpO1xyXG4gICAgICAgICAgb2xHZW9tZXRyeSA9IHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldCgnZ2VvbWV0cnknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICB0aGlzLm9sR2VvbWV0cnlUeXBlID0gdGhpcy5kYXRhLm9sR2VvbWV0cnkuZ2V0VHlwZSgpO1xyXG4gICAgICAgIG9sR2VvbWV0cnkgPSB0aGlzLmRhdGEub2xHZW9tZXRyeTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5Qb2ludCB8fCB0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuQ2lyY2xlKXtcclxuICAgICAgICBpZih0aGlzLmRhdGEub2xHZW9tZXRyeSBpbnN0YW5jZW9mIE9sRmVhdHVyZSl7XHJcbiAgICAgICAgICBsZXQgbG9uZ2l0dWRlID0gdGhpcy5kYXRhLm9sR2VvbWV0cnkuZ2V0KCdsb25naXR1ZGUnKTtcclxuICAgICAgICAgIGxldCBsYXRpdHVkZSA9IHRoaXMuZGF0YS5vbEdlb21ldHJ5LmdldCgnbGF0aXR1ZGUnKTtcclxuICAgICAgICAgIHRoaXMubG9uZ2xhdEREID0gcm91bmRDb29yZFRvKFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgNSk7XHJcbiAgICAgICAgICB0aGlzLmNvb3JkaW5hdGVzSW5ERCA9ICcoJyArIGxhdGl0dWRlICsgJywgJ1xyXG4gICAgICAgICAgKyBsb25naXR1ZGUgKyAnKSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHBvaW50NDMyNiA9IHRyYW5zZm9ybShcclxuICAgICAgICAgICAgdGhpcy5kYXRhLm9sR2VvbWV0cnkuZ2V0RmxhdENvb3JkaW5hdGVzKCksXHJcbiAgICAgICAgICAgIHByb2plY3Rpb24sXHJcbiAgICAgICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5sb25nbGF0REQgPSByb3VuZENvb3JkVG8oW3BvaW50NDMyNlswXSwgcG9pbnQ0MzI2WzFdXSwgNSk7XHJcbiAgICAgICAgICB0aGlzLmNvb3JkaW5hdGVzSW5ERCA9XHJcbiAgICAgICAgICAgICcoJyArIHRoaXMubG9uZ2xhdEREWzFdICsgJywgJyArIHRoaXMubG9uZ2xhdEREWzBdICsgJyknO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRDb29yZGluYXRlcyA9IHRoaXMuY29vcmRpbmF0ZXNJbkREO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuTGluZVN0cmluZyl7XHJcbiAgICAgICAgdGhpcy5sZW5ndGhJbk1ldGVycyA9IG1lYXN1cmVPbEdlb21ldHJ5TGVuZ3RoKG9sR2VvbWV0cnksIHByb2plY3Rpb24uZ2V0Q29kZSgpKS50b0ZpeGVkKDIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudExlbmd0aCA9IHRoaXMubGVuZ3RoSW5NZXRlcnM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLlBvbHlnb24pe1xyXG4gICAgICAgIHRoaXMubGVuZ3RoSW5NZXRlcnMgPSBtZWFzdXJlT2xHZW9tZXRyeUxlbmd0aChvbEdlb21ldHJ5LCBwcm9qZWN0aW9uLmdldENvZGUoKSkudG9GaXhlZCgyKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMZW5ndGggPSB0aGlzLmxlbmd0aEluTWV0ZXJzO1xyXG4gICAgICAgIHRoaXMuYXJlYUluTWV0ZXJzU3F1YXJlID0gbWVhc3VyZU9sR2VvbWV0cnlBcmVhKG9sR2VvbWV0cnkscHJvamVjdGlvbi5nZXRDb2RlKCkpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXJlYSA9IHRoaXMuYXJlYUluTWV0ZXJzU3F1YXJlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLkNpcmNsZSl7XHJcbiAgICAgICAgbGV0IGNpcmN1bGFyUG9seWdvbiA9IGZyb21DaXJjbGUob2xHZW9tZXRyeSwgMTAwMDApO1xyXG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZ2V0UmFkaXVzKGNpcmN1bGFyUG9seWdvbik7XHJcbiAgICAgICAgdGhpcy5sZW5ndGhJbk1ldGVycyA9IHJhZGl1cy50b0ZpeGVkKDIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudExlbmd0aCA9IHRoaXMubGVuZ3RoSW5NZXRlcnM7XHJcbiAgICAgICAgdGhpcy5hcmVhSW5NZXRlcnNTcXVhcmUgPSBtZWFzdXJlT2xHZW9tZXRyeUFyZWEoY2lyY3VsYXJQb2x5Z29uLHByb2plY3Rpb24uZ2V0Q29kZSgpKS50b0ZpeGVkKDIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEFyZWEgPSB0aGlzLmFyZWFJbk1ldGVyc1NxdWFyZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGEub2xHZW9tZXRyeS5nZXQoJ2xhYmVsVHlwZScpID09PSBMYWJlbFR5cGUuQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICB0aGlzLm9uTGFiZWxUeXBlQ2hhbmdlKExhYmVsVHlwZS5QcmVkZWZpbmVkKTtcclxuICAgICAgICB0aGlzLm9uTGFiZWxUeXBlQ2hhbmdlKExhYmVsVHlwZS5Db29yZGluYXRlcywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5jb29yZGluYXRlc01lYXN1cmVVbml0ID0gZGF0YS5vbEdlb21ldHJ5LmdldCgnbWVhc3VyZVVuaXQnKTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLm9sR2VvbWV0cnkuZ2V0KCdsYWJlbFR5cGUnKSA9PT0gTGFiZWxUeXBlLkxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMub25MYWJlbFR5cGVDaGFuZ2UoTGFiZWxUeXBlLlByZWRlZmluZWQpO1xyXG4gICAgICAgIHRoaXMub25MYWJlbFR5cGVDaGFuZ2UoTGFiZWxUeXBlLkxlbmd0aCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5sZW5ndGhNZWFzdXJlVW5pdCA9IGRhdGEub2xHZW9tZXRyeS5nZXQoJ21lYXN1cmVVbml0Jyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5vbEdlb21ldHJ5LmdldCgnbGFiZWxUeXBlJykgPT09IExhYmVsVHlwZS5BcmVhKSB7XHJcbiAgICAgICAgdGhpcy5vbkxhYmVsVHlwZUNoYW5nZShMYWJlbFR5cGUuUHJlZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5vbkxhYmVsVHlwZUNoYW5nZShMYWJlbFR5cGUuQXJlYSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hcmVhTWVhc3VyZVVuaXQgPSBkYXRhLm9sR2VvbWV0cnkuZ2V0KCdtZWFzdXJlVW5pdCcpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEub2xHZW9tZXRyeS5nZXQoJ2xhYmVsVHlwZScpPy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICB0aGlzLm9uTGFiZWxUeXBlQ2hhbmdlKExhYmVsVHlwZS5QcmVkZWZpbmVkKTtcclxuICAgICAgICB0aGlzLm9uTGFiZWxUeXBlQ2hhbmdlKExhYmVsVHlwZS5MZW5ndGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMub25MYWJlbFR5cGVDaGFuZ2UoTGFiZWxUeXBlLkFyZWEsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubGVuZ3RoTWVhc3VyZVVuaXQgPSBkYXRhLm9sR2VvbWV0cnkuZ2V0KCdtZWFzdXJlVW5pdCcpWzBdO1xyXG4gICAgICAgIHRoaXMuYXJlYU1lYXN1cmVVbml0ID0gZGF0YS5vbEdlb21ldHJ5LmdldCgnbWVhc3VyZVVuaXQnKVsxXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmJ1aWxkQXJyYXlUeXBlKCk7XHJcbiAgICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhUTUwgSW50ZXJhY3Rpb25zXHJcbiAgICovXHJcblxyXG4gIGNhbmNlbERyYXdpbmcoKSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybShpbnB1dD86IHN0cmluZykge1xyXG4gICAgdGhpcy5jb25maXJtRmxhZyA9IHRydWU7XHJcbiAgICBpZih0aGlzLmxhYmVsRmxhZyA9PT0gTGFiZWxUeXBlLlByZWRlZmluZWQpe1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5sYWJlbEZsYWcgPT09IExhYmVsVHlwZS5DdXN0b20pe1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7XHJcbiAgICAgICAgbGFiZWw6IGlucHV0XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLmxhYmVsRmxhZyA9PT0gTGFiZWxUeXBlLkNvb3JkaW5hdGVzKXtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLmN1cnJlbnRDb29yZGluYXRlcyxcclxuICAgICAgICBtZWFzdXJlVW5pdDogdGhpcy5jb29yZGluYXRlc01lYXN1cmVVbml0XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLlBvbHlnb24pIHtcclxuICAgICAgaWYgKHRoaXMucG9seWdvbkNoZWNrID09PSAyKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbEZsYWcgPSBbTGFiZWxUeXBlLkxlbmd0aCwgTGFiZWxUeXBlLkFyZWFdO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHtcclxuICAgICAgICAgIGxhYmVsOiAnUDogJyArIHRoaXMuY3VycmVudExlbmd0aCArICcgJyArIE1lYXN1cmVMZW5ndGhVbml0QWJicmV2aWF0aW9uW01lYXN1cmVMZW5ndGhVbml0Lk1ldGVyc10gKyAnXFxuJ1xyXG4gICAgICAgICAgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kcmF3LmxhYmVsVHlwZS5BJykgKyB0aGlzLmN1cnJlbnRBcmVhICsgJyAnICtcclxuICAgICAgICAgIE1lYXN1cmVBcmVhVW5pdEFiYnJldmlhdGlvbltNZWFzdXJlQXJlYVVuaXQuU3F1YXJlTWV0ZXJzXSwgbWVhc3VyZVVuaXQ6IFt0aGlzLmxlbmd0aE1lYXN1cmVVbml0LCB0aGlzLmFyZWFNZWFzdXJlVW5pdF1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxhYmVsRmxhZyA9PT0gTGFiZWxUeXBlLkxlbmd0aCA/XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgICAgbGFiZWw6ICdQOiAnICsgdGhpcy5jdXJyZW50TGVuZ3RoICsgJyAnICsgTWVhc3VyZUxlbmd0aFVuaXRBYmJyZXZpYXRpb25bdGhpcy5sZW5ndGhNZWFzdXJlVW5pdF0sXHJcbiAgICAgICAgICBtZWFzdXJlVW5pdDogdGhpcy5sZW5ndGhNZWFzdXJlVW5pdFxyXG4gICAgICAgIH0pIDpcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7XHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5jdXJyZW50QXJlYSArICcgJyArIE1lYXN1cmVBcmVhVW5pdEFiYnJldmlhdGlvblt0aGlzLmFyZWFNZWFzdXJlVW5pdF0sXHJcbiAgICAgICAgICBtZWFzdXJlVW5pdDogdGhpcy5hcmVhTWVhc3VyZVVuaXRcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5sYWJlbEZsYWcgPT09IExhYmVsVHlwZS5MZW5ndGgpe1xyXG4gICAgICBpZiAodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLkNpcmNsZSl7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgICAgbGFiZWw6ICdSOiAnICsgdGhpcy5jdXJyZW50TGVuZ3RoICsgJyAnICsgTWVhc3VyZUxlbmd0aFVuaXRBYmJyZXZpYXRpb25bdGhpcy5sZW5ndGhNZWFzdXJlVW5pdF0sXHJcbiAgICAgICAgICBtZWFzdXJlVW5pdDogdGhpcy5sZW5ndGhNZWFzdXJlVW5pdFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5MaW5lU3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgICAgbGFiZWw6IHRoaXMuY3VycmVudExlbmd0aCArICcgJyArIE1lYXN1cmVMZW5ndGhVbml0QWJicmV2aWF0aW9uW3RoaXMubGVuZ3RoTWVhc3VyZVVuaXRdLFxyXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHRoaXMubGVuZ3RoTWVhc3VyZVVuaXRcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5sYWJlbEZsYWcgPT09IExhYmVsVHlwZS5BcmVhKXtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLmN1cnJlbnRBcmVhICsgJyAnICsgTWVhc3VyZUFyZWFVbml0QWJicmV2aWF0aW9uW3RoaXMuYXJlYU1lYXN1cmVVbml0XSxcclxuICAgICAgICBtZWFzdXJlVW5pdDogdGhpcy5hcmVhTWVhc3VyZVVuaXRcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkxhYmVsVHlwZUNoYW5nZShsYWJlbFR5cGU6IExhYmVsVHlwZSwgY2hlY2tlZD86IGJvb2xlYW4pe1xyXG4gICAgaWYgKGxhYmVsVHlwZSAhPT0gTGFiZWxUeXBlLlByZWRlZmluZWQgJiZcclxuICAgICAgbGFiZWxUeXBlICE9PSBMYWJlbFR5cGUuQ3VzdG9tICYmXHJcbiAgICAgIHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5Qb2x5Z29uKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUJ1aWx0SW5UeXBlLmZpbmQodHlwZSA9PiB0eXBlLnZhbHVlID09PSBsYWJlbFR5cGUpID9cclxuICAgICAgICAgIHRoaXMuYXJyYXlCdWlsdEluVHlwZS5maW5kKHR5cGUgPT4gdHlwZS52YWx1ZSA9PT0gbGFiZWxUeXBlKS5jaGVja2VkID0gY2hlY2tlZCA6IHRoaXMubGFiZWxGbGFnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGNoZWNrZWQgPyB0aGlzLmxhYmVsRmxhZyA9IGxhYmVsVHlwZSA6IHRoaXMubGFiZWxGbGFnID0gdGhpcy5hcnJheUJ1aWx0SW5UeXBlLmZpbmQodHlwZSA9PiB0eXBlLmNoZWNrZWQpPy52YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWxGbGFnID0gbGFiZWxUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsYWJlbFR5cGUgPT09IExhYmVsVHlwZS5QcmVkZWZpbmVkKXtcclxuICAgICAgaWYgKHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5Qb2ludCApe1xyXG4gICAgICAgIHRoaXMubGFiZWxGbGFnID0gTGFiZWxUeXBlLkNvb3JkaW5hdGVzO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvb3JkaW5hdGVzID0gdGhpcy5jb29yZGluYXRlc0luREQ7XHJcbiAgICAgICAgdGhpcy5jb29yZGluYXRlc01lYXN1cmVVbml0ID0gQ29vcmRpbmF0ZXNVbml0LkRlY2ltYWxEZWdyZWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLkxpbmVTdHJpbmcpe1xyXG4gICAgICAgIHRoaXMubGFiZWxGbGFnID0gTGFiZWxUeXBlLkxlbmd0aDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMZW5ndGggPSB0aGlzLmxlbmd0aEluTWV0ZXJzO1xyXG4gICAgICAgIHRoaXMubGVuZ3RoTWVhc3VyZVVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGxhYmVsVHlwZSA9PT0gTGFiZWxUeXBlLkFyZWEpe1xyXG4gICAgICB0aGlzLmN1cnJlbnRBcmVhID0gdGhpcy5hcmVhSW5NZXRlcnNTcXVhcmU7XHJcbiAgICAgIHRoaXMuYXJlYU1lYXN1cmVVbml0ID0gTWVhc3VyZUFyZWFVbml0LlNxdWFyZU1ldGVycztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGxhYmVsVHlwZSA9PT0gTGFiZWxUeXBlLkxlbmd0aCl7XHJcbiAgICAgIHRoaXMuY3VycmVudExlbmd0aCA9IHRoaXMubGVuZ3RoSW5NZXRlcnM7XHJcbiAgICAgIHRoaXMubGVuZ3RoTWVhc3VyZVVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnM7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmxhYmVsRmxhZyA9PT0gTGFiZWxUeXBlLkNvb3JkaW5hdGVzKXtcclxuICAgICAgdGhpcy5jdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmNvb3JkaW5hdGVzSW5ERDtcclxuICAgICAgdGhpcy5jb29yZGluYXRlc01lYXN1cmVVbml0ID0gQ29vcmRpbmF0ZXNVbml0LkRlY2ltYWxEZWdyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGFiZWx0eXBlcyA9IFt0aGlzLmxhYmVsVHlwZS5MZW5ndGgsIHRoaXMubGFiZWxUeXBlLkFyZWFdO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuUG9seWdvbiAmJlxyXG4gICAgICBsYWJlbHR5cGVzLmluY2x1ZGVzKGxhYmVsVHlwZSkpIHtcclxuICAgICAgY2hlY2tlZCA/IHRoaXMucG9seWdvbkNoZWNrICs9IDEgOiB0aGlzLnBvbHlnb25DaGVjayAtPSAxOztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9seWdvbkNoZWNrID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlTGVuZ3RoVW5pdChsZW5ndGhVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCl7XHJcbiAgICB0aGlzLmxlbmd0aE1lYXN1cmVVbml0ID0gbGVuZ3RoVW5pdDtcclxuICAgIHRoaXMuY3VycmVudExlbmd0aCA9IG1ldGVyc1RvVW5pdChOdW1iZXIodGhpcy5sZW5ndGhJbk1ldGVycyksIGxlbmd0aFVuaXQpLnRvRml4ZWQoMik7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUFyZWFVbml0KGFyZWFVbml0OiBNZWFzdXJlQXJlYVVuaXQpe1xyXG4gICAgdGhpcy5hcmVhTWVhc3VyZVVuaXQgPSBhcmVhVW5pdDtcclxuICAgIHRoaXMuY3VycmVudEFyZWEgPSBzcXVhcmVNZXRlcnNUb1VuaXQoTnVtYmVyKHRoaXMuYXJlYUluTWV0ZXJzU3F1YXJlKSwgYXJlYVVuaXQpLnRvRml4ZWQoMik7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUNvb3JkaW5hdGVVbml0KGNvb3JkaW5hdGVzVW5pdDogQ29vcmRpbmF0ZXNVbml0KXtcclxuICAgIHRoaXMuY29vcmRpbmF0ZXNNZWFzdXJlVW5pdCA9IGNvb3JkaW5hdGVzVW5pdDtcclxuICAgIGxldCBjb29yZGluYXRlcyA9IEREdG9ETVModGhpcy5sb25nbGF0REQsIGNvb3JkaW5hdGVzVW5pdCk7XHJcbiAgICB0aGlzLmN1cnJlbnRDb29yZGluYXRlcyA9ICcoJyArIGNvb3JkaW5hdGVzWzFdICsgJywgJyArIGNvb3JkaW5hdGVzWzBdICsgJyknO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRBcnJheVR5cGUoKSB7XHJcbiAgICBmb3IgKGNvbnN0IGxhYmVsVHlwZSBvZiBPYmplY3QudmFsdWVzKExhYmVsVHlwZSkpe1xyXG4gICAgICBpZiAobGFiZWxUeXBlICE9PSBMYWJlbFR5cGUuQ3VzdG9tICYmIGxhYmVsVHlwZSAhPT0gTGFiZWxUeXBlLlByZWRlZmluZWQpe1xyXG4gICAgICAgIHRoaXMuYXJyYXlCdWlsdEluVHlwZS5wdXNoKHtcclxuICAgICAgICAgIHZhbHVlOiBsYWJlbFR5cGUsXHJcbiAgICAgICAgICBjaGVja2VkOlxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbnMobGFiZWxUeXBlKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsRmxhZyA9PT0gbGFiZWxUeXBlIHx8XHJcbiAgICAgICAgICAgICh0aGlzLnBvbHlnb25DaGVjayA9PT0gMiAmJiBsYWJlbFR5cGUgIT09IExhYmVsVHlwZS5Db29yZGluYXRlcylcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm9MYWJlbEJ1dHRvbigpe1xyXG4gICAgaWYgKHRoaXMubGFiZWxGbGFnID09PSBMYWJlbFR5cGUuUHJlZGVmaW5lZCB8fCAodGhpcy5sYWJlbEZsYWcgPT09IExhYmVsVHlwZS5DdXN0b20gJiYgdGhpcy5sYWJlbExlbmd0aCA9PT0gMCkpe1xyXG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZHJhdy5ub0xhYmVsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICdPSyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tT3JQcmVkZWZpbmVkKCl7XHJcbiAgICBpZiAodGhpcy5sYWJlbEZsYWcgPT09IExhYmVsVHlwZS5DdXN0b20pe1xyXG4gICAgICByZXR1cm4gTGFiZWxUeXBlLkN1c3RvbTtcclxuICAgIH1cclxuICAgIHJldHVybiBMYWJlbFR5cGUuUHJlZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9wdGlvbkF2YWlsYWJsZShjdXJyZW50T3B0aW9uOiBMYWJlbFR5cGUpe1xyXG4gICAgc3dpdGNoKHRoaXMub2xHZW9tZXRyeVR5cGUpe1xyXG4gICAgICBjYXNlIEdlb21ldHJ5VHlwZS5Qb2ludDpcclxuICAgICAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gTGFiZWxUeXBlLkNvb3JkaW5hdGVzKXtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGNhc2UgR2VvbWV0cnlUeXBlLkxpbmVTdHJpbmc6XHJcbiAgICAgICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IExhYmVsVHlwZS5MZW5ndGgpe1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgY2FzZSBHZW9tZXRyeVR5cGUuUG9seWdvbjpcclxuICAgICAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gTGFiZWxUeXBlLkNvb3JkaW5hdGVzKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbExlbmd0aFVuaXRzKCk6IHN0cmluZ1tde1xyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoTWVhc3VyZUxlbmd0aFVuaXQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGVuZ3RoVW5pdEVudW0obGVuZ3RoVW5pdDogTWVhc3VyZUxlbmd0aFVuaXQpe1xyXG4gICAgcmV0dXJuIE1lYXN1cmVMZW5ndGhVbml0QWJicmV2aWF0aW9uW2xlbmd0aFVuaXRdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbEFyZWFVbml0cygpOiBzdHJpbmdbXXtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKE1lYXN1cmVBcmVhVW5pdCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsQ29vcmRpbmF0ZXNVbml0cygpOiBzdHJpbmdbXXtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKENvb3JkaW5hdGVzVW5pdCk7XHJcbiAgfVxyXG5cclxuICBnZXRBcmVhVW5pdEVudW0oYXJlYVVuaXQ6IE1lYXN1cmVBcmVhVW5pdCl7XHJcbiAgICByZXR1cm4gTWVhc3VyZUFyZWFVbml0QWJicmV2aWF0aW9uW2FyZWFVbml0XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmFkaXVzKG9sR2VvbWV0cnkpOiBudW1iZXJ7XHJcbiAgICBjb25zdCBsZW5ndGggPSBnZXRMZW5ndGgob2xHZW9tZXRyeSk7XHJcbiAgICByZXR1cm4gTnVtYmVyKGxlbmd0aCAvICgyICogTWF0aC5QSSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxlbmd0aExhYmVsVCgpe1xyXG4gICAgaWYgKHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5Qb2x5Z29uKXtcclxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLm1lYXN1cmUucGVyaW1ldGVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vbEdlb21ldHJ5VHlwZSA9PT0gR2VvbWV0cnlUeXBlLkNpcmNsZSl7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5zZWFyY2guY29vcmRpbmF0ZXMucmFkaXVzJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZHJhdy5sYWJlbFR5cGUuTGVuZ3RoJyk7XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbExlbmd0aChldmVudD8pe1xyXG4gICAgdGhpcy5sYWJlbExlbmd0aCA9IGV2ZW50Lmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHNlbGVjdE9wdGlvbnMob3B0aW9uKXtcclxuICAgIGlmICh0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuUG9pbnQpe1xyXG4gICAgICByZXR1cm4gb3B0aW9uID09PSBMYWJlbFR5cGUuQ29vcmRpbmF0ZXM7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuTGluZVN0cmluZyl7XHJcbiAgICAgIHJldHVybiBvcHRpb24gPT09IExhYmVsVHlwZS5MZW5ndGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcm9wZXJMZW5ndGhMYWJlbChvcHRpb24pe1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gTGFiZWxUeXBlLkxlbmd0aCl7XHJcbiAgICAgIGlmICh0aGlzLm9sR2VvbWV0cnlUeXBlID09PSBHZW9tZXRyeVR5cGUuUG9seWdvbil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLm1lYXN1cmUucGVyaW1ldGVyJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMub2xHZW9tZXRyeVR5cGUgPT09IEdlb21ldHJ5VHlwZS5DaXJjbGUpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5zZWFyY2guY29vcmRpbmF0ZXMucmFkaXVzJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcubGFiZWxUeXBlLkxlbmd0aCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcubGFiZWxUeXBlLicgKyBvcHRpb24pO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXY+XHJcbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+XHJcbiAgICB7eyAnaWdvLmdlby5kcmF3LnBvcHVwVGl0bGUnIHwgdHJhbnNsYXRlIH19XHJcbiAgPC9oMj5cclxuPC9kaXY+XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cImdlb21ldHJ5LXR5cGUtdG9nZ2xlIG1hdC10eXBvZ3JhcGh5XCI+XHJcbiAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXHJcbiAgICAoY2hhbmdlKT1cIm9uTGFiZWxUeXBlQ2hhbmdlKCRldmVudC52YWx1ZSlcIiBbdmFsdWVdPVwiY3VzdG9tT3JQcmVkZWZpbmVkXCI+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImxhYmVsVHlwZS5DdXN0b21cIiA+XHJcbiAgICAgIHt7ICdpZ28uZ2VvLmRyYXcubGFiZWxUeXBlLmN1c3RvbScgfCB0cmFuc2xhdGUgfX1cclxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImxhYmVsVHlwZS5QcmVkZWZpbmVkXCI+XHJcbiAgICAgIHt7ICdpZ28uZ2VvLmRyYXcubGFiZWxUeXBlLnByZWRlZmluZWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImxhYmVsRmxhZyAhPT0gbGFiZWxUeXBlLkN1c3RvbVwiPlxyXG4gIDxkaXY+XHJcbiAgICA8cCBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCI+e3sgJ2lnby5nZW8uZHJhdy5idWlsdEluSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvcD5cclxuICAgIDxtYXQtcmFkaW8tZ3JvdXAgKm5nSWY9XCJvbEdlb21ldHJ5VHlwZSAhPT0gJ1BvbHlnb24nXCIgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGFycmF5QnVpbHRJblR5cGVcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCIgW2Rpc2FibGVkXT1cIm9wdGlvbkF2YWlsYWJsZShvcHRpb24udmFsdWUpXCIgXHJcbiAgICAgIChjaGFuZ2UpPVwib25MYWJlbFR5cGVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiIFtjaGVja2VkXT1cIm9wdGlvbi5jaGVja2VkXCI+XHJcbiAgICAgICAge3tnZXRQcm9wZXJMZW5ndGhMYWJlbChvcHRpb24udmFsdWUpfX1cclxuICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICA8bmctY29udGFpbmVyIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIiAqbmdJZj1cIm9sR2VvbWV0cnlUeXBlID09PSAnUG9seWdvbidcIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgYXJyYXlCdWlsdEluVHlwZVwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiXHJcbiAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbkF2YWlsYWJsZShvcHRpb24udmFsdWUpXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uTGFiZWxUeXBlQ2hhbmdlKCRldmVudC5zb3VyY2UudmFsdWUsICRldmVudC5jaGVja2VkKVwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwib3B0aW9uLmNoZWNrZWRcIj5cclxuICAgICAgICB7e2dldFByb3Blckxlbmd0aExhYmVsKG9wdGlvbi52YWx1ZSl9fVxyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPGRpdiAqbmdJZj1cImxhYmVsRmxhZyA9PT0gbGFiZWxUeXBlLkNvb3JkaW5hdGVzXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInJlYWRPbmx5LUlucHV0XCI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAjaW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIihMYXRpdHVkZSwgTG9uZ2l0dWRlKVwiXHJcbiAgICAgICAgICB2YWx1ZT1cInt7Y3VycmVudENvb3JkaW5hdGVzfX1cIiByZWFkb25seT5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidW5pdC1maWVsZFwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJjb29yZGluYXRlc01lYXN1cmVVbml0XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNoYW5nZUNvb3JkaW5hdGVVbml0KCRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1bml0IG9mIGFsbENvb3JkaW5hdGVzVW5pdHNcIiBbdmFsdWVdPVwidW5pdFwiPlxyXG4gICAgICAgICAgICB7e3VuaXR9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD4gIFxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwibGFiZWxGbGFnID09PSBsYWJlbFR5cGUuTGVuZ3RoIHx8IHBvbHlnb25DaGVjayA9PT0gMlwiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJyZWFkT25seS1JbnB1dFwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgI2lucHV0XHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3tsZW5ndGhMYWJlbFR9fVxyXG4gICAgICAgICAgdmFsdWU9XCJ7e2N1cnJlbnRMZW5ndGh9fVwiIHJlYWRvbmx5PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1bml0LWZpZWxkXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImxlbmd0aE1lYXN1cmVVbml0XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNoYW5nZUxlbmd0aFVuaXQoJGV2ZW50LnZhbHVlKVwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHVuaXQgb2YgYWxsTGVuZ3RoVW5pdHNcIiBbdmFsdWVdPVwidW5pdFwiPlxyXG4gICAgICAgICAgICB7e2dldExlbmd0aFVuaXRFbnVtKHVuaXQpfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+ICBcclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImxhYmVsRmxhZyA9PT0gbGFiZWxUeXBlLkFyZWEgfHwgcG9seWdvbkNoZWNrID09PSAyXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInJlYWRPbmx5LUlucHV0XCI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAjaW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdpZ28uZ2VvLmRyYXcubGFiZWxUeXBlLkFyZWEnIHwgdHJhbnNsYXRlIH19XCJcclxuICAgICAgICAgIHZhbHVlPVwie3tjdXJyZW50QXJlYX19XCIgcmVhZG9ubHk+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInVuaXQtZmllbGRcIj5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiYXJlYU1lYXN1cmVVbml0XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNoYW5nZUFyZWFVbml0KCRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1bml0IG9mIGFsbEFyZWFVbml0c1wiIFt2YWx1ZV09XCJ1bml0XCI+XHJcbiAgICAgICAgICAgIHt7Z2V0QXJlYVVuaXRFbnVtKHVuaXQpfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcblxyXG4gIDxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsRHJhd2luZygpXCIgPlxyXG4gICAgICB7eydpZ28uZ2VvLmRyYXcuY2FuY2VsJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gXHJcbiAgICAgIG1hdC1yYWlzZWQtYnV0dG9uIFxyXG4gICAgICBjb2xvcj1cInByaW1hcnlcIiBcclxuICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiPiBcclxuICAgICAge3tub0xhYmVsQnV0dG9uKCl9fSBcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJsYWJlbEZsYWcgPT09IGxhYmVsVHlwZS5DdXN0b21cIj5cclxuICA8ZGl2PlxyXG4gICAgPHAgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPnt7ICdpZ28uZ2VvLmRyYXcuZGlhbG9nSW5zdHJ1Y3Rpb24nIHwgdHJhbnNsYXRlIH19PC9wPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXRcIj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgI2lucHV0XHJcbiAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAoc2VsZWN0KT1cInRydWVcIlxyXG4gICAgICAgIChpbnB1dCk9XCJnZXRMYWJlbExlbmd0aCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRyYXcuZGlhbG9nVGl0bGUnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgIHZhbHVlPVwie3sgY3VycmVudExhYmVsIH19XCJcclxuICAgICAgICBjZGtGb2N1c0luaXRpYWwvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuICBcclxuICA8ZGl2IG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImNhbmNlbERyYXdpbmcoKVwiID5cclxuICAgICAge3snaWdvLmdlby5kcmF3LmNhbmNlbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXHJcbiAgICAgIChjbGljayk9XCJjb25maXJtKGlucHV0LnZhbHVlKVwiPlxyXG4gICAgICB7e25vTGFiZWxCdXR0b24oKX19XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==