@igo2/integration 1.14.2 → 1.14.3
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.
- package/esm2020/igo2-integration.mjs +4 -4
- package/esm2020/lib/about/about-tool/about-tool.component.mjs +184 -184
- package/esm2020/lib/about/about-tool/index.mjs +1 -1
- package/esm2020/lib/about/about.module.mjs +54 -54
- package/esm2020/lib/about/index.mjs +1 -1
- package/esm2020/lib/analytics/analytics-listener.service.mjs +71 -71
- package/esm2020/lib/analytics/analytics.module.mjs +15 -15
- package/esm2020/lib/analytics/index.mjs +1 -1
- package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +112 -112
- package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +28 -28
- package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +88 -88
- package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +28 -28
- package/esm2020/lib/catalog/catalog.module.mjs +23 -23
- package/esm2020/lib/catalog/catalog.state.mjs +53 -53
- package/esm2020/lib/catalog/index.mjs +5 -5
- package/esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs +33 -33
- package/esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs +43 -43
- package/esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +24 -24
- package/esm2020/lib/context/context-share-tool/context-share-tool.component.mjs +33 -33
- package/esm2020/lib/context/context.module.mjs +38 -38
- package/esm2020/lib/context/context.state.mjs +87 -87
- package/esm2020/lib/context/index.mjs +5 -5
- package/esm2020/lib/directions/directions-tool/directions-tool.component.mjs +86 -86
- package/esm2020/lib/directions/directions-tool/index.mjs +1 -1
- package/esm2020/lib/directions/directions.module.mjs +25 -25
- package/esm2020/lib/directions/directions.state.mjs +63 -63
- package/esm2020/lib/directions/index.mjs +2 -2
- package/esm2020/lib/draw/draw.module.mjs +20 -20
- package/esm2020/lib/draw/draw.state.mjs +39 -39
- package/esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs +71 -71
- package/esm2020/lib/draw/index.mjs +2 -2
- package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +9 -9
- package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +43 -43
- package/esm2020/lib/filter/active-ogc-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +9 -9
- package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +43 -43
- package/esm2020/lib/filter/active-time-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/filter.module.mjs +50 -50
- package/esm2020/lib/filter/index.mjs +5 -5
- package/esm2020/lib/filter/ogc-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +24 -24
- package/esm2020/lib/filter/spatial-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +534 -534
- package/esm2020/lib/filter/time-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs +24 -24
- package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +136 -136
- package/esm2020/lib/import-export/import-export-tool/index.mjs +1 -1
- package/esm2020/lib/import-export/import-export.module.mjs +47 -47
- package/esm2020/lib/import-export/import-export.state.mjs +40 -40
- package/esm2020/lib/import-export/index.mjs +2 -2
- package/esm2020/lib/integration.module.mjs +71 -71
- package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +472 -472
- package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +88 -88
- package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +217 -217
- package/esm2020/lib/map/advanced-map-tool/index.mjs +1 -1
- package/esm2020/lib/map/index.mjs +8 -8
- package/esm2020/lib/map/layer-list-tool.state.mjs +41 -41
- package/esm2020/lib/map/map-details-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +255 -255
- package/esm2020/lib/map/map-legend/index.mjs +1 -1
- package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +274 -274
- package/esm2020/lib/map/map-proximity-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +205 -205
- package/esm2020/lib/map/map-proximity.state.mjs +162 -162
- package/esm2020/lib/map/map-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-tool/map-tool.component.mjs +129 -129
- package/esm2020/lib/map/map-tools/index.mjs +1 -1
- package/esm2020/lib/map/map-tools/map-tools.component.mjs +477 -477
- package/esm2020/lib/map/map.module.mjs +140 -140
- package/esm2020/lib/map/map.state.mjs +46 -46
- package/esm2020/lib/measure/index.mjs +3 -3
- package/esm2020/lib/measure/measure.module.mjs +19 -19
- package/esm2020/lib/measure/measure.state.mjs +34 -34
- package/esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs +44 -44
- package/esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs +24 -24
- package/esm2020/lib/print/index.mjs +1 -1
- package/esm2020/lib/print/print-tool/index.mjs +1 -1
- package/esm2020/lib/print/print-tool/print-tool.component.mjs +32 -32
- package/esm2020/lib/print/print.module.mjs +25 -25
- package/esm2020/lib/search/index.mjs +6 -6
- package/esm2020/lib/search/query.state.mjs +33 -33
- package/esm2020/lib/search/search-bar/search-bar-binding.directive.mjs +60 -60
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +21 -21
- package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +592 -592
- package/esm2020/lib/search/search-results-tool/search-results-tool.module.mjs +64 -64
- package/esm2020/lib/search/search.module.mjs +23 -23
- package/esm2020/lib/search/search.state.mjs +106 -106
- package/esm2020/lib/storage/index.mjs +1 -1
- package/esm2020/lib/storage/storage.module.mjs +15 -15
- package/esm2020/lib/storage/storage.state.mjs +22 -22
- package/esm2020/lib/tool/index.mjs +1 -1
- package/esm2020/lib/tool/tool.module.mjs +15 -15
- package/esm2020/lib/tool/tool.state.mjs +51 -51
- package/esm2020/lib/workspace/index.mjs +3 -3
- package/esm2020/lib/workspace/shared/edition-actions.service.mjs +155 -155
- package/esm2020/lib/workspace/shared/feature-actions.service.mjs +143 -143
- package/esm2020/lib/workspace/shared/index.mjs +2 -2
- package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +157 -157
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +6 -6
- package/esm2020/lib/workspace/workspace-button/index.mjs +1 -1
- package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +68 -68
- package/esm2020/lib/workspace/workspace.module.mjs +36 -36
- package/esm2020/lib/workspace/workspace.state.mjs +187 -187
- package/esm2020/public_api.mjs +34 -34
- package/fesm2015/igo2-integration.mjs +6450 -6450
- package/fesm2020/igo2-integration.mjs +6009 -6009
- package/index.d.ts +5 -5
- package/lib/about/about-tool/about-tool.component.d.ts +34 -34
- package/lib/about/about-tool/index.d.ts +1 -1
- package/lib/about/about.module.d.ts +16 -16
- package/lib/about/index.d.ts +1 -1
- package/lib/analytics/analytics-listener.service.d.ts +27 -27
- package/lib/analytics/analytics.module.d.ts +6 -6
- package/lib/analytics/index.d.ts +1 -1
- package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +57 -57
- package/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.d.ts +12 -12
- package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +50 -50
- package/lib/catalog/catalog-library-tool/catalog-library-tool.module.d.ts +12 -12
- package/lib/catalog/catalog.module.d.ts +8 -8
- package/lib/catalog/catalog.state.d.ts +37 -37
- package/lib/catalog/index.d.ts +5 -5
- package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +9 -9
- package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +15 -15
- package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +5 -5
- package/lib/context/context-share-tool/context-share-tool.component.d.ts +13 -13
- package/lib/context/context.module.d.ts +11 -11
- package/lib/context/context.state.d.ts +37 -37
- package/lib/context/index.d.ts +5 -5
- package/lib/directions/directions-tool/directions-tool.component.d.ts +54 -54
- package/lib/directions/directions-tool/index.d.ts +1 -1
- package/lib/directions/directions.module.d.ts +10 -10
- package/lib/directions/directions.state.d.ts +28 -28
- package/lib/directions/index.d.ts +2 -2
- package/lib/draw/draw.module.d.ts +8 -8
- package/lib/draw/draw.state.d.ts +17 -17
- package/lib/draw/drawing-tool/drawing-tool.component.d.ts +31 -31
- package/lib/draw/index.d.ts +2 -2
- package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.d.ts +2 -2
- package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +12 -12
- package/lib/filter/active-ogc-filter-tool/index.d.ts +1 -1
- package/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.d.ts +2 -2
- package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +12 -12
- package/lib/filter/active-time-filter-tool/index.d.ts +1 -1
- package/lib/filter/filter.module.d.ts +15 -15
- package/lib/filter/index.d.ts +5 -5
- package/lib/filter/ogc-filter-tool/index.d.ts +1 -1
- package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +6 -6
- package/lib/filter/spatial-filter-tool/index.d.ts +1 -1
- package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +82 -82
- package/lib/filter/time-filter-tool/index.d.ts +1 -1
- package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +6 -6
- package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +31 -31
- package/lib/import-export/import-export-tool/index.d.ts +1 -1
- package/lib/import-export/import-export.module.d.ts +15 -15
- package/lib/import-export/import-export.state.d.ts +24 -24
- package/lib/import-export/index.d.ts +2 -2
- package/lib/integration.module.d.ts +20 -20
- package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +97 -97
- package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +12 -12
- package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +65 -65
- package/lib/map/advanced-map-tool/index.d.ts +1 -1
- package/lib/map/index.d.ts +8 -8
- package/lib/map/layer-list-tool.state.d.ts +19 -19
- package/lib/map/map-details-tool/index.d.ts +1 -1
- package/lib/map/map-details-tool/map-details-tool.component.d.ts +38 -38
- package/lib/map/map-legend/index.d.ts +1 -1
- package/lib/map/map-legend/map-legend-tool.component.d.ts +40 -40
- package/lib/map/map-proximity-tool/index.d.ts +1 -1
- package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +36 -36
- package/lib/map/map-proximity.state.d.ts +28 -28
- package/lib/map/map-tool/index.d.ts +1 -1
- package/lib/map/map-tool/map-tool.component.d.ts +27 -27
- package/lib/map/map-tools/index.d.ts +1 -1
- package/lib/map/map-tools/map-tools.component.d.ts +65 -65
- package/lib/map/map.module.d.ts +38 -38
- package/lib/map/map.state.d.ts +24 -24
- package/lib/measure/index.d.ts +3 -3
- package/lib/measure/measure.module.d.ts +7 -7
- package/lib/measure/measure.state.d.ts +16 -16
- package/lib/measure/measurer-tool/measurer-tool.component.d.ts +24 -24
- package/lib/measure/measurer-tool/measurer-tool.module.d.ts +11 -11
- package/lib/print/index.d.ts +1 -1
- package/lib/print/print-tool/index.d.ts +1 -1
- package/lib/print/print-tool/print-tool.component.d.ts +10 -10
- package/lib/print/print.module.d.ts +10 -10
- package/lib/search/index.d.ts +6 -6
- package/lib/search/query.state.d.ts +20 -20
- package/lib/search/search-bar/search-bar-binding.directive.d.ts +20 -20
- package/lib/search/search-bar/search-bar.module.d.ts +11 -11
- package/lib/search/search-results-tool/search-results-tool.component.d.ts +101 -101
- package/lib/search/search-results-tool/search-results-tool.module.d.ts +18 -18
- package/lib/search/search.module.d.ts +8 -8
- package/lib/search/search.state.d.ts +54 -54
- package/lib/storage/index.d.ts +1 -1
- package/lib/storage/storage.module.d.ts +6 -6
- package/lib/storage/storage.state.d.ts +12 -12
- package/lib/tool/index.d.ts +1 -1
- package/lib/tool/tool.module.d.ts +6 -6
- package/lib/tool/tool.state.d.ts +22 -22
- package/lib/workspace/index.d.ts +3 -3
- package/lib/workspace/shared/edition-actions.service.d.ts +26 -26
- package/lib/workspace/shared/feature-actions.service.d.ts +25 -25
- package/lib/workspace/shared/index.d.ts +2 -2
- package/lib/workspace/shared/wfs-actions.service.d.ts +27 -27
- package/lib/workspace/shared/workspace.utils.d.ts +2 -2
- package/lib/workspace/workspace-button/index.d.ts +1 -1
- package/lib/workspace/workspace-button/workspace-button.component.d.ts +21 -21
- package/lib/workspace/workspace.module.d.ts +12 -12
- package/lib/workspace/workspace.state.d.ts +63 -63
- package/package.json +3 -3
- package/public_api.d.ts +31 -31
package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs
CHANGED
|
@@ -1,473 +1,473 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { formatScale } from '@igo2/geo';
|
|
3
|
-
import { Clipboard } from '@igo2/utils';
|
|
4
|
-
import { StorageScope } from '@igo2/core';
|
|
5
|
-
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
6
|
-
import { Validators } from '@angular/forms';
|
|
7
|
-
import { debounceTime } from 'rxjs/operators';
|
|
8
|
-
import { zoneMtm, zoneUtm, computeProjectionsConstraints } from '@igo2/geo';
|
|
9
|
-
import * as olproj from 'ol/proj';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../../map.state";
|
|
12
|
-
import * as i2 from "@igo2/core";
|
|
13
|
-
import * as i3 from "@angular/forms";
|
|
14
|
-
import * as i4 from "@angular/material/form-field";
|
|
15
|
-
import * as i5 from "@angular/material/select";
|
|
16
|
-
import * as i6 from "@angular/material/core";
|
|
17
|
-
import * as i7 from "@angular/material/input";
|
|
18
|
-
import * as i8 from "@angular/common";
|
|
19
|
-
import * as i9 from "@angular/material/icon";
|
|
20
|
-
import * as i10 from "@angular/material/slide-toggle";
|
|
21
|
-
import * as i11 from "@angular/material/button";
|
|
22
|
-
import * as i12 from "@ngx-translate/core";
|
|
23
|
-
function AdvancedCoordinatesComponent_mat_form_field_0_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
-
i0.ɵɵelementStart(0, "mat-form-field", 12);
|
|
25
|
-
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
26
|
-
i0.ɵɵpipe(3, "translate");
|
|
27
|
-
i0.ɵɵelementEnd();
|
|
28
|
-
} if (rf & 2) {
|
|
29
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
30
|
-
i0.ɵɵadvance(1);
|
|
31
|
-
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lon"))("value", ctx_r0.coordinates[0]);
|
|
32
|
-
} }
|
|
33
|
-
function AdvancedCoordinatesComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
-
i0.ɵɵelementStart(0, "mat-form-field", 12);
|
|
35
|
-
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
36
|
-
i0.ɵɵpipe(3, "translate");
|
|
37
|
-
i0.ɵɵelementEnd();
|
|
38
|
-
} if (rf & 2) {
|
|
39
|
-
const ctx_r2 = i0.ɵɵnextContext();
|
|
40
|
-
i0.ɵɵadvance(1);
|
|
41
|
-
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.est"))("value", ctx_r2.coordinates[0]);
|
|
42
|
-
} }
|
|
43
|
-
function AdvancedCoordinatesComponent_mat_form_field_3_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
-
i0.ɵɵelementStart(0, "mat-form-field", 15);
|
|
45
|
-
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
46
|
-
i0.ɵɵpipe(3, "translate");
|
|
47
|
-
i0.ɵɵelementEnd();
|
|
48
|
-
} if (rf & 2) {
|
|
49
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
50
|
-
i0.ɵɵadvance(1);
|
|
51
|
-
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lat"))("value", ctx_r3.coordinates[1]);
|
|
52
|
-
} }
|
|
53
|
-
function AdvancedCoordinatesComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
-
i0.ɵɵelementStart(0, "mat-form-field", 15);
|
|
55
|
-
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
56
|
-
i0.ɵɵpipe(3, "translate");
|
|
57
|
-
i0.ɵɵelementEnd();
|
|
58
|
-
} if (rf & 2) {
|
|
59
|
-
const ctx_r5 = i0.ɵɵnextContext();
|
|
60
|
-
i0.ɵɵadvance(1);
|
|
61
|
-
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.nord"))("value", ctx_r5.coordinates[1]);
|
|
62
|
-
} }
|
|
63
|
-
function AdvancedCoordinatesComponent_mat_option_16_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
-
i0.ɵɵelementStart(0, "mat-option", 16);
|
|
65
|
-
i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_mat_option_16_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
|
|
66
|
-
i0.ɵɵtext(1);
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
} if (rf & 2) {
|
|
69
|
-
const projection_r11 = ctx.$implicit;
|
|
70
|
-
i0.ɵɵproperty("value", projection_r11);
|
|
71
|
-
i0.ɵɵadvance(1);
|
|
72
|
-
i0.ɵɵtextInterpolate1(" ", projection_r11.translatedValue || projection_r11.alias, " ");
|
|
73
|
-
} }
|
|
74
|
-
/**
|
|
75
|
-
* Tool to display the coordinates and a cursor of the center of the map
|
|
76
|
-
*/
|
|
77
|
-
export class AdvancedCoordinatesComponent {
|
|
78
|
-
constructor(mapState, languageService, messageService, cdRef, storageService, config, formBuilder) {
|
|
79
|
-
this.mapState = mapState;
|
|
80
|
-
this.languageService = languageService;
|
|
81
|
-
this.messageService = messageService;
|
|
82
|
-
this.cdRef = cdRef;
|
|
83
|
-
this.storageService = storageService;
|
|
84
|
-
this.config = config;
|
|
85
|
-
this.formBuilder = formBuilder;
|
|
86
|
-
this.formattedScale$ = new BehaviorSubject('');
|
|
87
|
-
this.projections$ = new BehaviorSubject([]);
|
|
88
|
-
this.center = this.storageService.get('centerToggle');
|
|
89
|
-
this.inMtmZone = true;
|
|
90
|
-
this.inLambert2 = { 32198: true, 3798: true };
|
|
91
|
-
this._projectionsLimitations = {};
|
|
92
|
-
this.defaultProj = {
|
|
93
|
-
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
|
|
94
|
-
translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
|
|
95
|
-
};
|
|
96
|
-
this.currentZones = { utm: undefined, mtm: undefined };
|
|
97
|
-
this.units = true;
|
|
98
|
-
this.computeProjections();
|
|
99
|
-
this.buildForm();
|
|
100
|
-
}
|
|
101
|
-
get map() {
|
|
102
|
-
return this.mapState.map;
|
|
103
|
-
}
|
|
104
|
-
get inputProj() {
|
|
105
|
-
return this.form.get('inputProj').value;
|
|
106
|
-
}
|
|
107
|
-
set inputProj(value) {
|
|
108
|
-
this.form.patchValue({ inputProj: value });
|
|
109
|
-
}
|
|
110
|
-
get projectionsLimitations() {
|
|
111
|
-
return this._projectionsLimitations || {};
|
|
112
|
-
}
|
|
113
|
-
set projectionsLimitations(value) {
|
|
114
|
-
this._projectionsLimitations = value;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Listen a state of the map, a state of a form, update the coordinates
|
|
118
|
-
*/
|
|
119
|
-
ngOnInit() {
|
|
120
|
-
this.mapState$$ = combineLatest([this.map.viewController.state$.pipe(debounceTime(50)), this.form.valueChanges])
|
|
121
|
-
.subscribe(() => {
|
|
122
|
-
this.setScaleValue(this.map);
|
|
123
|
-
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
124
|
-
const currentMtmZone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
125
|
-
const currentUtmZone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
126
|
-
if (!this.inMtmZone && currentMtmZone !== this.currentZones.mtm) {
|
|
127
|
-
this.back2quebec();
|
|
128
|
-
}
|
|
129
|
-
let zoneChange = false;
|
|
130
|
-
if (currentMtmZone !== this.currentZones.mtm) {
|
|
131
|
-
this.currentZones.mtm = currentMtmZone;
|
|
132
|
-
zoneChange = true;
|
|
133
|
-
}
|
|
134
|
-
if (currentUtmZone !== this.currentZones.utm) {
|
|
135
|
-
this.currentZones.utm = currentUtmZone;
|
|
136
|
-
zoneChange = true;
|
|
137
|
-
}
|
|
138
|
-
if (zoneChange) {
|
|
139
|
-
this.updateProjectionsZoneChange();
|
|
140
|
-
}
|
|
141
|
-
this.checkLambert(this.currentCenterDefaultProj);
|
|
142
|
-
this.coordinates = this.getCoordinates();
|
|
143
|
-
this.cdRef.detectChanges();
|
|
144
|
-
this.storageService.set('currentProjection', this.inputProj, StorageScope.SESSION);
|
|
145
|
-
});
|
|
146
|
-
const tempInputProj = this.storageService.get('currentProjection');
|
|
147
|
-
this.inputProj = this.projections$.value[0];
|
|
148
|
-
if (tempInputProj !== null) {
|
|
149
|
-
const pos = this.positionInList(tempInputProj);
|
|
150
|
-
this.inputProj = this.projections$.value[pos];
|
|
151
|
-
this.updateZoneMtmUtm();
|
|
152
|
-
}
|
|
153
|
-
this.map.mapCenter$.next(this.center);
|
|
154
|
-
this.coordinates = this.getCoordinates();
|
|
155
|
-
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
156
|
-
}
|
|
157
|
-
ngOnDestroy() {
|
|
158
|
-
this.map.mapCenter$.next(false);
|
|
159
|
-
this.mapState$$.unsubscribe();
|
|
160
|
-
}
|
|
161
|
-
setScaleValue(map) {
|
|
162
|
-
this.formattedScale$.next(': ~ 1 / ' + formatScale(map.viewController.getScale()));
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Coordinates of the center of the map on the appropriate systeme of coordinates
|
|
166
|
-
* @returns Array of two numbers
|
|
167
|
-
*/
|
|
168
|
-
getCoordinates() {
|
|
169
|
-
this.currentZones.mtm = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
170
|
-
this.currentZones.utm = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
171
|
-
let coord;
|
|
172
|
-
const code = this.inputProj.code;
|
|
173
|
-
let decimal = 2;
|
|
174
|
-
if (code.includes('EPSG:4326') || code.includes('EPSG:4269')) {
|
|
175
|
-
decimal = 5;
|
|
176
|
-
}
|
|
177
|
-
this.units = (code === 'EPSG:4326' || code === 'EPSG:4269');
|
|
178
|
-
coord = this.map.viewController.getCenter(code).map(c => c.toFixed(decimal));
|
|
179
|
-
return coord;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Copy the coordinates to a clipboard
|
|
183
|
-
*/
|
|
184
|
-
copyTextToClipboard() {
|
|
185
|
-
const successful = Clipboard.copy(this.coordinates.toString());
|
|
186
|
-
if (successful) {
|
|
187
|
-
const translate = this.languageService.translate;
|
|
188
|
-
const title = translate.instant('igo.integration.advanced-map-tool.advanced-coordinates.copyTitle');
|
|
189
|
-
const msg = translate.instant('igo.integration.advanced-map-tool.advanced-coordinates.copyMsg');
|
|
190
|
-
this.messageService.success(msg, title);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Display a cursor on the center of the map
|
|
195
|
-
*/
|
|
196
|
-
displayCenter(toggle) {
|
|
197
|
-
this.center = toggle;
|
|
198
|
-
this.map.mapCenter$.next(toggle);
|
|
199
|
-
this.storageService.set('centerToggle', toggle, StorageScope.SESSION);
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Builder of the form
|
|
203
|
-
*/
|
|
204
|
-
buildForm() {
|
|
205
|
-
this.form = this.formBuilder.group({
|
|
206
|
-
inputProj: ['', [Validators.required]]
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Update list of projections after changing of the state of the map
|
|
211
|
-
*/
|
|
212
|
-
updateProjectionsZoneChange() {
|
|
213
|
-
let modifiedProj = this.projections$.value;
|
|
214
|
-
const translate = this.languageService.translate;
|
|
215
|
-
modifiedProj.map(p => {
|
|
216
|
-
if (p.translateKey === 'mtm') {
|
|
217
|
-
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
218
|
-
if (zone) {
|
|
219
|
-
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
220
|
-
p.alias = `MTM ${zone}`;
|
|
221
|
-
p.code = code;
|
|
222
|
-
p.zone = `${zone}`;
|
|
223
|
-
p.translatedValue = translate.instant('igo.geo.importExportForm.projections.mtm', p);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
p.alias = '';
|
|
227
|
-
this.inMtmZone = false;
|
|
228
|
-
if (this.inputProj.translateKey === 'mtm') {
|
|
229
|
-
this.inputProj = this.projections$.value[0];
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (p.translateKey === 'utm') {
|
|
234
|
-
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
235
|
-
const code = `EPSG:326${zone}`;
|
|
236
|
-
p.alias = `UTM ${zone}`;
|
|
237
|
-
p.code = code;
|
|
238
|
-
p.zone = `${zone}`;
|
|
239
|
-
p.translatedValue = translate.instant('igo.geo.importExportForm.projections.utm', p);
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
modifiedProj = modifiedProj.filter(p => p.alias !== '');
|
|
243
|
-
this.projections$.next(modifiedProj);
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Create a list of currents projections
|
|
247
|
-
*/
|
|
248
|
-
computeProjections() {
|
|
249
|
-
this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
|
|
250
|
-
const projections = [];
|
|
251
|
-
if (!this.currentCenterDefaultProj) {
|
|
252
|
-
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
253
|
-
}
|
|
254
|
-
const translate = this.languageService.translate;
|
|
255
|
-
if (this.projectionsConstraints.wgs84) {
|
|
256
|
-
projections.push({
|
|
257
|
-
translatedValue: translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
|
|
258
|
-
translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
if (this.projectionsConstraints.nad83) {
|
|
262
|
-
projections.push({
|
|
263
|
-
translatedValue: translate.instant('igo.geo.importExportForm.projections.nad83', { code: 'EPSG:4269' }),
|
|
264
|
-
translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: ''
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
if (this.projectionsConstraints.webMercator) {
|
|
268
|
-
projections.push({
|
|
269
|
-
translatedValue: translate.instant('igo.geo.importExportForm.projections.webMercator', { code: 'EPSG:3857' }),
|
|
270
|
-
translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: ''
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
if (this.projectionsConstraints.mtm) {
|
|
274
|
-
// Quebec
|
|
275
|
-
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
276
|
-
if (zone) {
|
|
277
|
-
this.inMtmZone = true;
|
|
278
|
-
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
279
|
-
projections.splice(3, 0, {
|
|
280
|
-
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
|
|
281
|
-
translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
this.inMtmZone = false;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (this.projectionsConstraints.utm) {
|
|
289
|
-
const order = this.inMtmZone ? 4 : 3;
|
|
290
|
-
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
291
|
-
const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
|
|
292
|
-
projections.splice(order, 0, {
|
|
293
|
-
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone }),
|
|
294
|
-
translateKey: 'utm', alias: `UTM ${zone}`, code, zone: `${zone}`
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
let configProjection = [];
|
|
298
|
-
if (this.projectionsConstraints.projFromConfig) {
|
|
299
|
-
configProjection = this.config.getConfig('projections') || [];
|
|
300
|
-
}
|
|
301
|
-
this.projections$.next(projections.concat(configProjection));
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Push the MTM in the array of systeme of coordinates
|
|
305
|
-
* @param projections Array of the InputProjections
|
|
306
|
-
*/
|
|
307
|
-
pushMtm(projections) {
|
|
308
|
-
if (this.projectionsConstraints.mtm) {
|
|
309
|
-
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
310
|
-
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
311
|
-
projections.splice(3, 0, {
|
|
312
|
-
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
|
|
313
|
-
translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Updates the list of systems of coordinates for territory of Quebec
|
|
319
|
-
* push MTM and UTM in the Array
|
|
320
|
-
*/
|
|
321
|
-
back2quebec() {
|
|
322
|
-
const projections = this.projections$.value;
|
|
323
|
-
this.pushMtm(projections);
|
|
324
|
-
this.inMtmZone = true;
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Update the numbers of the zones when application is restarted
|
|
328
|
-
*/
|
|
329
|
-
updateZoneMtmUtm() {
|
|
330
|
-
if (this.inputProj.translateKey === 'mtm') {
|
|
331
|
-
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
332
|
-
this.inputProj.alias = `MTM ${zone}`;
|
|
333
|
-
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
334
|
-
this.inputProj.code = code;
|
|
335
|
-
this.inputProj.zone = `${zone}`;
|
|
336
|
-
this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone });
|
|
337
|
-
}
|
|
338
|
-
if (this.inputProj.translateKey === 'utm') {
|
|
339
|
-
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
340
|
-
this.inputProj.alias = `UTM ${zone}`;
|
|
341
|
-
const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
|
|
342
|
-
this.inputProj.code = code;
|
|
343
|
-
this.inputProj.zone = `${zone}`;
|
|
344
|
-
this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone });
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Compute the position of a current projection in a list. 0 if the projection is not in the list
|
|
349
|
-
* @param translateKey string, translate key of a projection
|
|
350
|
-
* @returns numeric, position of an element in the array
|
|
351
|
-
*/
|
|
352
|
-
positionInList(tempInputProj) {
|
|
353
|
-
const tk = tempInputProj.translateKey;
|
|
354
|
-
const alias = tempInputProj.alias;
|
|
355
|
-
let position; // = undefined;
|
|
356
|
-
let iter = 0;
|
|
357
|
-
this.projections$.value.map((projection) => {
|
|
358
|
-
if (tk) {
|
|
359
|
-
if (tk === projection.translateKey) {
|
|
360
|
-
position = iter;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
else if (alias === projection.alias) {
|
|
364
|
-
position = iter;
|
|
365
|
-
}
|
|
366
|
-
iter++;
|
|
367
|
-
});
|
|
368
|
-
position = position ? position : 0;
|
|
369
|
-
return position;
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Change the list of projections depending on the projections of Lambert
|
|
373
|
-
* @param coordinates An array of numbers, longitude and latitude
|
|
374
|
-
*/
|
|
375
|
-
checkLambert(coordinates) {
|
|
376
|
-
const lambertProjections = this.config.getConfig('projections');
|
|
377
|
-
lambertProjections.forEach(projection => {
|
|
378
|
-
let modifiedProj = this.projections$.value;
|
|
379
|
-
const extent = projection.extent;
|
|
380
|
-
const code = projection.code.match(/\d+/);
|
|
381
|
-
const currentExtentWGS = olproj.transformExtent(extent, projection.code, this.defaultProj.code);
|
|
382
|
-
if (coordinates[0] < currentExtentWGS[0] || coordinates[0] > currentExtentWGS[2] ||
|
|
383
|
-
coordinates[1] < currentExtentWGS[1] || coordinates[1] > currentExtentWGS[3]) {
|
|
384
|
-
this.inLambert2[code] = false;
|
|
385
|
-
if (this.inputProj.alias === projection.alias) {
|
|
386
|
-
this.inputProj = this.projections$.value[0];
|
|
387
|
-
}
|
|
388
|
-
modifiedProj = modifiedProj.filter(p => p.alias !== projection.alias);
|
|
389
|
-
this.projections$.next(modifiedProj);
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
if (!this.inLambert2[code]) {
|
|
393
|
-
this.projections$.next(modifiedProj.concat(projection));
|
|
394
|
-
this.inLambert2[code] = true;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
AdvancedCoordinatesComponent.ɵfac = function AdvancedCoordinatesComponent_Factory(t) { return new (t || AdvancedCoordinatesComponent)(i0.ɵɵdirectiveInject(i1.MapState), i0.ɵɵdirectiveInject(i2.LanguageService), i0.ɵɵdirectiveInject(i2.MessageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.StorageService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.UntypedFormBuilder)); };
|
|
401
|
-
AdvancedCoordinatesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdvancedCoordinatesComponent, selectors: [["igo-advanced-coordinates"]], inputs: { projectionsLimitations: "projectionsLimitations" }, decls: 32, vars: 37, consts: [["class", "coordinates", 4, "ngIf", "ngIfElse"], ["elseBlock", ""], ["class", "coordinates2", 4, "ngIf", "ngIfElse"], ["elseBlock2", ""], ["mat-raised-button", "", 1, "igo-form-button-group", 3, "click"], ["svgIcon", "content-copy"], [1, "igo-form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], ["matTooltipShowDelay", "500", 3, "value", "click", 4, "ngFor", "ngForOf"], [1, "center-toggle", "mat-typography", 3, "checked", "labelPosition", "change"], [1, "igo-zoom", "mat-typography"], [1, "coordinates"], ["matInput", "", "readonly", "", "rows", "1", 3, "placeholder", "value"], ["textArea", ""], [1, "coordinates2"], ["matTooltipShowDelay", "500", 3, "value", "click"]], template: function AdvancedCoordinatesComponent_Template(rf, ctx) { if (rf & 1) {
|
|
402
|
-
i0.ɵɵtemplate(0, AdvancedCoordinatesComponent_mat_form_field_0_Template, 4, 4, "mat-form-field", 0);
|
|
403
|
-
i0.ɵɵtemplate(1, AdvancedCoordinatesComponent_ng_template_1_Template, 4, 4, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
404
|
-
i0.ɵɵtemplate(3, AdvancedCoordinatesComponent_mat_form_field_3_Template, 4, 4, "mat-form-field", 2);
|
|
405
|
-
i0.ɵɵtemplate(4, AdvancedCoordinatesComponent_ng_template_4_Template, 4, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
|
|
406
|
-
i0.ɵɵelementStart(6, "button", 4);
|
|
407
|
-
i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_Template_button_click_6_listener() { return ctx.copyTextToClipboard(); });
|
|
408
|
-
i0.ɵɵelement(7, "mat-icon", 5);
|
|
409
|
-
i0.ɵɵtext(8);
|
|
410
|
-
i0.ɵɵpipe(9, "translate");
|
|
411
|
-
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelementStart(10, "form", 6)(11, "mat-form-field", 7)(12, "mat-label");
|
|
413
|
-
i0.ɵɵtext(13);
|
|
414
|
-
i0.ɵɵpipe(14, "translate");
|
|
415
|
-
i0.ɵɵelementEnd();
|
|
416
|
-
i0.ɵɵelementStart(15, "mat-select", 8);
|
|
417
|
-
i0.ɵɵlistener("valueChange", function AdvancedCoordinatesComponent_Template_mat_select_valueChange_15_listener($event) { return ctx.inputProj = $event; });
|
|
418
|
-
i0.ɵɵtemplate(16, AdvancedCoordinatesComponent_mat_option_16_Template, 2, 2, "mat-option", 9);
|
|
419
|
-
i0.ɵɵpipe(17, "async");
|
|
420
|
-
i0.ɵɵelementEnd()();
|
|
421
|
-
i0.ɵɵelementStart(18, "mat-slide-toggle", 10);
|
|
422
|
-
i0.ɵɵlistener("change", function AdvancedCoordinatesComponent_Template_mat_slide_toggle_change_18_listener($event) { return ctx.displayCenter($event.checked); });
|
|
423
|
-
i0.ɵɵtext(19);
|
|
424
|
-
i0.ɵɵpipe(20, "translate");
|
|
425
|
-
i0.ɵɵelementEnd()();
|
|
426
|
-
i0.ɵɵelementStart(21, "p", 11);
|
|
427
|
-
i0.ɵɵtext(22);
|
|
428
|
-
i0.ɵɵpipe(23, "translate");
|
|
429
|
-
i0.ɵɵelementEnd();
|
|
430
|
-
i0.ɵɵelementStart(24, "p", 11);
|
|
431
|
-
i0.ɵɵtext(25);
|
|
432
|
-
i0.ɵɵpipe(26, "translate");
|
|
433
|
-
i0.ɵɵpipe(27, "async");
|
|
434
|
-
i0.ɵɵelementEnd();
|
|
435
|
-
i0.ɵɵelementStart(28, "p", 11);
|
|
436
|
-
i0.ɵɵtext(29);
|
|
437
|
-
i0.ɵɵpipe(30, "translate");
|
|
438
|
-
i0.ɵɵpipe(31, "number");
|
|
439
|
-
i0.ɵɵelementEnd();
|
|
440
|
-
} if (rf & 2) {
|
|
441
|
-
const _r1 = i0.ɵɵreference(2);
|
|
442
|
-
const _r4 = i0.ɵɵreference(5);
|
|
443
|
-
i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r1);
|
|
444
|
-
i0.ɵɵadvance(3);
|
|
445
|
-
i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r4);
|
|
446
|
-
i0.ɵɵadvance(5);
|
|
447
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 18, "igo.integration.advanced-map-tool.advanced-coordinates.copy"), "\n");
|
|
448
|
-
i0.ɵɵadvance(2);
|
|
449
|
-
i0.ɵɵproperty("formGroup", ctx.form);
|
|
450
|
-
i0.ɵɵadvance(3);
|
|
451
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 20, "igo.integration.advanced-map-tool.advanced-coordinates.coordSystem"));
|
|
452
|
-
i0.ɵɵadvance(2);
|
|
453
|
-
i0.ɵɵproperty("value", ctx.inputProj);
|
|
454
|
-
i0.ɵɵadvance(1);
|
|
455
|
-
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(17, 22, ctx.projections$));
|
|
456
|
-
i0.ɵɵadvance(2);
|
|
457
|
-
i0.ɵɵproperty("checked", ctx.center)("labelPosition", "before");
|
|
458
|
-
i0.ɵɵadvance(1);
|
|
459
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(20, 24, "igo.integration.advanced-map-tool.advanced-coordinates.center"), " ");
|
|
460
|
-
i0.ɵɵadvance(3);
|
|
461
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(23, 26, "igo.integration.advanced-map-tool.advanced-coordinates.zoom"), " ", ctx.map.viewController.getZoom(), "");
|
|
462
|
-
i0.ɵɵadvance(3);
|
|
463
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(26, 28, "igo.integration.advanced-map-tool.advanced-coordinates.scale"), " ", i0.ɵɵpipeBind1(27, 30, ctx.formattedScale$), "");
|
|
464
|
-
i0.ɵɵadvance(4);
|
|
465
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(30, 32, "igo.integration.advanced-map-tool.advanced-coordinates.resolution"), " ", i0.ɵɵpipeBind2(31, 34, ctx.map.viewController.getResolution(), "1.0-0"), "");
|
|
466
|
-
} }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatusGroup, i3.FormGroupDirective, i4.MatFormField, i4.MatLabel, i5.MatSelect, i6.MatOption, i7.MatInput, i8.NgForOf, i8.NgIf, i9.MatIcon, i10.MatSlideToggle, i11.MatButton, i8.AsyncPipe, i8.DecimalPipe, i12.TranslatePipe], styles: ["textarea[_ngcontent-%COMP%]{resize:none}mat-form-field[_ngcontent-%COMP%]{padding:10px 15px}mat-form-field.coordinates[_ngcontent-%COMP%]{width:120px}mat-form-field.coordinates2[_ngcontent-%COMP%]{width:120px;padding:0 10px 0 3px}mat-form-field.igo-input-container[_ngcontent-%COMP%]{width:60%;padding:0 15px}.igo-form-button-group[_ngcontent-%COMP%]{padding:0 10px;margin:0 10px}.center-toggle[_ngcontent-%COMP%]{padding:10px 15px 35px}mat-slide-toggle[_ngcontent-%COMP%]{font-size:small}.igo-zoom[_ngcontent-%COMP%]{padding:0 15px}"] });
|
|
467
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdvancedCoordinatesComponent, [{
|
|
468
|
-
type: Component,
|
|
469
|
-
args: [{ selector: 'igo-advanced-coordinates', template: "<mat-form-field *ngIf=\"units; else elseBlock\" class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lon' | translate\"\n [value]=\"coordinates[0]\"></textarea>\n</mat-form-field>\n<ng-template #elseBlock >\n <mat-form-field class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.est' | translate\"\n [value]=\"coordinates[0]\"></textarea></mat-form-field>\n</ng-template>\n\n<mat-form-field *ngIf=\"units; else elseBlock2\" class=\"coordinates2\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lat' | translate\"\n [value]=\"coordinates[1]\"></textarea>\n</mat-form-field>\n<ng-template #elseBlock2 >\n <mat-form-field class=\"coordinates2\"> <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.nord' | translate\"\n [value]=\"coordinates[1]\"></textarea></mat-form-field>\n</ng-template>\n\n<button class=\"igo-form-button-group\"\n mat-raised-button\n (click)=\"copyTextToClipboard()\">\n <mat-icon svgIcon=\"content-copy\"></mat-icon>\n {{ 'igo.integration.advanced-map-tool.advanced-coordinates.copy' | translate }}\n</button>\n\n<form class=\"igo-form\" [formGroup]=\"form\">\n <mat-form-field class=\"igo-input-container\">\n <mat-label>{{'igo.integration.advanced-map-tool.advanced-coordinates.coordSystem' | translate}}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option matTooltipShowDelay=\"500\"\n *ngFor=\"let projection of (projections$ | async)\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\">\n {{projection.translatedValue || projection.alias }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle class=\"center-toggle mat-typography\"\n [checked]=\"center\"\n [labelPosition]=\"'before'\"\n (change)=\"displayCenter($event.checked)\">\n {{'igo.integration.advanced-map-tool.advanced-coordinates.center' | translate}}\n </mat-slide-toggle> \n</form>\n\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.zoom' | translate}} {{map.viewController.getZoom() }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.scale' | translate}} {{ formattedScale$ | async }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.resolution' | translate}} {{map.viewController.getResolution() | number: '1.0-0' }}</p>", styles: ["textarea{resize:none}mat-form-field{padding:10px 15px}mat-form-field.coordinates{width:120px}mat-form-field.coordinates2{width:120px;padding:0 10px 0 3px}mat-form-field.igo-input-container{width:60%;padding:0 15px}.igo-form-button-group{padding:0 10px;margin:0 10px}.center-toggle{padding:10px 15px 35px}mat-slide-toggle{font-size:small}.igo-zoom{padding:0 15px}\n"] }]
|
|
470
|
-
}], function () { return [{ type: i1.MapState }, { type: i2.LanguageService }, { type: i2.MessageService }, { type: i0.ChangeDetectorRef }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i3.UntypedFormBuilder }]; }, { projectionsLimitations: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}] }); })();
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { formatScale } from '@igo2/geo';
|
|
3
|
+
import { Clipboard } from '@igo2/utils';
|
|
4
|
+
import { StorageScope } from '@igo2/core';
|
|
5
|
+
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
6
|
+
import { Validators } from '@angular/forms';
|
|
7
|
+
import { debounceTime } from 'rxjs/operators';
|
|
8
|
+
import { zoneMtm, zoneUtm, computeProjectionsConstraints } from '@igo2/geo';
|
|
9
|
+
import * as olproj from 'ol/proj';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../../map.state";
|
|
12
|
+
import * as i2 from "@igo2/core";
|
|
13
|
+
import * as i3 from "@angular/forms";
|
|
14
|
+
import * as i4 from "@angular/material/form-field";
|
|
15
|
+
import * as i5 from "@angular/material/select";
|
|
16
|
+
import * as i6 from "@angular/material/core";
|
|
17
|
+
import * as i7 from "@angular/material/input";
|
|
18
|
+
import * as i8 from "@angular/common";
|
|
19
|
+
import * as i9 from "@angular/material/icon";
|
|
20
|
+
import * as i10 from "@angular/material/slide-toggle";
|
|
21
|
+
import * as i11 from "@angular/material/button";
|
|
22
|
+
import * as i12 from "@ngx-translate/core";
|
|
23
|
+
function AdvancedCoordinatesComponent_mat_form_field_0_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
+
i0.ɵɵelementStart(0, "mat-form-field", 12);
|
|
25
|
+
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
26
|
+
i0.ɵɵpipe(3, "translate");
|
|
27
|
+
i0.ɵɵelementEnd();
|
|
28
|
+
} if (rf & 2) {
|
|
29
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
30
|
+
i0.ɵɵadvance(1);
|
|
31
|
+
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lon"))("value", ctx_r0.coordinates[0]);
|
|
32
|
+
} }
|
|
33
|
+
function AdvancedCoordinatesComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
+
i0.ɵɵelementStart(0, "mat-form-field", 12);
|
|
35
|
+
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
36
|
+
i0.ɵɵpipe(3, "translate");
|
|
37
|
+
i0.ɵɵelementEnd();
|
|
38
|
+
} if (rf & 2) {
|
|
39
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
40
|
+
i0.ɵɵadvance(1);
|
|
41
|
+
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.est"))("value", ctx_r2.coordinates[0]);
|
|
42
|
+
} }
|
|
43
|
+
function AdvancedCoordinatesComponent_mat_form_field_3_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
+
i0.ɵɵelementStart(0, "mat-form-field", 15);
|
|
45
|
+
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
46
|
+
i0.ɵɵpipe(3, "translate");
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
} if (rf & 2) {
|
|
49
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
50
|
+
i0.ɵɵadvance(1);
|
|
51
|
+
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lat"))("value", ctx_r3.coordinates[1]);
|
|
52
|
+
} }
|
|
53
|
+
function AdvancedCoordinatesComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
i0.ɵɵelementStart(0, "mat-form-field", 15);
|
|
55
|
+
i0.ɵɵelement(1, "textarea", 13, 14);
|
|
56
|
+
i0.ɵɵpipe(3, "translate");
|
|
57
|
+
i0.ɵɵelementEnd();
|
|
58
|
+
} if (rf & 2) {
|
|
59
|
+
const ctx_r5 = i0.ɵɵnextContext();
|
|
60
|
+
i0.ɵɵadvance(1);
|
|
61
|
+
i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.nord"))("value", ctx_r5.coordinates[1]);
|
|
62
|
+
} }
|
|
63
|
+
function AdvancedCoordinatesComponent_mat_option_16_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
+
i0.ɵɵelementStart(0, "mat-option", 16);
|
|
65
|
+
i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_mat_option_16_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
|
|
66
|
+
i0.ɵɵtext(1);
|
|
67
|
+
i0.ɵɵelementEnd();
|
|
68
|
+
} if (rf & 2) {
|
|
69
|
+
const projection_r11 = ctx.$implicit;
|
|
70
|
+
i0.ɵɵproperty("value", projection_r11);
|
|
71
|
+
i0.ɵɵadvance(1);
|
|
72
|
+
i0.ɵɵtextInterpolate1(" ", projection_r11.translatedValue || projection_r11.alias, " ");
|
|
73
|
+
} }
|
|
74
|
+
/**
|
|
75
|
+
* Tool to display the coordinates and a cursor of the center of the map
|
|
76
|
+
*/
|
|
77
|
+
export class AdvancedCoordinatesComponent {
|
|
78
|
+
constructor(mapState, languageService, messageService, cdRef, storageService, config, formBuilder) {
|
|
79
|
+
this.mapState = mapState;
|
|
80
|
+
this.languageService = languageService;
|
|
81
|
+
this.messageService = messageService;
|
|
82
|
+
this.cdRef = cdRef;
|
|
83
|
+
this.storageService = storageService;
|
|
84
|
+
this.config = config;
|
|
85
|
+
this.formBuilder = formBuilder;
|
|
86
|
+
this.formattedScale$ = new BehaviorSubject('');
|
|
87
|
+
this.projections$ = new BehaviorSubject([]);
|
|
88
|
+
this.center = this.storageService.get('centerToggle');
|
|
89
|
+
this.inMtmZone = true;
|
|
90
|
+
this.inLambert2 = { 32198: true, 3798: true };
|
|
91
|
+
this._projectionsLimitations = {};
|
|
92
|
+
this.defaultProj = {
|
|
93
|
+
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
|
|
94
|
+
translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
|
|
95
|
+
};
|
|
96
|
+
this.currentZones = { utm: undefined, mtm: undefined };
|
|
97
|
+
this.units = true;
|
|
98
|
+
this.computeProjections();
|
|
99
|
+
this.buildForm();
|
|
100
|
+
}
|
|
101
|
+
get map() {
|
|
102
|
+
return this.mapState.map;
|
|
103
|
+
}
|
|
104
|
+
get inputProj() {
|
|
105
|
+
return this.form.get('inputProj').value;
|
|
106
|
+
}
|
|
107
|
+
set inputProj(value) {
|
|
108
|
+
this.form.patchValue({ inputProj: value });
|
|
109
|
+
}
|
|
110
|
+
get projectionsLimitations() {
|
|
111
|
+
return this._projectionsLimitations || {};
|
|
112
|
+
}
|
|
113
|
+
set projectionsLimitations(value) {
|
|
114
|
+
this._projectionsLimitations = value;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Listen a state of the map, a state of a form, update the coordinates
|
|
118
|
+
*/
|
|
119
|
+
ngOnInit() {
|
|
120
|
+
this.mapState$$ = combineLatest([this.map.viewController.state$.pipe(debounceTime(50)), this.form.valueChanges])
|
|
121
|
+
.subscribe(() => {
|
|
122
|
+
this.setScaleValue(this.map);
|
|
123
|
+
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
124
|
+
const currentMtmZone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
125
|
+
const currentUtmZone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
126
|
+
if (!this.inMtmZone && currentMtmZone !== this.currentZones.mtm) {
|
|
127
|
+
this.back2quebec();
|
|
128
|
+
}
|
|
129
|
+
let zoneChange = false;
|
|
130
|
+
if (currentMtmZone !== this.currentZones.mtm) {
|
|
131
|
+
this.currentZones.mtm = currentMtmZone;
|
|
132
|
+
zoneChange = true;
|
|
133
|
+
}
|
|
134
|
+
if (currentUtmZone !== this.currentZones.utm) {
|
|
135
|
+
this.currentZones.utm = currentUtmZone;
|
|
136
|
+
zoneChange = true;
|
|
137
|
+
}
|
|
138
|
+
if (zoneChange) {
|
|
139
|
+
this.updateProjectionsZoneChange();
|
|
140
|
+
}
|
|
141
|
+
this.checkLambert(this.currentCenterDefaultProj);
|
|
142
|
+
this.coordinates = this.getCoordinates();
|
|
143
|
+
this.cdRef.detectChanges();
|
|
144
|
+
this.storageService.set('currentProjection', this.inputProj, StorageScope.SESSION);
|
|
145
|
+
});
|
|
146
|
+
const tempInputProj = this.storageService.get('currentProjection');
|
|
147
|
+
this.inputProj = this.projections$.value[0];
|
|
148
|
+
if (tempInputProj !== null) {
|
|
149
|
+
const pos = this.positionInList(tempInputProj);
|
|
150
|
+
this.inputProj = this.projections$.value[pos];
|
|
151
|
+
this.updateZoneMtmUtm();
|
|
152
|
+
}
|
|
153
|
+
this.map.mapCenter$.next(this.center);
|
|
154
|
+
this.coordinates = this.getCoordinates();
|
|
155
|
+
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
156
|
+
}
|
|
157
|
+
ngOnDestroy() {
|
|
158
|
+
this.map.mapCenter$.next(false);
|
|
159
|
+
this.mapState$$.unsubscribe();
|
|
160
|
+
}
|
|
161
|
+
setScaleValue(map) {
|
|
162
|
+
this.formattedScale$.next(': ~ 1 / ' + formatScale(map.viewController.getScale()));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Coordinates of the center of the map on the appropriate systeme of coordinates
|
|
166
|
+
* @returns Array of two numbers
|
|
167
|
+
*/
|
|
168
|
+
getCoordinates() {
|
|
169
|
+
this.currentZones.mtm = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
170
|
+
this.currentZones.utm = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
171
|
+
let coord;
|
|
172
|
+
const code = this.inputProj.code;
|
|
173
|
+
let decimal = 2;
|
|
174
|
+
if (code.includes('EPSG:4326') || code.includes('EPSG:4269')) {
|
|
175
|
+
decimal = 5;
|
|
176
|
+
}
|
|
177
|
+
this.units = (code === 'EPSG:4326' || code === 'EPSG:4269');
|
|
178
|
+
coord = this.map.viewController.getCenter(code).map(c => c.toFixed(decimal));
|
|
179
|
+
return coord;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Copy the coordinates to a clipboard
|
|
183
|
+
*/
|
|
184
|
+
copyTextToClipboard() {
|
|
185
|
+
const successful = Clipboard.copy(this.coordinates.toString());
|
|
186
|
+
if (successful) {
|
|
187
|
+
const translate = this.languageService.translate;
|
|
188
|
+
const title = translate.instant('igo.integration.advanced-map-tool.advanced-coordinates.copyTitle');
|
|
189
|
+
const msg = translate.instant('igo.integration.advanced-map-tool.advanced-coordinates.copyMsg');
|
|
190
|
+
this.messageService.success(msg, title);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Display a cursor on the center of the map
|
|
195
|
+
*/
|
|
196
|
+
displayCenter(toggle) {
|
|
197
|
+
this.center = toggle;
|
|
198
|
+
this.map.mapCenter$.next(toggle);
|
|
199
|
+
this.storageService.set('centerToggle', toggle, StorageScope.SESSION);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Builder of the form
|
|
203
|
+
*/
|
|
204
|
+
buildForm() {
|
|
205
|
+
this.form = this.formBuilder.group({
|
|
206
|
+
inputProj: ['', [Validators.required]]
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Update list of projections after changing of the state of the map
|
|
211
|
+
*/
|
|
212
|
+
updateProjectionsZoneChange() {
|
|
213
|
+
let modifiedProj = this.projections$.value;
|
|
214
|
+
const translate = this.languageService.translate;
|
|
215
|
+
modifiedProj.map(p => {
|
|
216
|
+
if (p.translateKey === 'mtm') {
|
|
217
|
+
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
218
|
+
if (zone) {
|
|
219
|
+
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
220
|
+
p.alias = `MTM ${zone}`;
|
|
221
|
+
p.code = code;
|
|
222
|
+
p.zone = `${zone}`;
|
|
223
|
+
p.translatedValue = translate.instant('igo.geo.importExportForm.projections.mtm', p);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
p.alias = '';
|
|
227
|
+
this.inMtmZone = false;
|
|
228
|
+
if (this.inputProj.translateKey === 'mtm') {
|
|
229
|
+
this.inputProj = this.projections$.value[0];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (p.translateKey === 'utm') {
|
|
234
|
+
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
235
|
+
const code = `EPSG:326${zone}`;
|
|
236
|
+
p.alias = `UTM ${zone}`;
|
|
237
|
+
p.code = code;
|
|
238
|
+
p.zone = `${zone}`;
|
|
239
|
+
p.translatedValue = translate.instant('igo.geo.importExportForm.projections.utm', p);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
modifiedProj = modifiedProj.filter(p => p.alias !== '');
|
|
243
|
+
this.projections$.next(modifiedProj);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create a list of currents projections
|
|
247
|
+
*/
|
|
248
|
+
computeProjections() {
|
|
249
|
+
this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
|
|
250
|
+
const projections = [];
|
|
251
|
+
if (!this.currentCenterDefaultProj) {
|
|
252
|
+
this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
|
|
253
|
+
}
|
|
254
|
+
const translate = this.languageService.translate;
|
|
255
|
+
if (this.projectionsConstraints.wgs84) {
|
|
256
|
+
projections.push({
|
|
257
|
+
translatedValue: translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
|
|
258
|
+
translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (this.projectionsConstraints.nad83) {
|
|
262
|
+
projections.push({
|
|
263
|
+
translatedValue: translate.instant('igo.geo.importExportForm.projections.nad83', { code: 'EPSG:4269' }),
|
|
264
|
+
translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: ''
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (this.projectionsConstraints.webMercator) {
|
|
268
|
+
projections.push({
|
|
269
|
+
translatedValue: translate.instant('igo.geo.importExportForm.projections.webMercator', { code: 'EPSG:3857' }),
|
|
270
|
+
translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: ''
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (this.projectionsConstraints.mtm) {
|
|
274
|
+
// Quebec
|
|
275
|
+
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
276
|
+
if (zone) {
|
|
277
|
+
this.inMtmZone = true;
|
|
278
|
+
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
279
|
+
projections.splice(3, 0, {
|
|
280
|
+
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
|
|
281
|
+
translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.inMtmZone = false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (this.projectionsConstraints.utm) {
|
|
289
|
+
const order = this.inMtmZone ? 4 : 3;
|
|
290
|
+
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
291
|
+
const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
|
|
292
|
+
projections.splice(order, 0, {
|
|
293
|
+
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone }),
|
|
294
|
+
translateKey: 'utm', alias: `UTM ${zone}`, code, zone: `${zone}`
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
let configProjection = [];
|
|
298
|
+
if (this.projectionsConstraints.projFromConfig) {
|
|
299
|
+
configProjection = this.config.getConfig('projections') || [];
|
|
300
|
+
}
|
|
301
|
+
this.projections$.next(projections.concat(configProjection));
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Push the MTM in the array of systeme of coordinates
|
|
305
|
+
* @param projections Array of the InputProjections
|
|
306
|
+
*/
|
|
307
|
+
pushMtm(projections) {
|
|
308
|
+
if (this.projectionsConstraints.mtm) {
|
|
309
|
+
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
310
|
+
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
311
|
+
projections.splice(3, 0, {
|
|
312
|
+
translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
|
|
313
|
+
translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Updates the list of systems of coordinates for territory of Quebec
|
|
319
|
+
* push MTM and UTM in the Array
|
|
320
|
+
*/
|
|
321
|
+
back2quebec() {
|
|
322
|
+
const projections = this.projections$.value;
|
|
323
|
+
this.pushMtm(projections);
|
|
324
|
+
this.inMtmZone = true;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update the numbers of the zones when application is restarted
|
|
328
|
+
*/
|
|
329
|
+
updateZoneMtmUtm() {
|
|
330
|
+
if (this.inputProj.translateKey === 'mtm') {
|
|
331
|
+
const zone = zoneMtm(this.currentCenterDefaultProj[0]);
|
|
332
|
+
this.inputProj.alias = `MTM ${zone}`;
|
|
333
|
+
const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
|
|
334
|
+
this.inputProj.code = code;
|
|
335
|
+
this.inputProj.zone = `${zone}`;
|
|
336
|
+
this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone });
|
|
337
|
+
}
|
|
338
|
+
if (this.inputProj.translateKey === 'utm') {
|
|
339
|
+
const zone = zoneUtm(this.currentCenterDefaultProj[0]);
|
|
340
|
+
this.inputProj.alias = `UTM ${zone}`;
|
|
341
|
+
const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
|
|
342
|
+
this.inputProj.code = code;
|
|
343
|
+
this.inputProj.zone = `${zone}`;
|
|
344
|
+
this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone });
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Compute the position of a current projection in a list. 0 if the projection is not in the list
|
|
349
|
+
* @param translateKey string, translate key of a projection
|
|
350
|
+
* @returns numeric, position of an element in the array
|
|
351
|
+
*/
|
|
352
|
+
positionInList(tempInputProj) {
|
|
353
|
+
const tk = tempInputProj.translateKey;
|
|
354
|
+
const alias = tempInputProj.alias;
|
|
355
|
+
let position; // = undefined;
|
|
356
|
+
let iter = 0;
|
|
357
|
+
this.projections$.value.map((projection) => {
|
|
358
|
+
if (tk) {
|
|
359
|
+
if (tk === projection.translateKey) {
|
|
360
|
+
position = iter;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else if (alias === projection.alias) {
|
|
364
|
+
position = iter;
|
|
365
|
+
}
|
|
366
|
+
iter++;
|
|
367
|
+
});
|
|
368
|
+
position = position ? position : 0;
|
|
369
|
+
return position;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Change the list of projections depending on the projections of Lambert
|
|
373
|
+
* @param coordinates An array of numbers, longitude and latitude
|
|
374
|
+
*/
|
|
375
|
+
checkLambert(coordinates) {
|
|
376
|
+
const lambertProjections = this.config.getConfig('projections');
|
|
377
|
+
lambertProjections.forEach(projection => {
|
|
378
|
+
let modifiedProj = this.projections$.value;
|
|
379
|
+
const extent = projection.extent;
|
|
380
|
+
const code = projection.code.match(/\d+/);
|
|
381
|
+
const currentExtentWGS = olproj.transformExtent(extent, projection.code, this.defaultProj.code);
|
|
382
|
+
if (coordinates[0] < currentExtentWGS[0] || coordinates[0] > currentExtentWGS[2] ||
|
|
383
|
+
coordinates[1] < currentExtentWGS[1] || coordinates[1] > currentExtentWGS[3]) {
|
|
384
|
+
this.inLambert2[code] = false;
|
|
385
|
+
if (this.inputProj.alias === projection.alias) {
|
|
386
|
+
this.inputProj = this.projections$.value[0];
|
|
387
|
+
}
|
|
388
|
+
modifiedProj = modifiedProj.filter(p => p.alias !== projection.alias);
|
|
389
|
+
this.projections$.next(modifiedProj);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
if (!this.inLambert2[code]) {
|
|
393
|
+
this.projections$.next(modifiedProj.concat(projection));
|
|
394
|
+
this.inLambert2[code] = true;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
AdvancedCoordinatesComponent.ɵfac = function AdvancedCoordinatesComponent_Factory(t) { return new (t || AdvancedCoordinatesComponent)(i0.ɵɵdirectiveInject(i1.MapState), i0.ɵɵdirectiveInject(i2.LanguageService), i0.ɵɵdirectiveInject(i2.MessageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.StorageService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.UntypedFormBuilder)); };
|
|
401
|
+
AdvancedCoordinatesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdvancedCoordinatesComponent, selectors: [["igo-advanced-coordinates"]], inputs: { projectionsLimitations: "projectionsLimitations" }, decls: 32, vars: 37, consts: [["class", "coordinates", 4, "ngIf", "ngIfElse"], ["elseBlock", ""], ["class", "coordinates2", 4, "ngIf", "ngIfElse"], ["elseBlock2", ""], ["mat-raised-button", "", 1, "igo-form-button-group", 3, "click"], ["svgIcon", "content-copy"], [1, "igo-form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], ["matTooltipShowDelay", "500", 3, "value", "click", 4, "ngFor", "ngForOf"], [1, "center-toggle", "mat-typography", 3, "checked", "labelPosition", "change"], [1, "igo-zoom", "mat-typography"], [1, "coordinates"], ["matInput", "", "readonly", "", "rows", "1", 3, "placeholder", "value"], ["textArea", ""], [1, "coordinates2"], ["matTooltipShowDelay", "500", 3, "value", "click"]], template: function AdvancedCoordinatesComponent_Template(rf, ctx) { if (rf & 1) {
|
|
402
|
+
i0.ɵɵtemplate(0, AdvancedCoordinatesComponent_mat_form_field_0_Template, 4, 4, "mat-form-field", 0);
|
|
403
|
+
i0.ɵɵtemplate(1, AdvancedCoordinatesComponent_ng_template_1_Template, 4, 4, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
404
|
+
i0.ɵɵtemplate(3, AdvancedCoordinatesComponent_mat_form_field_3_Template, 4, 4, "mat-form-field", 2);
|
|
405
|
+
i0.ɵɵtemplate(4, AdvancedCoordinatesComponent_ng_template_4_Template, 4, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
|
|
406
|
+
i0.ɵɵelementStart(6, "button", 4);
|
|
407
|
+
i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_Template_button_click_6_listener() { return ctx.copyTextToClipboard(); });
|
|
408
|
+
i0.ɵɵelement(7, "mat-icon", 5);
|
|
409
|
+
i0.ɵɵtext(8);
|
|
410
|
+
i0.ɵɵpipe(9, "translate");
|
|
411
|
+
i0.ɵɵelementEnd();
|
|
412
|
+
i0.ɵɵelementStart(10, "form", 6)(11, "mat-form-field", 7)(12, "mat-label");
|
|
413
|
+
i0.ɵɵtext(13);
|
|
414
|
+
i0.ɵɵpipe(14, "translate");
|
|
415
|
+
i0.ɵɵelementEnd();
|
|
416
|
+
i0.ɵɵelementStart(15, "mat-select", 8);
|
|
417
|
+
i0.ɵɵlistener("valueChange", function AdvancedCoordinatesComponent_Template_mat_select_valueChange_15_listener($event) { return ctx.inputProj = $event; });
|
|
418
|
+
i0.ɵɵtemplate(16, AdvancedCoordinatesComponent_mat_option_16_Template, 2, 2, "mat-option", 9);
|
|
419
|
+
i0.ɵɵpipe(17, "async");
|
|
420
|
+
i0.ɵɵelementEnd()();
|
|
421
|
+
i0.ɵɵelementStart(18, "mat-slide-toggle", 10);
|
|
422
|
+
i0.ɵɵlistener("change", function AdvancedCoordinatesComponent_Template_mat_slide_toggle_change_18_listener($event) { return ctx.displayCenter($event.checked); });
|
|
423
|
+
i0.ɵɵtext(19);
|
|
424
|
+
i0.ɵɵpipe(20, "translate");
|
|
425
|
+
i0.ɵɵelementEnd()();
|
|
426
|
+
i0.ɵɵelementStart(21, "p", 11);
|
|
427
|
+
i0.ɵɵtext(22);
|
|
428
|
+
i0.ɵɵpipe(23, "translate");
|
|
429
|
+
i0.ɵɵelementEnd();
|
|
430
|
+
i0.ɵɵelementStart(24, "p", 11);
|
|
431
|
+
i0.ɵɵtext(25);
|
|
432
|
+
i0.ɵɵpipe(26, "translate");
|
|
433
|
+
i0.ɵɵpipe(27, "async");
|
|
434
|
+
i0.ɵɵelementEnd();
|
|
435
|
+
i0.ɵɵelementStart(28, "p", 11);
|
|
436
|
+
i0.ɵɵtext(29);
|
|
437
|
+
i0.ɵɵpipe(30, "translate");
|
|
438
|
+
i0.ɵɵpipe(31, "number");
|
|
439
|
+
i0.ɵɵelementEnd();
|
|
440
|
+
} if (rf & 2) {
|
|
441
|
+
const _r1 = i0.ɵɵreference(2);
|
|
442
|
+
const _r4 = i0.ɵɵreference(5);
|
|
443
|
+
i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r1);
|
|
444
|
+
i0.ɵɵadvance(3);
|
|
445
|
+
i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r4);
|
|
446
|
+
i0.ɵɵadvance(5);
|
|
447
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 18, "igo.integration.advanced-map-tool.advanced-coordinates.copy"), "\n");
|
|
448
|
+
i0.ɵɵadvance(2);
|
|
449
|
+
i0.ɵɵproperty("formGroup", ctx.form);
|
|
450
|
+
i0.ɵɵadvance(3);
|
|
451
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 20, "igo.integration.advanced-map-tool.advanced-coordinates.coordSystem"));
|
|
452
|
+
i0.ɵɵadvance(2);
|
|
453
|
+
i0.ɵɵproperty("value", ctx.inputProj);
|
|
454
|
+
i0.ɵɵadvance(1);
|
|
455
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(17, 22, ctx.projections$));
|
|
456
|
+
i0.ɵɵadvance(2);
|
|
457
|
+
i0.ɵɵproperty("checked", ctx.center)("labelPosition", "before");
|
|
458
|
+
i0.ɵɵadvance(1);
|
|
459
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(20, 24, "igo.integration.advanced-map-tool.advanced-coordinates.center"), " ");
|
|
460
|
+
i0.ɵɵadvance(3);
|
|
461
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(23, 26, "igo.integration.advanced-map-tool.advanced-coordinates.zoom"), " ", ctx.map.viewController.getZoom(), "");
|
|
462
|
+
i0.ɵɵadvance(3);
|
|
463
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(26, 28, "igo.integration.advanced-map-tool.advanced-coordinates.scale"), " ", i0.ɵɵpipeBind1(27, 30, ctx.formattedScale$), "");
|
|
464
|
+
i0.ɵɵadvance(4);
|
|
465
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(30, 32, "igo.integration.advanced-map-tool.advanced-coordinates.resolution"), " ", i0.ɵɵpipeBind2(31, 34, ctx.map.viewController.getResolution(), "1.0-0"), "");
|
|
466
|
+
} }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatusGroup, i3.FormGroupDirective, i4.MatFormField, i4.MatLabel, i5.MatSelect, i6.MatOption, i7.MatInput, i8.NgForOf, i8.NgIf, i9.MatIcon, i10.MatSlideToggle, i11.MatButton, i8.AsyncPipe, i8.DecimalPipe, i12.TranslatePipe], styles: ["textarea[_ngcontent-%COMP%]{resize:none}mat-form-field[_ngcontent-%COMP%]{padding:10px 15px}mat-form-field.coordinates[_ngcontent-%COMP%]{width:120px}mat-form-field.coordinates2[_ngcontent-%COMP%]{width:120px;padding:0 10px 0 3px}mat-form-field.igo-input-container[_ngcontent-%COMP%]{width:60%;padding:0 15px}.igo-form-button-group[_ngcontent-%COMP%]{padding:0 10px;margin:0 10px}.center-toggle[_ngcontent-%COMP%]{padding:10px 15px 35px}mat-slide-toggle[_ngcontent-%COMP%]{font-size:small}.igo-zoom[_ngcontent-%COMP%]{padding:0 15px}"] });
|
|
467
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdvancedCoordinatesComponent, [{
|
|
468
|
+
type: Component,
|
|
469
|
+
args: [{ selector: 'igo-advanced-coordinates', template: "<mat-form-field *ngIf=\"units; else elseBlock\" class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lon' | translate\"\n [value]=\"coordinates[0]\"></textarea>\n</mat-form-field>\n<ng-template #elseBlock >\n <mat-form-field class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.est' | translate\"\n [value]=\"coordinates[0]\"></textarea></mat-form-field>\n</ng-template>\n\n<mat-form-field *ngIf=\"units; else elseBlock2\" class=\"coordinates2\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lat' | translate\"\n [value]=\"coordinates[1]\"></textarea>\n</mat-form-field>\n<ng-template #elseBlock2 >\n <mat-form-field class=\"coordinates2\"> <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.nord' | translate\"\n [value]=\"coordinates[1]\"></textarea></mat-form-field>\n</ng-template>\n\n<button class=\"igo-form-button-group\"\n mat-raised-button\n (click)=\"copyTextToClipboard()\">\n <mat-icon svgIcon=\"content-copy\"></mat-icon>\n {{ 'igo.integration.advanced-map-tool.advanced-coordinates.copy' | translate }}\n</button>\n\n<form class=\"igo-form\" [formGroup]=\"form\">\n <mat-form-field class=\"igo-input-container\">\n <mat-label>{{'igo.integration.advanced-map-tool.advanced-coordinates.coordSystem' | translate}}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option matTooltipShowDelay=\"500\"\n *ngFor=\"let projection of (projections$ | async)\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\">\n {{projection.translatedValue || projection.alias }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle class=\"center-toggle mat-typography\"\n [checked]=\"center\"\n [labelPosition]=\"'before'\"\n (change)=\"displayCenter($event.checked)\">\n {{'igo.integration.advanced-map-tool.advanced-coordinates.center' | translate}}\n </mat-slide-toggle> \n</form>\n\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.zoom' | translate}} {{map.viewController.getZoom() }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.scale' | translate}} {{ formattedScale$ | async }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.resolution' | translate}} {{map.viewController.getResolution() | number: '1.0-0' }}</p>", styles: ["textarea{resize:none}mat-form-field{padding:10px 15px}mat-form-field.coordinates{width:120px}mat-form-field.coordinates2{width:120px;padding:0 10px 0 3px}mat-form-field.igo-input-container{width:60%;padding:0 15px}.igo-form-button-group{padding:0 10px;margin:0 10px}.center-toggle{padding:10px 15px 35px}mat-slide-toggle{font-size:small}.igo-zoom{padding:0 15px}\n"] }]
|
|
470
|
+
}], function () { return [{ type: i1.MapState }, { type: i2.LanguageService }, { type: i2.MessageService }, { type: i0.ChangeDetectorRef }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i3.UntypedFormBuilder }]; }, { projectionsLimitations: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}] }); })();
|
|
473
473
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUEyRCxNQUFNLFdBQVcsQ0FBQztBQUVqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBbUQsWUFBWSxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUMxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUF3QyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7OztJQ1RsQywwQ0FBa0U7SUFDOUQsbUNBRXNDOztJQUMxQyxpQkFBaUI7OztJQUZYLGVBQXdGO0lBQXhGLGdIQUF3RixnQ0FBQTs7O0lBSTVGLDBDQUFvQztJQUNsQyxtQ0FFa0M7O0lB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Qyx5R0FBUyx5QkFBcUIsSUFBQztRQUMvQiw4QkFBNEM7UUFDNUMsWUFDSjs7UUFBQSxpQkFBUztRQUVULGdDQUEwQyx5QkFBQSxpQkFBQTtRQUUzQixhQUFvRjs7UUFBQSxpQkFBWTtRQUMzRyxzQ0FBa0M7UUFBdEIsMEpBQXFCO1FBQy9CLDZGQUthOztRQUNmLGlCQUFhLEVBQUE7UUFFZiw2Q0FHMkM7UUFBekMsNEhBQVUsaUNBQTZCLElBQUM7UUFDeEMsYUFDRjs7UUFBQSxpQkFBbUIsRUFBQTtRQUdyQiw4QkFBbUM7UUFBQSxhQUErRzs7UUFBQSxpQkFBSTtRQUN0Siw4QkFBbUM7UUFBQSxhQUE0Rzs7O1FBQUEsaUJBQUk7UUFDbkosOEJBQW1DO1FBQUEsYUFBNkk7OztRQUFBLGlCQUFJOzs7O1FBcERuSyxnQ0FBYSxpQkFBQTtRQVliLGVBQWE7UUFBYixnQ0FBYSxpQkFBQTtRQWUxQixlQUNKO1FBREksc0hBQ0o7UUFFdUIsZUFBa0I7UUFBbEIsb0NBQWtCO1FBRTFCLGVBQW9GO1FBQXBGLGtIQUFvRjtRQUNuRixlQUFxQjtRQUFyQixxQ0FBcUI7UUFFTixlQUF5QjtRQUF6QixrRUFBeUI7UUFRcEQsZUFBa0I7UUFBbEIsb0NBQWtCLDJCQUFBO1FBR2xCLGVBQ0Y7UUFERSx3SEFDRjtRQUdpQyxlQUErRztRQUEvRywySkFBK0c7UUFDL0csZUFBNEc7UUFBNUcsdUtBQTRHO1FBQzVHLGVBQTZJO1FBQTdJLHdNQUE2STs7dUZEbENuSyw0QkFBNEI7Y0FMeEMsU0FBUzsyQkFDRSwwQkFBMEI7Z1BBcUNoQyxzQkFBc0I7a0JBRHpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcm1hdFNjYWxlLCBJZ29NYXAsIElucHV0UHJvamVjdGlvbnMsIFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zIH0gZnJvbSAnQGlnbzIvZ2VvJztcbmltcG9ydCB7IE1hcFN0YXRlIH0gZnJvbSAnLi4vLi4vbWFwLnN0YXRlJztcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BpZ28yL3V0aWxzJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIFN0b3JhZ2VTZXJ2aWNlLCBTdG9yYWdlU2NvcGUsIENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB6b25lTXRtLCB6b25lVXRtLCBjb21wdXRlUHJvamVjdGlvbnNDb25zdHJhaW50cyB9IGZyb20gJ0BpZ28yL2dlbyc7XG5pbXBvcnQgKiBhcyBvbHByb2ogZnJvbSAnb2wvcHJvaic7XG4vKipcbiAqIFRvb2wgdG8gZGlzcGxheSB0aGUgY29vcmRpbmF0ZXMgYW5kIGEgY3Vyc29yIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG1hcFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tYWR2YW5jZWQtY29vcmRpbmF0ZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1jb29yZGluYXRlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkQ29vcmRpbmF0ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBmb3JtYXR0ZWRTY2FsZSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHB1YmxpYyBwcm9qZWN0aW9ucyQ6IEJlaGF2aW9yU3ViamVjdDxJbnB1dFByb2plY3Rpb25zW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBwdWJsaWMgY29vcmRpbmF0ZXM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvajogW251bWJlciwgbnVtYmVyXTtcbiAgcHVibGljIGNlbnRlcjogYm9vbGVhbiA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCdjZW50ZXJUb2dnbGUnKSBhcyBib29sZWFuO1xuICBwcml2YXRlIGluTXRtWm9uZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgaW5MYW1iZXJ0MiA9IHszMjE5ODogdHJ1ZSwgMzc5ODogdHJ1ZX07XG4gIHByaXZhdGUgbWFwU3RhdGUkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9wcm9qZWN0aW9uc0xpbWl0YXRpb25zOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyA9IHt9O1xuICBwcml2YXRlIHByb2plY3Rpb25zQ29uc3RyYWludHM6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zO1xuICBwcml2YXRlIGRlZmF1bHRQcm9qOiBJbnB1dFByb2plY3Rpb25zID0ge1xuICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53Z3M4NCcsIHsgY29kZTogJ0VQU0c6NDMyNicgfSksXG4gICAgdHJhbnNsYXRlS2V5OiAnd2dzODQnLCBhbGlhczogJ1dHUzg0JywgY29kZTogJ0VQU0c6NDMyNicsIHpvbmU6ICcnXG4gIH07XG4gIHByaXZhdGUgY3VycmVudFpvbmVzID0geyB1dG06IHVuZGVmaW5lZCwgbXRtOiB1bmRlZmluZWQgfTtcbiAgcHVibGljIHVuaXRzOiBib29sZWFuID0gdHJ1ZTtcbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcbiAgfVxuXG4gIGdldCBpbnB1dFByb2ooKTogSW5wdXRQcm9qZWN0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2lucHV0UHJvaicpLnZhbHVlO1xuICB9XG4gIHNldCBpbnB1dFByb2oodmFsdWU6IElucHV0UHJvamVjdGlvbnMpIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGlucHV0UHJvajogdmFsdWUgfSk7XG4gIH1cbiAgZ2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnMoKTogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uc0xpbWl0YXRpb25zIHx8IHt9O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnModmFsdWU6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zKSB7XG4gICAgdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1hcFN0YXRlOiBNYXBTdGF0ZSxcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcikge1xuICAgICAgdGhpcy5jb21wdXRlUHJvamVjdGlvbnMoKTtcbiAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gYSBzdGF0ZSBvZiB0aGUgbWFwLCBhIHN0YXRlIG9mIGEgZm9ybSwgdXBkYXRlIHRoZSBjb29yZGluYXRlc1xuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tYXBTdGF0ZSQkID0gY29tYmluZUxhdGVzdChbdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuc3RhdGUkLnBpcGUoZGVib3VuY2VUaW1lKDUwKSksIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNdKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2NhbGVWYWx1ZSh0aGlzLm1hcCk7XG4gICAgICB0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaiA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcih0aGlzLmRlZmF1bHRQcm9qLmNvZGUpO1xuICAgICAgY29uc3QgY3VycmVudE10bVpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVdG1ab25lID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICBpZiAoIXRoaXMuaW5NdG1ab25lICYmIGN1cnJlbnRNdG1ab25lICE9PSB0aGlzLmN1cnJlbnRab25lcy5tdG0pIHtcbiAgICAgICAgdGhpcy5iYWNrMnF1ZWJlYygpO1xuICAgICAgfVxuICAgICAgbGV0IHpvbmVDaGFuZ2UgPSBmYWxzZTtcbiAgICAgIGlmIChjdXJyZW50TXRtWm9uZSAhPT0gdGhpcy5jdXJyZW50Wm9uZXMubXRtKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFpvbmVzLm10bSA9IGN1cnJlbnRNdG1ab25lO1xuICAgICAgICB6b25lQ2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50VXRtWm9uZSAhPT0gdGhpcy5jdXJyZW50Wm9uZXMudXRtKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFpvbmVzLnV0bSA9IGN1cnJlbnRVdG1ab25lO1xuICAgICAgICB6b25lQ2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh6b25lQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbnNab25lQ2hhbmdlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrTGFtYmVydCh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaik7XG4gICAgICB0aGlzLmNvb3JkaW5hdGVzID0gdGhpcy5nZXRDb29yZGluYXRlcygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnY3VycmVudFByb2plY3Rpb24nLCB0aGlzLmlucHV0UHJvaiwgU3RvcmFnZVNjb3BlLlNFU1NJT04pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcElucHV0UHJvaiA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCdjdXJyZW50UHJvamVjdGlvbicpIGFzIElucHV0UHJvamVjdGlvbnM7XG4gICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXTtcbiAgICBpZiAodGVtcElucHV0UHJvaiAhPT0gbnVsbClcbiAgICB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnBvc2l0aW9uSW5MaXN0KHRlbXBJbnB1dFByb2opO1xuICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVtwb3NdO1xuICAgICAgdGhpcy51cGRhdGVab25lTXRtVXRtKCk7XG4gICAgfVxuICAgIHRoaXMubWFwLm1hcENlbnRlciQubmV4dCh0aGlzLmNlbnRlcik7XG4gICAgdGhpcy5jb29yZGluYXRlcyA9IHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICB0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaiA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcih0aGlzLmRlZmF1bHRQcm9qLmNvZGUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLm1hcFN0YXRlJCQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHNldFNjYWxlVmFsdWUobWFwOiBJZ29NYXApIHtcbiAgICB0aGlzLmZvcm1hdHRlZFNjYWxlJC5uZXh0KCc6IH4gMSAvICcgKyBmb3JtYXRTY2FsZShtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUoKSkpO1xuICB9XG4gIC8qKlxuICAgKiBDb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXAgb24gdGhlIGFwcHJvcHJpYXRlIHN5c3RlbWUgb2YgY29vcmRpbmF0ZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHdvIG51bWJlcnNcbiAgICovXG4gIGdldENvb3JkaW5hdGVzKCk6IHN0cmluZ1tdIHtcbiAgICB0aGlzLmN1cnJlbnRab25lcy5tdG0gPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICB0aGlzLmN1cnJlbnRab25lcy51dG0gPSB6b25lVXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICBsZXQgY29vcmQ7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW5wdXRQcm9qLmNvZGU7XG4gICAgbGV0IGRlY2ltYWwgPSAyO1xuICAgIGlmIChjb2RlLmluY2x1ZGVzKCdFUFNHOjQzMjYnKSB8fCBjb2RlLmluY2x1ZGVzKCdFUFNHOjQyNjknKSkge1xuICAgICAgZGVjaW1hbCA9IDU7XG4gICAgfVxuICAgIHRoaXMudW5pdHMgPSAoY29kZSA9PT0gJ0VQU0c6NDMyNicgfHwgY29kZSA9PT0gJ0VQU0c6NDI2OScpO1xuICAgIGNvb3JkID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKGNvZGUpLm1hcChjID0+IGMudG9GaXhlZChkZWNpbWFsKSk7XG4gICAgcmV0dXJuIGNvb3JkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIGNvb3JkaW5hdGVzIHRvIGEgY2xpcGJvYXJkXG4gICAqL1xuICBjb3B5VGV4dFRvQ2xpcGJvYXJkKCk6IHZvaWQge1xuICAgIGNvbnN0IHN1Y2Nlc3NmdWwgPSBDbGlwYm9hcmQuY29weSh0aGlzLmNvb3JkaW5hdGVzLnRvU3RyaW5nKCkpO1xuICAgIGlmIChzdWNjZXNzZnVsKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlUaXRsZSdcbiAgICAgICk7XG4gICAgICBjb25zdCBtc2cgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlNc2cnKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2Vzcyhtc2csIHRpdGxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhIGN1cnNvciBvbiB0aGUgY2VudGVyIG9mIHRoZSBtYXBcbiAgICovXG4gIGRpc3BsYXlDZW50ZXIodG9nZ2xlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jZW50ZXIgPSB0b2dnbGU7XG4gICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KHRvZ2dsZSk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2NlbnRlclRvZ2dsZScsIHRvZ2dsZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkZXIgb2YgdGhlIGZvcm1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgaW5wdXRQcm9qOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbGlzdCBvZiBwcm9qZWN0aW9ucyBhZnRlciBjaGFuZ2luZyBvZiB0aGUgc3RhdGUgb2YgdGhlIG1hcFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQcm9qZWN0aW9uc1pvbmVDaGFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IG1vZGlmaWVkUHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlO1xuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgICBtb2RpZmllZFByb2oubWFwKHAgPT4ge1xuICAgICAgaWYgKHAudHJhbnNsYXRlS2V5ID09PSAnbXRtJykge1xuICAgICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICAgIGlmICh6b25lKSB7XG4gICAgICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyMTgke3pvbmV9YCA6IGBFUFNHOjMyMSR7ODAgKyB6b25lfWA7XG4gICAgICAgICAgcC5hbGlhcyA9IGBNVE0gJHt6b25lfWA7XG4gICAgICAgICAgcC5jb2RlID0gY29kZTtcbiAgICAgICAgICBwLnpvbmUgPSBgJHt6b25lfWA7XG4gICAgICAgICAgcC50cmFuc2xhdGVkVmFsdWUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsIHApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHAuYWxpYXMgPSAnJztcbiAgICAgICAgICB0aGlzLmluTXRtWm9uZSA9IGZhbHNlO1xuICAgICAgICAgIGlmICh0aGlzLmlucHV0UHJvai50cmFuc2xhdGVLZXkgPT09ICdtdG0nKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0UHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHAudHJhbnNsYXRlS2V5ID09PSAndXRtJykge1xuICAgICAgICBjb25zdCB6b25lID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBgRVBTRzozMjYke3pvbmV9YDtcbiAgICAgICAgcC5hbGlhcyA9IGBVVE0gJHt6b25lfWA7XG4gICAgICAgIHAuY29kZSA9IGNvZGU7XG4gICAgICAgIHAuem9uZSA9IGAke3pvbmV9YDtcbiAgICAgICAgcC50cmFuc2xhdGVkVmFsdWUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsIHApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGlmaWVkUHJvaiA9IG1vZGlmaWVkUHJvai5maWx0ZXIocCA9PiBwLmFsaWFzICE9PSAnJyk7XG4gICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChtb2RpZmllZFByb2opO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxpc3Qgb2YgY3VycmVudHMgcHJvamVjdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZVByb2plY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cyA9IGNvbXB1dGVQcm9qZWN0aW9uc0NvbnN0cmFpbnRzKHRoaXMucHJvamVjdGlvbnNMaW1pdGF0aW9ucyk7XG4gICAgY29uc3QgcHJvamVjdGlvbnM6IElucHV0UHJvamVjdGlvbnNbXSA9IFtdO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaikge1xuICAgICAgdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2ogPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5nZXRDZW50ZXIodGhpcy5kZWZhdWx0UHJvai5jb2RlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy53Z3M4NCkge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53Z3M4NCcsIHsgY29kZTogJ0VQU0c6NDMyNicgfSksXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3dnczg0JywgYWxpYXM6ICdXR1M4NCcsIGNvZGU6ICdFUFNHOjQzMjYnLCB6b25lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5uYWQ4Mykge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5uYWQ4MycsIHsgY29kZTogJ0VQU0c6NDI2OScgfSksXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ25hZDgzJywgYWxpYXM6ICdOQUQ4MycsIGNvZGU6ICdFUFNHOjQyNjknLCB6b25lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy53ZWJNZXJjYXRvcikge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53ZWJNZXJjYXRvcicsIHsgY29kZTogJ0VQU0c6Mzg1NycgfSksXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3dlYk1lcmNhdG9yJywgYWxpYXM6ICdXZWIgTWVyY2F0b3InLCBjb2RlOiAnRVBTRzozODU3Jywgem9uZTogJydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bSkge1xuICAgICAgLy8gUXVlYmVjXG4gICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICBpZiAoem9uZSkge1xuICAgICAgICB0aGlzLmluTXRtWm9uZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjE4JHt6b25lfWAgOiBgRVBTRzozMjEkezgwICsgem9uZX1gO1xuICAgICAgICBwcm9qZWN0aW9ucy5zcGxpY2UoMywgMCwge1xuICAgICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5tdG0nLCB7IGNvZGUsIHpvbmUgfSksXG4gICAgICAgICAgdHJhbnNsYXRlS2V5OiAnbXRtJywgYWxpYXM6IGBNVE0gJHt6b25lfWAsIGNvZGUsIHpvbmU6IGAke3pvbmV9YFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmluTXRtWm9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bSkge1xuICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmluTXRtWm9uZSA/IDQgOiAzO1xuICAgICAgY29uc3Qgem9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xuICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyNjAke3pvbmV9YCA6IGBFUFNHOjMyNiR7em9uZX1gO1xuICAgICAgcHJvamVjdGlvbnMuc3BsaWNlKG9yZGVyLCAwLCB7XG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy51dG0nLCB7IGNvZGUsIHpvbmUgfSksXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3V0bScsIGFsaWFzOiBgVVRNICR7em9uZX1gLCBjb2RlLCB6b25lOiBgJHt6b25lfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgY29uZmlnUHJvamVjdGlvbiA9IFtdO1xuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMucHJvakZyb21Db25maWcpIHtcbiAgICAgIGNvbmZpZ1Byb2plY3Rpb24gPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ3Byb2plY3Rpb25zJykgfHwgW107XG4gICAgfVxuICAgIHRoaXMucHJvamVjdGlvbnMkLm5leHQocHJvamVjdGlvbnMuY29uY2F0KGNvbmZpZ1Byb2plY3Rpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIHRoZSBNVE0gaW4gdGhlIGFycmF5IG9mIHN5c3RlbWUgb2YgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHByb2plY3Rpb25zIEFycmF5IG9mIHRoZSBJbnB1dFByb2plY3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHB1c2hNdG0ocHJvamVjdGlvbnM6IEFycmF5PElucHV0UHJvamVjdGlvbnM+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5tdG0pIHtcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjE4JHt6b25lfWAgOiBgRVBTRzozMjEkezgwICsgem9uZX1gO1xuICAgICAgcHJvamVjdGlvbnMuc3BsaWNlKDMsIDAsIHtcbiAgICAgICAgICB0cmFuc2xhdGVkVmFsdWU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMubXRtJywgeyBjb2RlLCB6b25lIH0pLFxuICAgICAgICAgIHRyYW5zbGF0ZUtleTogJ210bScsIGFsaWFzOiBgTVRNICR7em9uZX1gLCBjb2RlLCB6b25lOiBgJHt6b25lfWB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbGlzdCBvZiBzeXN0ZW1zIG9mIGNvb3JkaW5hdGVzIGZvciB0ZXJyaXRvcnkgb2YgUXVlYmVjXG4gICAqIHB1c2ggTVRNIGFuZCBVVE0gaW4gdGhlIEFycmF5XG4gICAqL1xuICBwcml2YXRlIGJhY2sycXVlYmVjKCk6IHZvaWQge1xuICAgIGNvbnN0IHByb2plY3Rpb25zID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWU7XG4gICAgdGhpcy5wdXNoTXRtKHByb2plY3Rpb25zKTtcbiAgICB0aGlzLmluTXRtWm9uZSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBudW1iZXJzIG9mIHRoZSB6b25lcyB3aGVuIGFwcGxpY2F0aW9uIGlzIHJlc3RhcnRlZFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVab25lTXRtVXRtKCkge1xuICAgIGlmICh0aGlzLmlucHV0UHJvai50cmFuc2xhdGVLZXkgPT09ICdtdG0nKSB7XG4gICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICB0aGlzLmlucHV0UHJvai5hbGlhcyA9IGBNVE0gJHt6b25lfWA7XG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcbiAgICAgIHRoaXMuaW5wdXRQcm9qLmNvZGUgPSBjb2RlO1xuICAgICAgdGhpcy5pbnB1dFByb2ouem9uZSA9IGAke3pvbmV9YDtcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZWRWYWx1ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMubXRtJywgeyBjb2RlLCB6b25lIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnB1dFByb2oudHJhbnNsYXRlS2V5ID09PSAndXRtJykge1xuICAgICAgY29uc3Qgem9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xuICAgICAgdGhpcy5pbnB1dFByb2ouYWxpYXMgPSBgVVRNICR7em9uZX1gO1xuICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyNjAke3pvbmV9YCA6IGBFUFNHOjMyNiR7em9uZX1gO1xuICAgICAgdGhpcy5pbnB1dFByb2ouY29kZSA9IGNvZGU7XG4gICAgICB0aGlzLmlucHV0UHJvai56b25lID0gYCR7em9uZX1gO1xuICAgICAgdGhpcy5pbnB1dFByb2oudHJhbnNsYXRlZFZhbHVlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy51dG0nLCB7IGNvZGUsIHpvbmUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIGEgY3VycmVudCBwcm9qZWN0aW9uIGluIGEgbGlzdC4gMCBpZiB0aGUgcHJvamVjdGlvbiBpcyBub3QgaW4gdGhlIGxpc3RcbiAgICogQHBhcmFtIHRyYW5zbGF0ZUtleSBzdHJpbmcsIHRyYW5zbGF0ZSBrZXkgb2YgYSBwcm9qZWN0aW9uXG4gICAqIEByZXR1cm5zIG51bWVyaWMsIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5XG4gICAqL1xuICBwb3NpdGlvbkluTGlzdCh0ZW1wSW5wdXRQcm9qOiBJbnB1dFByb2plY3Rpb25zKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ayA9IHRlbXBJbnB1dFByb2oudHJhbnNsYXRlS2V5O1xuICAgIGNvbnN0IGFsaWFzID0gdGVtcElucHV0UHJvai5hbGlhcztcbiAgICBsZXQgcG9zaXRpb247IC8vID0gdW5kZWZpbmVkO1xuICAgIGxldCBpdGVyID0gMDtcbiAgICB0aGlzLnByb2plY3Rpb25zJC52YWx1ZS5tYXAoKHByb2plY3Rpb24pID0+IHtcbiAgICAgIGlmICh0aykge1xuICAgICAgICBpZiAodGsgPT09IHByb2plY3Rpb24udHJhbnNsYXRlS2V5KSB7XG4gICAgICAgICAgcG9zaXRpb24gPSBpdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhbGlhcyA9PT0gcHJvamVjdGlvbi5hbGlhcykge1xuICAgICAgICBwb3NpdGlvbiA9IGl0ZXI7XG4gICAgICB9XG4gICAgICBpdGVyKys7XG4gICAgfSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uIDogMDtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBsaXN0IG9mIHByb2plY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcHJvamVjdGlvbnMgb2YgTGFtYmVydFxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgQW4gYXJyYXkgb2YgbnVtYmVycywgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZVxuICAgKi9cbiAgY2hlY2tMYW1iZXJ0KGNvb3JkaW5hdGVzOiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgbGFtYmVydFByb2plY3Rpb25zID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdwcm9qZWN0aW9ucycpO1xuICAgIGxhbWJlcnRQcm9qZWN0aW9ucy5mb3JFYWNoKHByb2plY3Rpb24gPT4ge1xuICAgICAgICBsZXQgbW9kaWZpZWRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWU7XG4gICAgICAgIGNvbnN0IGV4dGVudCA9IHByb2plY3Rpb24uZXh0ZW50O1xuICAgICAgICBjb25zdCBjb2RlID0gcHJvamVjdGlvbi5jb2RlLm1hdGNoKC9cXGQrLyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFeHRlbnRXR1MgPSBvbHByb2oudHJhbnNmb3JtRXh0ZW50KGV4dGVudCwgcHJvamVjdGlvbi5jb2RlLCB0aGlzLmRlZmF1bHRQcm9qLmNvZGUpO1xuICAgICAgICBpZiAoY29vcmRpbmF0ZXNbMF0gPCBjdXJyZW50RXh0ZW50V0dTWzBdIHx8IGNvb3JkaW5hdGVzWzBdID4gY3VycmVudEV4dGVudFdHU1syXSB8fFxuICAgICAgICAgICAgY29vcmRpbmF0ZXNbMV0gPCBjdXJyZW50RXh0ZW50V0dTWzFdIHx8IGNvb3JkaW5hdGVzWzFdID4gY3VycmVudEV4dGVudFdHU1szXSkge1xuICAgICAgICAgICAgdGhpcy5pbkxhbWJlcnQyW2NvZGVdID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFByb2ouYWxpYXMgPT09IHByb2plY3Rpb24uYWxpYXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZGlmaWVkUHJvaiA9IG1vZGlmaWVkUHJvai5maWx0ZXIocCA9PiBwLmFsaWFzICE9PSBwcm9qZWN0aW9uLmFsaWFzKTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGlvbnMkLm5leHQobW9kaWZpZWRQcm9qKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbkxhbWJlcnQyW2NvZGVdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChtb2RpZmllZFByb2ouY29uY2F0KHByb2plY3Rpb24pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluTGFtYmVydDJbY29kZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInVuaXRzOyBlbHNlIGVsc2VCbG9ja1wiIGNsYXNzPVwiY29vcmRpbmF0ZXNcIj5cbiAgICA8dGV4dGFyZWEgICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5sb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt2YWx1ZV09XCJjb29yZGluYXRlc1swXVwiPjwvdGV4dGFyZWE+XG48L21hdC1mb3JtLWZpZWxkPlxuPG5nLXRlbXBsYXRlICNlbHNlQmxvY2sgPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJjb29yZGluYXRlc1wiPlxuICAgIDx0ZXh0YXJlYSAjdGV4dEFyZWEgbWF0SW5wdXQgcmVhZG9ubHkgcm93cz1cIjFcIlxuICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5lc3QnIHwgdHJhbnNsYXRlXCJcbiAgW3ZhbHVlXT1cImNvb3JkaW5hdGVzWzBdXCI+PC90ZXh0YXJlYT48L21hdC1mb3JtLWZpZWxkPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidW5pdHM7IGVsc2UgZWxzZUJsb2NrMlwiIGNsYXNzPVwiY29vcmRpbmF0ZXMyXCI+XG4gICAgPHRleHRhcmVhICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5sYXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt2YWx1ZV09XCJjb29yZGluYXRlc1sxXVwiPjwvdGV4dGFyZWE+XG48L21hdC1mb3JtLWZpZWxkPlxuPG5nLXRlbXBsYXRlICNlbHNlQmxvY2syID5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29vcmRpbmF0ZXMyXCI+ICA8dGV4dGFyZWEgI3RleHRBcmVhIG1hdElucHV0IHJlYWRvbmx5IHJvd3M9XCIxXCJcbiAgW3BsYWNlaG9sZGVyXT1cIidpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMubm9yZCcgfCB0cmFuc2xhdGVcIlxuICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMV1cIj48L3RleHRhcmVhPjwvbWF0LWZvcm0tZmllbGQ+XG48L25nLXRlbXBsYXRlPlxuXG48YnV0dG9uIGNsYXNzPVwiaWdvLWZvcm0tYnV0dG9uLWdyb3VwXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIChjbGljayk9XCJjb3B5VGV4dFRvQ2xpcGJvYXJkKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvbnRlbnQtY29weVwiPjwvbWF0LWljb24+XG4gICAge3sgJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5jb3B5JyB8IHRyYW5zbGF0ZSB9fVxuPC9idXR0b24+XG5cbjxmb3JtIGNsYXNzPVwiaWdvLWZvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaWdvLWlucHV0LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtbGFiZWw+e3snaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvb3JkU3lzdGVtJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiaW5wdXRQcm9qXCI+XG4gICAgICA8bWF0LW9wdGlvbiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHByb2plY3Rpb24gb2YgKHByb2plY3Rpb25zJCB8IGFzeW5jKVwiXG4gICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICB7e3Byb2plY3Rpb24udHJhbnNsYXRlZFZhbHVlIHx8IHByb2plY3Rpb24uYWxpYXMgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtc2xpZGUtdG9nZ2xlIGNsYXNzPVwiY2VudGVyLXRvZ2dsZSBtYXQtdHlwb2dyYXBoeVwiXG4gICAgW2NoZWNrZWRdPVwiY2VudGVyXCJcbiAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgKGNoYW5nZSk9XCJkaXNwbGF5Q2VudGVyKCRldmVudC5jaGVja2VkKVwiPlxuICAgIHt7J2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5jZW50ZXInIHwgdHJhbnNsYXRlfX1cbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPiBcbjwvZm9ybT5cblxuPHAgY2xhc3M9XCJpZ28tem9vbSBtYXQtdHlwb2dyYXBoeVwiPnt7J2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy56b29tJyB8IHRyYW5zbGF0ZX19IHt7bWFwLnZpZXdDb250cm9sbGVyLmdldFpvb20oKSB9fTwvcD5cbjxwIGNsYXNzPVwiaWdvLXpvb20gbWF0LXR5cG9ncmFwaHlcIj57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuc2NhbGUnIHwgdHJhbnNsYXRlfX0ge3sgZm9ybWF0dGVkU2NhbGUkIHwgYXN5bmMgfX08L3A+XG48cCBjbGFzcz1cImlnby16b29tIG1hdC10eXBvZ3JhcGh5XCI+e3snaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLnJlc29sdXRpb24nIHwgdHJhbnNsYXRlfX0ge3ttYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpIHwgbnVtYmVyOiAnMS4wLTAnIH19PC9wPiJdfQ==
|