@smarterplan/ngx-smarterplan-locations 0.4.15 → 0.4.17

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.
@@ -1,5 +1,5 @@
1
- import { Component } from '@angular/core';
2
- import { SpaceStatus } from '@smarterplan/ngx-smarterplan-core';
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MATTERPORT_SDK_KEY, SpaceStatus, distance } from '@smarterplan/ngx-smarterplan-core';
3
3
  import { Subject, takeUntil } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/router";
@@ -9,21 +9,29 @@ import * as i4 from "@angular/cdk/clipboard";
9
9
  import * as i5 from "@ng-bootstrap/ng-bootstrap";
10
10
  import * as i6 from "@angular/common";
11
11
  import * as i7 from "@angular/forms";
12
- import * as i8 from "../tab-navigation/tab-navigation.component";
13
- import * as i9 from "../form-location/form-location.component";
12
+ import * as i8 from "../landmark-picker/landmark-picker.component";
13
+ import * as i9 from "../tab-navigation/tab-navigation.component";
14
+ import * as i10 from "../form-location/form-location.component";
15
+ // Minimum distance (in meters) required between the two landmarks for a reliable rotation calculation
16
+ const MIN_LANDMARK_DISTANCE = 1.5;
14
17
  export class DetailLocationComponent {
18
+ sdkKey;
15
19
  route;
16
20
  spaceService;
21
+ visitService;
17
22
  router;
18
23
  userService;
19
24
  translate;
20
25
  navigatorService;
26
+ tagCopyService;
27
+ // --- Location details ---
21
28
  space;
22
29
  editForm;
23
30
  isEditing = false;
24
31
  imageToUpload;
25
32
  id;
26
33
  menuItems = [];
34
+ // --- DPE (energy diagnostic) ---
27
35
  isValidatingDpe = false;
28
36
  selectedDpeResult;
29
37
  gettingData = false;
@@ -31,13 +39,38 @@ export class DetailLocationComponent {
31
39
  guestLink;
32
40
  canArchive;
33
41
  destroy$ = new Subject();
34
- constructor(route, spaceService, router, userService, translate, navigatorService) {
42
+ // --- Copy POIs between visits ---
43
+ isAdmin = false;
44
+ spaces = [];
45
+ // Whether the "copy POIs" admin form is currently visible (collapsed by default)
46
+ showCopyPoisForm = false;
47
+ // Selected source SPACE (a space may contain 0..N visits/models)
48
+ selectedSourceSpaceId = null;
49
+ // Selected 3D model ids (visit.model3d) — this is what actually gets loaded in the viewer
50
+ selectedSource3dModel = null;
51
+ selectedTarget3dModel = null;
52
+ // Visits available for the selected source space, and for the current (target) space
53
+ sourceVisits = [];
54
+ visits = [];
55
+ // 3D landmark points picked directly in each viewer (source and target)
56
+ landmarkSourceA = null;
57
+ landmarkTargetA = null;
58
+ landmarkSourceB = null;
59
+ landmarkTargetB = null;
60
+ isCopyingPois = false;
61
+ copyPoisResultMsg = null;
62
+ copyProgress = null;
63
+ copyLog = [];
64
+ constructor(sdkKey, route, spaceService, visitService, router, userService, translate, navigatorService, tagCopyService) {
65
+ this.sdkKey = sdkKey;
35
66
  this.route = route;
36
67
  this.spaceService = spaceService;
68
+ this.visitService = visitService;
37
69
  this.router = router;
38
70
  this.userService = userService;
39
71
  this.translate = translate;
40
72
  this.navigatorService = navigatorService;
73
+ this.tagCopyService = tagCopyService;
41
74
  this.navigatorService.locationIDChange
42
75
  .pipe(takeUntil(this.destroy$))
43
76
  .subscribe((spaceID) => {
@@ -47,17 +80,40 @@ export class DetailLocationComponent {
47
80
  this.id = params.id;
48
81
  this.setup();
49
82
  });
83
+ this.tagCopyService.copyProgress$
84
+ .pipe(takeUntil(this.destroy$))
85
+ .subscribe((progress) => {
86
+ this.copyProgress = progress;
87
+ });
88
+ this.tagCopyService.copyLog$
89
+ .pipe(takeUntil(this.destroy$))
90
+ .subscribe((log) => {
91
+ this.copyLog = log;
92
+ });
50
93
  }
94
+ //
95
+ // ---------- Lifecycle ----------
96
+ //
51
97
  ngOnInit() { }
98
+ ngOnDestroy() {
99
+ this.destroy$.next(true);
100
+ this.destroy$.complete();
101
+ }
102
+ //
103
+ // ---------- Setup ----------
104
+ //
52
105
  async setup() {
53
106
  this.space = await this.spaceService.getSpace(this.id);
54
107
  this.setupMenuItems();
55
108
  this.setGuestLink();
56
109
  this.setCanArchive();
57
- }
58
- ngOnDestroy() {
59
- this.destroy$.next(true);
60
- this.destroy$.complete();
110
+ this.isAdmin = this.userService.isSPAdmin();
111
+ if (this.isAdmin) {
112
+ const spaces = await this.spaceService.getLocationsForCurrentUser();
113
+ this.spaces = spaces.filter((space) => space.id !== this.id).sort((a, b) => (a.name || '').localeCompare(b.name || ''));
114
+ }
115
+ // Visits (3D models) belonging to the CURRENT space, used as copy targets
116
+ this.visits = await this.visitService.getVisitsForSpaceForUser(this.id);
61
117
  }
62
118
  setupMenuItems() {
63
119
  this.menuItems = [
@@ -74,12 +130,36 @@ export class DetailLocationComponent {
74
130
  this.menuItems.push({ label: "Information" });
75
131
  }
76
132
  }
133
+ async setCanArchive() {
134
+ this.canArchive = this.userService.isSPAdmin()
135
+ ? true
136
+ : await this.spaceService.canArchiveSpace(this.id);
137
+ }
138
+ setGuestLink() {
139
+ if (this.space.guestLink) {
140
+ const { origin } = document.location;
141
+ this.guestLink = `${origin}/${this.space.guestLink}`;
142
+ setTimeout(() => {
143
+ const hyperlink = document.querySelector("#linkHref");
144
+ const message = this.translate.instant("confirm.followLink");
145
+ hyperlink.addEventListener("click", async () => {
146
+ if (window.confirm(message)) {
147
+ window.location.href = this.guestLink;
148
+ await this.userService.logoutCurrentAndSignOutAuth();
149
+ this.router.navigate(["auth"]);
150
+ }
151
+ });
152
+ }, 0);
153
+ }
154
+ }
155
+ //
156
+ // ---------- Edit / archive / navigation ----------
157
+ //
77
158
  onEdit() {
78
159
  this.isEditing = true;
79
160
  this.setupMenuItems();
80
161
  }
81
162
  onReturn() {
82
- // this.locationService.back()
83
163
  this.router.navigate(["dashboard/localisation"]);
84
164
  }
85
165
  reset() {
@@ -100,6 +180,9 @@ export class DetailLocationComponent {
100
180
  }
101
181
  this.setupMenuItems();
102
182
  }
183
+ //
184
+ // ---------- DPE (energy diagnostic) ----------
185
+ //
103
186
  onDpeValidate() {
104
187
  this.isValidatingDpe = true;
105
188
  this.parsedMetadata = JSON.parse(this.space.metadata);
@@ -144,39 +227,157 @@ export class DetailLocationComponent {
144
227
  id: this.space.id,
145
228
  status: SpaceStatus.DPE_FETCH,
146
229
  });
147
- // force update of location
148
230
  setTimeout(async () => {
149
231
  this.space = await this.spaceService.getSpace(this.space.id);
150
232
  this.gettingData = false;
151
233
  }, 1500);
152
234
  }
153
- setGuestLink() {
154
- if (this.space.guestLink) {
155
- const { origin } = document.location;
156
- this.guestLink = `${origin}/${this.space.guestLink}`;
157
- setTimeout(() => {
158
- const hyperlink = document.querySelector("#linkHref");
159
- const message = this.translate.instant("confirm.followLink");
160
- hyperlink.addEventListener("click", async () => {
161
- if (window.confirm(message)) {
162
- window.location.href = this.guestLink;
163
- await this.userService.logoutCurrentAndSignOutAuth();
164
- this.router.navigate(["auth"]);
165
- }
166
- });
167
- }, 0);
235
+ //
236
+ // ---------- Copy POIs between visits ----------
237
+ //
238
+ /** Toggles visibility of the admin "copy POIs from another location" form. */
239
+ toggleCopyPoisForm() {
240
+ this.showCopyPoisForm = !this.showCopyPoisForm;
241
+ }
242
+ onSourceLandmarkPicked(slot, point) {
243
+ if (slot === 'A') {
244
+ this.landmarkSourceA = point;
245
+ }
246
+ else {
247
+ this.landmarkSourceB = point;
168
248
  }
169
249
  }
170
- async setCanArchive() {
171
- this.canArchive = this.userService.isSPAdmin()
172
- ? true
173
- : await this.spaceService.canArchiveSpace(this.id);
250
+ onTargetLandmarkPicked(slot, point) {
251
+ if (slot === 'A') {
252
+ this.landmarkTargetA = point;
253
+ }
254
+ else {
255
+ this.landmarkTargetB = point;
256
+ }
257
+ }
258
+ /** Loads the visits (3D models) available for the newly selected source space. */
259
+ async onSourceSpaceChange() {
260
+ this.sourceVisits = this.selectedSourceSpaceId
261
+ ? await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId)
262
+ : [];
263
+ this.selectedSource3dModel = null;
264
+ this.onModelSelectionChange();
265
+ }
266
+ /** Resets landmark selections whenever the source or target 3D model changes. */
267
+ onModelSelectionChange() {
268
+ this.landmarkSourceA = null;
269
+ this.landmarkTargetA = null;
270
+ this.landmarkSourceB = null;
271
+ this.landmarkTargetB = null;
272
+ }
273
+ /** True once both models are selected, all 4 landmarks are picked, and A/B pairs are far enough apart. */
274
+ get canCopyPois() {
275
+ if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {
276
+ return false;
277
+ }
278
+ if (!this.landmarkSourceA || !this.landmarkTargetA || !this.landmarkSourceB || !this.landmarkTargetB) {
279
+ return false;
280
+ }
281
+ const sourceDist = distance(this.landmarkSourceA, this.landmarkSourceB);
282
+ const targetDist = distance(this.landmarkTargetA, this.landmarkTargetB);
283
+ return sourceDist >= MIN_LANDMARK_DISTANCE && targetDist >= MIN_LANDMARK_DISTANCE;
284
+ }
285
+ async onCopyPois() {
286
+ const selectedTargetSpaceId = this.id;
287
+ if (!this.selectedSourceSpaceId || !selectedTargetSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {
288
+ return;
289
+ }
290
+ if (this.selectedSourceSpaceId === selectedTargetSpaceId) {
291
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorSameSpace');
292
+ return;
293
+ }
294
+ if (!this.canCopyPois) {
295
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorLandmarksTooClose');
296
+ return;
297
+ }
298
+ this.isCopyingPois = true;
299
+ this.copyPoisResultMsg = null;
300
+ try {
301
+ const success = await this.tagCopyService.copyTagsFromVisit(this.selectedSourceSpaceId, selectedTargetSpaceId, this.landmarkSourceA, this.landmarkTargetA, this.landmarkSourceB, this.landmarkTargetB);
302
+ this.copyPoisResultMsg = this.translate.instant(success ? 'matterportCopy.successMsg' : 'matterportCopy.errorMsg');
303
+ }
304
+ catch (error) {
305
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorMsg');
306
+ }
307
+ this.isCopyingPois = false;
308
+ setTimeout(() => {
309
+ this.copyPoisResultMsg = null;
310
+ }, 5000);
311
+ }
312
+ /** Downloads the current source/target selection + all 4 landmarks as a JSON file. */
313
+ exportLandmarkConfig() {
314
+ if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {
315
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorExportMissingSelection');
316
+ return;
317
+ }
318
+ const config = {
319
+ sourceSpaceId: this.selectedSourceSpaceId,
320
+ sourceVisit3dModel: this.selectedSource3dModel,
321
+ targetVisit3dModel: this.selectedTarget3dModel,
322
+ landmarkSourceA: this.landmarkSourceA,
323
+ landmarkTargetA: this.landmarkTargetA,
324
+ landmarkSourceB: this.landmarkSourceB,
325
+ landmarkTargetB: this.landmarkTargetB
326
+ };
327
+ const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' });
328
+ const url = URL.createObjectURL(blob);
329
+ const a = document.createElement('a');
330
+ a.href = url;
331
+ a.download = `landmarks_${this.selectedSource3dModel}_to_${this.selectedTarget3dModel}.json`;
332
+ a.click();
333
+ URL.revokeObjectURL(url);
334
+ }
335
+ /** Triggered by the hidden file input; reads and applies a previously exported JSON config. */
336
+ async onImportLandmarkConfigSelected(event) {
337
+ const input = event.target;
338
+ const file = input.files?.[0];
339
+ if (!file) {
340
+ return;
341
+ }
342
+ try {
343
+ const text = await file.text();
344
+ const config = JSON.parse(text);
345
+ // Basic shape validation before applying
346
+ const requiredKeys = ['sourceSpaceId', 'sourceVisit3dModel', 'targetVisit3dModel',
347
+ 'landmarkSourceA', 'landmarkTargetA', 'landmarkSourceB', 'landmarkTargetB'];
348
+ const missing = requiredKeys.filter(k => !(k in config));
349
+ if (missing.length > 0) {
350
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorInvalidConfig', { keys: missing.join(', ') });
351
+ return;
352
+ }
353
+ this.selectedSourceSpaceId = config.sourceSpaceId;
354
+ // Reload the source space's visit list so the select has the right options
355
+ this.sourceVisits = await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId);
356
+ this.selectedSource3dModel = config.sourceVisit3dModel;
357
+ this.selectedTarget3dModel = config.targetVisit3dModel;
358
+ this.landmarkSourceA = config.landmarkSourceA;
359
+ this.landmarkTargetA = config.landmarkTargetA;
360
+ this.landmarkSourceB = config.landmarkSourceB;
361
+ this.landmarkTargetB = config.landmarkTargetB;
362
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.successImport');
363
+ }
364
+ catch (err) {
365
+ console.error('Failed to import landmark config', err);
366
+ this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorImportRead');
367
+ }
368
+ finally {
369
+ // Reset the input so re-selecting the same file re-triggers the change event
370
+ input.value = '';
371
+ }
174
372
  }
175
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.SpaceService }, { token: i1.Router }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.NavigatorService }], target: i0.ɵɵFactoryTarget.Component });
176
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DetailLocationComponent, selector: "lib-detail-location", ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i9.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
373
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, deps: [{ token: MATTERPORT_SDK_KEY }, { token: i1.ActivatedRoute }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i1.Router }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.NavigatorService }, { token: i2.MatterportTagCopyService }], target: i0.ɵɵFactoryTarget.Component });
374
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DetailLocationComponent, selector: "lib-detail-location", ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle button for the admin \"Copy POIs\" form -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\r\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\r\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- Admin Form to Copy POIs -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\r\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\r\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\r\n class=\"border rounded p-3 mb-3 bg-white\">\r\n <p class=\"small text-muted mb-2\">\r\n {{ 'matterportCopy.landmarkInstructions' | translate }}\r\n </p>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center pt-2\">\r\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\r\n (click)=\"onCopyPois()\">\r\n {{ 'matterportCopy.copyButton' | translate }}\r\n </button>\r\n <div class=\"d-flex align-items-center gap-2 mb-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\r\n {{ 'matterportCopy.exportLandmarks' | translate }}\r\n </button>\r\n\r\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\r\n {{ 'matterportCopy.importLandmarks' | translate }}\r\n <input type=\"file\" accept=\"application/json\" hidden\r\n (change)=\"onImportLandmarkConfigSelected($event)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\r\n {{ copyPoisResultMsg }}\r\n </div>\r\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\r\n <div class=\"d-flex justify-content-between small mb-1\">\r\n <span>\r\n <ng-container [ngSwitch]=\"copyProgress.phase\">\r\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\r\n }}</span>\r\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\r\n </ng-container>\r\n </span>\r\n <span>{{ copyProgress.percent }}%</span>\r\n </div>\r\n <div class=\"progress\" style=\"height: 6px;\">\r\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\r\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\r\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\r\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\r\n </div>\r\n </div>\r\n\r\n <!-- Detailed step-by-step log -->\r\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\r\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\r\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\">\r\n {{ entry.text }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.LandmarkPickerComponent, selector: "lib-landmark-picker", inputs: ["visit3dModel", "sdkKey", "title", "value"], outputs: ["pointPicked"] }, { kind: "component", type: i9.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i10.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
177
375
  }
178
376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, decorators: [{
179
377
  type: Component,
180
- args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>" }]
181
- }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i1.Router }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.NavigatorService }] });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBSWxELE9BQU8sRUFBNkQsV0FBVyxFQUFTLE1BQU0sbUNBQW1DLENBQUM7QUFDbEksT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBTzFDLE1BQU0sT0FBTyx1QkFBdUI7SUFvQ3BCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXZDWixLQUFLLENBQVE7SUFFYixRQUFRLENBQW1CO0lBRTNCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEIsYUFBYSxDQUFPO0lBRXBCLEVBQUUsQ0FBUztJQUVYLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFFM0IsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUV4QixpQkFBaUIsQ0FBTTtJQUV2QixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXBCLGNBQWMsQ0FPVjtJQUVKLFNBQVMsQ0FBUztJQUVsQixVQUFVLENBQVU7SUFFcEIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFekIsWUFDWSxLQUFxQixFQUNyQixZQUEwQixFQUMxQixNQUFjLEVBQ2QsV0FBNEIsRUFDNUIsU0FBMkIsRUFDM0IsZ0JBQWtDO1FBTGxDLFVBQUssR0FB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LENBQUMsQ0FBQztJQUMzRCxDQUFDO3dHQXhNUSx1QkFBdUI7NEZBQXZCLHVCQUF1QiwyRENacEMscWxPQThHTTs7NEZEbEdPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgU3BhY2VTZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIE5hdmlnYXRvclNlcnZpY2UsIFNwYWNlU3RhdHVzLCBTcGFjZSB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtbG9jYXRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGV0YWlsTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHNwYWNlOiBTcGFjZTtcclxuXHJcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgICBpc0VkaXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpbWFnZVRvVXBsb2FkOiBGaWxlO1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG4gICAgaXNWYWxpZGF0aW5nRHBlID0gZmFsc2U7XHJcblxyXG4gICAgc2VsZWN0ZWREcGVSZXN1bHQ6IGFueTtcclxuXHJcbiAgICBnZXR0aW5nRGF0YSA9IGZhbHNlO1xyXG5cclxuICAgIHBhcnNlZE1ldGFkYXRhOiB7XHJcbiAgICAgICAgZ2VvX2FkcmVzc2U6IHN0cmluZztcclxuICAgICAgICBzZWN0ZXVyX2FjdGl2aXRlOiBzdHJpbmc7XHJcbiAgICAgICAgYW5uZWVfY29uc3RydWN0aW9uOiBzdHJpbmc7XHJcbiAgICAgICAgY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llOiBzdHJpbmc7XHJcbiAgICAgICAgY2xhc3NlX2VzdGltYXRpb25fZ2VzOiBzdHJpbmc7XHJcbiAgICAgICAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbiAgICB9W107XHJcblxyXG4gICAgZ3Vlc3RMaW5rOiBzdHJpbmc7XHJcblxyXG4gICAgY2FuQXJjaGl2ZTogYm9vbGVhbjtcclxuXHJcbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHNwYWNlSUQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9sb2NhbGlzYXRpb25cIiwgc3BhY2VJRF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkgeyB9XHJcblxyXG4gICAgYXN5bmMgc2V0dXAoKSB7XHJcbiAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuaWQpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnNldEd1ZXN0TGluaygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FuQXJjaGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuc3BhY2UubmFtZSxcclxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlLmlkfWAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogXCJFZGl0XCIgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkluZm9ybWF0aW9uXCIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdCgpIHtcclxuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmV0dXJuKCkge1xyXG4gICAgICAgIC8vIHRoaXMubG9jYXRpb25TZXJ2aWNlLmJhY2soKVxyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9sb2NhbGlzYXRpb25cIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQXJjaGl2ZSgpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uYXJjaGl2ZVNwYWNlXCIpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5zb2Z0RGVsZXRlU3BhY2UodGhpcy5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMub25SZXR1cm4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3JtQ2hhbmdlKGV2ZW50OiBTcGFjZSkge1xyXG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSBldmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRHBlVmFsaWRhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGFyc2VkTWV0YWRhdGEgPSBKU09OLnBhcnNlKHRoaXMuc3BhY2UubWV0YWRhdGEpO1xyXG4gICAgICAgIHRoaXMucGFyc2VkTWV0YWRhdGEgPSB0aGlzLnBhcnNlZE1ldGFkYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgKHJlc3VsdCkgPT4gcmVzdWx0Lmdlb19hZHJlc3NlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RDaGFuZ2Uoc2VsZWN0ZWRSZXN1bHQ6IGFueSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHRoaXMucGFyc2VkTWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gc2VsZWN0ZWRSZXN1bHQgJiYgcmVzdWx0LnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRHBlUmVzdWx0ID0gc2VsZWN0ZWRSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TYXZlUmVzdWx0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRHBlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuc3BhY2UuaWQsXHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rpb25ZZWFyOiB0aGlzLnNlbGVjdGVkRHBlUmVzdWx0LmFubmVlX2NvbnN0cnVjdGlvbixcclxuICAgICAgICAgICAgICAgIGNsYXNzRW5lcmd5Q29uc3VtcHRpb246XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdC5jbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWUsXHJcbiAgICAgICAgICAgICAgICBjbGFzc0dlczogdGhpcy5zZWxlY3RlZERwZVJlc3VsdC5jbGFzc2VfZXN0aW1hdGlvbl9nZXMsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRMb2MgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZShpbnB1dCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSB1cGRhdGVkTG9jO1xyXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRXJhc2UoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2Uoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5zcGFjZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc3BhY2Uuc3RhdHVzID0gU3BhY2VTdGF0dXMuRFBFX1ZBTElEQVRFRDtcclxuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uR2V0RHBlRGF0YSgpIHtcclxuICAgICAgICB0aGlzLmdldHRpbmdEYXRhID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxyXG4gICAgICAgICAgICBzdGF0dXM6IFNwYWNlU3RhdHVzLkRQRV9GRVRDSCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZm9yY2UgdXBkYXRlIG9mIGxvY2F0aW9uXHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRTcGFjZSh0aGlzLnNwYWNlLmlkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIH0sIDE1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEd1ZXN0TGluaygpIHtcclxuICAgICAgICBpZiAodGhpcy5zcGFjZS5ndWVzdExpbmspIHtcclxuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLmd1ZXN0TGluayA9IGAke29yaWdpbn0vJHt0aGlzLnNwYWNlLmd1ZXN0TGlua31gO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgXCIjbGlua0hyZWZcIixcclxuICAgICAgICAgICAgICAgICkgYXMgSFRNTExpbmtFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmZvbGxvd0xpbmtcIik7XHJcbiAgICAgICAgICAgICAgICBoeXBlcmxpbmsuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmd1ZXN0TGluaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5sb2dvdXRDdXJyZW50QW5kU2lnbk91dEF1dGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiYXV0aFwiXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRDYW5BcmNoaXZlKCkge1xyXG4gICAgICAgIHRoaXMuY2FuQXJjaGl2ZSA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKClcclxuICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuY2FuQXJjaGl2ZVNwYWNlKHRoaXMuaWQpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XHJcbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwicmVzZXQoKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25SZXR1cm4oKVwiPnt7J0JhY2sgdG8gbG9jYXRpb25zJyB8XHJcbiAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIiFpc0VkaXRpbmcgJiYgc3BhY2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLm5hbWV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5hZGRyZXNzZXN9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jb25zdHJ1Y3Rpb25ZZWFyID9cclxuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jb25zdHJ1Y3Rpb25ZZWFyIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTGF0aXR1ZGUnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5sYXRpdHVkZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UubGF0aXR1ZGUgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvbmdpdHVkZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sb25naXR1ZGUgP1xyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmxvbmdpdHVkZSA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sZXZlbCB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIH19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydFbmVyZ3kgQ2xhc3MnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uID9cclxuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzcGFjZS5zdGF0dXMgIT09ICdEUEVfVE9fVkFMSURBVEUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbm8tbG93ZXJjYXNlIG1zLTVcIiAoY2xpY2spPVwib25HZXREcGVEYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snR2V0IGRhdGEgZnJvbSBBUEkgRFBFJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJiZy10cmFuc3BhcmVudCBtcy01XCIgKm5nSWY9XCJzcGFjZS5zdGF0dXMgPT09ICdEUEVfVE9fVkFMSURBVEUnXCIgKGNsaWNrKT1cIm9uRHBlVmFsaWRhdGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6YWxlcnQtY2lyY2xlLWNoZWNrXCIgc3R5bGU9XCJjb2xvcjogI2YxOWM4MDtcIiBkYXRhLXdpZHRoPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyNVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snRFBFIGRhdGEgZm91bmQuIENsaWNrIHRvIHZhbGlkYXRlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UuY2xhc3NHZXMgPyBzcGFjZS5jbGFzc0dlcyA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1NoYXJlYWJsZSBHdWVzdCBMaW5rJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCIgKm5nSWY9XCJndWVzdExpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJsaW5rSHJlZlwiIHRhcmdldD1cIl9ibGFua1wiPnt7J1RyeSB0aGUgbGluaycgfCB0cmFuc2xhdGUgfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJndWVzdExpbmtcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDsgZGlzcGxheTogaW5saW5lO1wiIG5nYlRvb2x0aXA9XCJDb3BpZWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiY2xpY2s6Ymx1clwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmNvbnRlbnQtY29weVwiIGRhdGEtaW5saW5lPVwiZmFsc2VcIiBkYXRhLXdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lO1wiPnt7J05vIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiPjxzbWFsbD4oe3snR2VuZXJhdGUgbGluayBmcm9tIGEgVklTSVRPUiBtaXNzaW9uJ3x0cmFuc2xhdGV9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImdldHRpbmdEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIChjbGljayk9XCJvbkVkaXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2NhdGlvbi1lZGl0LWJ0blwiPnt7J0VkaXQnIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtd3JhcHBlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7IWNhbkFyY2hpdmUgPyAoJ0NvbnRhY3QgU21hcnRlclBsYW4nIHwgdHJhbnNsYXRlKSA6ICgnQXJjaGl2ZSBsb2NhdGlvbiBhbmQgcmVsYXRlZCBkYXRhJyB8IHRyYW5zbGF0ZSl9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BcmNoaXZlKClcIiBbZGlzYWJsZWRdPVwiIWNhbkFyY2hpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQXJjaGl2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCIgKm5nSWY9XCJpc1ZhbGlkYXRpbmdEcGVcIj5cclxuICAgICAgICAgICAgPGg2Pnt7J01vc3QgcmVsZXZhbnQgcmVzdWx0cyBmb3InIHwgdHJhbnNsYXRlfX0gOlxyXG4gICAgICAgICAgICAgICAgPGI+ZGlhZ25vc3RpY3MgZGUgcGVyZm9ybWFuY2Ugw6luZXJnw6l0aXF1ZSAoRFBFKSBkZXMgYsOidGltZW50cyB0ZXJ0aWFpcmVzPC9iPlxyXG4gICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj4jPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQXBwbHkgdG8gbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQWN0aXZpdHkgc2VjdG9yJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydFbmVyZ3kgQ2xhc3MnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydHcmVlbmhvdXNlIGdhcyBlbWlzc2lvbiBDbGFzcycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByZXN1bHQgb2YgcGFyc2VkTWV0YWRhdGE7IGluZGV4IGFzIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+e3sgaSArIDEgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPVwiY2hlY2tib3gtYXBwbHlcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInJlc3VsdC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZShyZXN1bHQpXCI+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cmVzdWx0Lmdlb19hZHJlc3NlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyZXN1bHQuc2VjdGV1cl9hY3Rpdml0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24gfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcmVzdWx0LmNsYXNzZV9jb25zb21tYXRpb25fZW5lcmdpZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByZXN1bHQuY2xhc3NlX2VzdGltYXRpb25fZ2VzIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uU2F2ZVJlc3VsdCgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWREcGVSZXN1bHRcIj57eydTYXZlIHNlbGVjdGVkJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FcmFzZSgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eydObyBtYXRjaCAoZXJhc2UgZGF0YSknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cclxuICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bGliLWZvcm0tbG9jYXRpb24gKm5nSWY9XCJpc0VkaXRpbmdcIiBbbG9jYXRpb25dPVwic3BhY2VcIiAob25DaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKCRldmVudClcIj48L2xpYi1mb3JtLWxvY2F0aW9uPlxyXG48L2Rpdj4iXX0=
378
+ args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle button for the admin \"Copy POIs\" form -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\r\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\r\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- Admin Form to Copy POIs -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\r\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\r\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\r\n class=\"border rounded p-3 mb-3 bg-white\">\r\n <p class=\"small text-muted mb-2\">\r\n {{ 'matterportCopy.landmarkInstructions' | translate }}\r\n </p>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center pt-2\">\r\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\r\n (click)=\"onCopyPois()\">\r\n {{ 'matterportCopy.copyButton' | translate }}\r\n </button>\r\n <div class=\"d-flex align-items-center gap-2 mb-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\r\n {{ 'matterportCopy.exportLandmarks' | translate }}\r\n </button>\r\n\r\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\r\n {{ 'matterportCopy.importLandmarks' | translate }}\r\n <input type=\"file\" accept=\"application/json\" hidden\r\n (change)=\"onImportLandmarkConfigSelected($event)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\r\n {{ copyPoisResultMsg }}\r\n </div>\r\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\r\n <div class=\"d-flex justify-content-between small mb-1\">\r\n <span>\r\n <ng-container [ngSwitch]=\"copyProgress.phase\">\r\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\r\n }}</span>\r\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\r\n </ng-container>\r\n </span>\r\n <span>{{ copyProgress.percent }}%</span>\r\n </div>\r\n <div class=\"progress\" style=\"height: 6px;\">\r\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\r\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\r\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\r\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\r\n </div>\r\n </div>\r\n\r\n <!-- Detailed step-by-step log -->\r\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\r\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\r\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\">\r\n {{ entry.text }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>" }]
379
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
380
+ type: Inject,
381
+ args: [MATTERPORT_SDK_KEY]
382
+ }] }, { type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i1.Router }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.NavigatorService }, { type: i2.MatterportTagCopyService }] });
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFLckUsT0FBTyxFQUNILGtCQUFrQixFQUN5QyxXQUFXLEVBRWhFLFFBQVEsRUFHakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7O0FBRTFDLHNHQUFzRztBQUN0RyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQU9sQyxNQUFNLE9BQU8sdUJBQXVCO0lBeURnQjtJQUNwQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBL0RaLDJCQUEyQjtJQUMzQixLQUFLLENBQVE7SUFDYixRQUFRLENBQW1CO0lBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsYUFBYSxDQUFPO0lBQ3BCLEVBQUUsQ0FBUztJQUNYLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFFM0Isa0NBQWtDO0lBQ2xDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsaUJBQWlCLENBQU07SUFDdkIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixjQUFjLENBT1Y7SUFFSixTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFVO0lB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LGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFFOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7Z0JBQVMsQ0FBQztZQUNQLDZFQUE2RTtZQUM3RSxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQzt3R0FuYVEsdUJBQXVCLGtCQXlEcEIsa0JBQWtCOzRGQXpEckIsdUJBQXVCLDJEQ3ZCcEMscW9mQTBQTTs7NEZEbk9PLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUI7OzBCQTZEMUIsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBNQVRURVJQT1JUX1NES19LRVksXHJcbiAgICBNZW51SXRlbSwgU3BhY2VTZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIE5hdmlnYXRvclNlcnZpY2UsIFNwYWNlU3RhdHVzLCBTcGFjZSxcclxuICAgIE1hdHRlcnBvcnRUYWdDb3B5U2VydmljZSwgQ29weVByb2dyZXNzLCBDb3B5TG9nRW50cnksXHJcbiAgICBWZWMzLCBkaXN0YW5jZSxcclxuICAgIFZpc2l0LFxyXG4gICAgVmlzaXRTZXJ2aWNlXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBNaW5pbXVtIGRpc3RhbmNlIChpbiBtZXRlcnMpIHJlcXVpcmVkIGJldHdlZW4gdGhlIHR3byBsYW5kbWFya3MgZm9yIGEgcmVsaWFibGUgcm90YXRpb24gY2FsY3VsYXRpb25cclxuY29uc3QgTUlOX0xBTkRNQVJLX0RJU1RBTkNFID0gMS41O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtbG9jYXRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGV0YWlsTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLy8gLS0tIExvY2F0aW9uIGRldGFpbHMgLS0tXHJcbiAgICBzcGFjZTogU3BhY2U7XHJcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICAgIGlzRWRpdGluZyA9IGZhbHNlO1xyXG4gICAgaW1hZ2VUb1VwbG9hZDogRmlsZTtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvLyAtLS0gRFBFIChlbmVyZ3kgZGlhZ25vc3RpYykgLS0tXHJcbiAgICBpc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIHNlbGVjdGVkRHBlUmVzdWx0OiBhbnk7XHJcbiAgICBnZXR0aW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgcGFyc2VkTWV0YWRhdGE6IHtcclxuICAgICAgICBnZW9fYWRyZXNzZTogc3RyaW5nO1xyXG4gICAgICAgIHNlY3RldXJfYWN0aXZpdGU6IHN0cmluZztcclxuICAgICAgICBhbm5lZV9jb25zdHJ1Y3Rpb246IHN0cmluZztcclxuICAgICAgICBjbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWU6IHN0cmluZztcclxuICAgICAgICBjbGFzc2VfZXN0aW1hdGlvbl9nZXM6IHN0cmluZztcclxuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICAgIH1bXTtcclxuXHJcbiAgICBndWVzdExpbms6IHN0cmluZztcclxuICAgIGNhbkFyY2hpdmU6IGJvb2xlYW47XHJcbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgLy8gLS0tIENvcHkgUE9JcyBiZXR3ZWVuIHZpc2l0cyAtLS1cclxuICAgIGlzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHNwYWNlczogU3BhY2VbXSA9IFtdO1xyXG5cclxuICAgIC8vIFdoZXRoZXIgdGhlIFwiY29weSBQT0lzXCIgYWRtaW4gZm9ybSBpcyBjdXJyZW50bHkgdmlzaWJsZSAoY29sbGFwc2VkIGJ5IGRlZmF1bHQpXHJcbiAgICBzaG93Q29weVBvaXNGb3JtID0gZmFsc2U7XHJcblxyXG4gICAgLy8gU2VsZWN0ZWQgc291cmNlIFNQQUNFIChhIHNwYWNlIG1heSBjb250YWluIDAuLk4gdmlzaXRzL21vZGVscylcclxuICAgIHNlbGVjdGVkU291cmNlU3BhY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLy8gU2VsZWN0ZWQgM0QgbW9kZWwgaWRzICh2aXNpdC5tb2RlbDNkKSDigJQgdGhpcyBpcyB3aGF0IGFjdHVhbGx5IGdldHMgbG9hZGVkIGluIHRoZSB2aWV3ZXJcclxuICAgIHNlbGVjdGVkU291cmNlM2RNb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFRhcmdldDNkTW9kZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8vIFZpc2l0cyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UsIGFuZCBmb3IgdGhlIGN1cnJlbnQgKHRhcmdldCkgc3BhY2VcclxuICAgIHNvdXJjZVZpc2l0czogVmlzaXRbXSA9IFtdO1xyXG4gICAgdmlzaXRzOiBWaXNpdFtdID0gW107XHJcblxyXG4gICAgLy8gM0QgbGFuZG1hcmsgcG9pbnRzIHBpY2tlZCBkaXJlY3RseSBpbiBlYWNoIHZpZXdlciAoc291cmNlIGFuZCB0YXJnZXQpXHJcbiAgICBsYW5kbWFya1NvdXJjZUE6IFZlYzMgfCBudWxsID0gbnVsbDtcclxuICAgIGxhbmRtYXJrVGFyZ2V0QTogVmVjMyB8IG51bGwgPSBudWxsO1xyXG4gICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsYW5kbWFya1RhcmdldEI6IFZlYzMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBpc0NvcHlpbmdQb2lzID0gZmFsc2U7XHJcbiAgICBjb3B5UG9pc1Jlc3VsdE1zZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBjb3B5UHJvZ3Jlc3M6IENvcHlQcm9ncmVzcyB8IG51bGwgPSBudWxsO1xyXG4gICAgY29weUxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHVibGljIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0YWdDb3B5U2VydmljZTogTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHNwYWNlSUQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9sb2NhbGlzYXRpb25cIiwgc3BhY2VJRF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlQcm9ncmVzcyRcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcm9ncmVzcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UHJvZ3Jlc3MgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuY29weUxvZyRcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsb2cpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29weUxvZyA9IGxvZztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gTGlmZWN5Y2xlIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyAtLS0tLS0tLS0tIFNldHVwIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgYXN5bmMgc2V0dXAoKSB7XHJcbiAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuaWQpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnNldEd1ZXN0TGluaygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FuQXJjaGl2ZSgpO1xyXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBZG1pbikge1xyXG4gICAgICAgICAgICBjb25zdCBzcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRMb2NhdGlvbnNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlcyA9IHNwYWNlcy5maWx0ZXIoKHNwYWNlKSA9PiBzcGFjZS5pZCAhPT0gdGhpcy5pZCkuc29ydCgoYSwgYikgPT4gKGEubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLm5hbWUgfHwgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVmlzaXRzICgzRCBtb2RlbHMpIGJlbG9uZ2luZyB0byB0aGUgQ1VSUkVOVCBzcGFjZSwgdXNlZCBhcyBjb3B5IHRhcmdldHNcclxuICAgICAgICB0aGlzLnZpc2l0cyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldFZpc2l0c0ZvclNwYWNlRm9yVXNlcih0aGlzLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cE1lbnVJdGVtcygpIHtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogXCJMb2NhdGlvbnNcIiwgdXJsOiBcIi9sb2NhbGlzYXRpb25cIiB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5zcGFjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuc3BhY2UuaWR9YCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkVkaXRcIiB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHsgbGFiZWw6IFwiSW5mb3JtYXRpb25cIiB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0Q2FuQXJjaGl2ZSgpIHtcclxuICAgICAgICB0aGlzLmNhbkFyY2hpdmUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzU1BBZG1pbigpXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNhbkFyY2hpdmVTcGFjZSh0aGlzLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRHdWVzdExpbmsoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3BhY2UuZ3Vlc3RMaW5rKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgb3JpZ2luIH0gPSBkb2N1bWVudC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5ndWVzdExpbmsgPSBgJHtvcmlnaW59LyR7dGhpcy5zcGFjZS5ndWVzdExpbmt9YDtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoeXBlcmxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiI2xpbmtIcmVmXCIsXHJcbiAgICAgICAgICAgICAgICApIGFzIEhUTUxMaW5rRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5mb2xsb3dMaW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5ndWVzdExpbms7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UubG9nb3V0Q3VycmVudEFuZFNpZ25PdXRBdXRoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImF1dGhcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gRWRpdCAvIGFyY2hpdmUgLyBuYXZpZ2F0aW9uIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgb25FZGl0KCkge1xyXG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZXR1cm4oKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BcmNoaXZlKCkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlU3BhY2VcIik7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnNvZnREZWxldGVTcGFjZSh0aGlzLmlkKTtcclxuICAgICAgICAgICAgdGhpcy5vblJldHVybigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoZXZlbnQ6IFNwYWNlKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IGV2ZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gRFBFIChlbmVyZ3kgZGlhZ25vc3RpYykgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICBvbkRwZVZhbGlkYXRlKCkge1xyXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0aW5nRHBlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnNwYWNlLm1ldGFkYXRhKTtcclxuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gdGhpcy5wYXJzZWRNZXRhZGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgIChyZXN1bHQpID0+IHJlc3VsdC5nZW9fYWRyZXNzZSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0Q2hhbmdlKHNlbGVjdGVkUmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0aGlzLnBhcnNlZE1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHNlbGVjdGVkUmVzdWx0ICYmIHJlc3VsdC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdCA9IHNlbGVjdGVkUmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU2F2ZVJlc3VsdCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERwZVJlc3VsdCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0aW9uWWVhcjogdGhpcy5zZWxlY3RlZERwZVJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NHZXM6IHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2VzdGltYXRpb25fZ2VzLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkTG9jID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2UoaW5wdXQpO1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlID0gdXBkYXRlZExvYztcclxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkVyYXNlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuc3BhY2UuaWQsXHJcbiAgICAgICAgICAgIHN0YXR1czogU3BhY2VTdGF0dXMuRFBFX1ZBTElEQVRFRCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNwYWNlLnN0YXR1cyA9IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQ7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkdldERwZURhdGEoKSB7XHJcbiAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2Uoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5zcGFjZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfRkVUQ0gsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZS5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0dGluZ0RhdGEgPSBmYWxzZTtcclxuICAgICAgICB9LCAxNTAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICAvKiogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIHRoZSBhZG1pbiBcImNvcHkgUE9JcyBmcm9tIGFub3RoZXIgbG9jYXRpb25cIiBmb3JtLiAqL1xyXG4gICAgdG9nZ2xlQ29weVBvaXNGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0NvcHlQb2lzRm9ybSA9ICF0aGlzLnNob3dDb3B5UG9pc0Zvcm07XHJcbiAgICB9XHJcblxyXG4gICAgb25Tb3VyY2VMYW5kbWFya1BpY2tlZChzbG90OiAnQScgfCAnQicsIHBvaW50OiBWZWMzKSB7XHJcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IHBvaW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gcG9pbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoc2xvdDogJ0EnIHwgJ0InLCBwb2ludDogVmVjMykge1xyXG4gICAgICAgIGlmIChzbG90ID09PSAnQScpIHtcclxuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBwb2ludDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IHBvaW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogTG9hZHMgdGhlIHZpc2l0cyAoM0QgbW9kZWxzKSBhdmFpbGFibGUgZm9yIHRoZSBuZXdseSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UuICovXHJcbiAgICBhc3luYyBvblNvdXJjZVNwYWNlQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuc291cmNlVmlzaXRzID0gdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWRcclxuICAgICAgICAgICAgPyBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMub25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXNldHMgbGFuZG1hcmsgc2VsZWN0aW9ucyB3aGVuZXZlciB0aGUgc291cmNlIG9yIHRhcmdldCAzRCBtb2RlbCBjaGFuZ2VzLiAqL1xyXG4gICAgb25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRydWUgb25jZSBib3RoIG1vZGVscyBhcmUgc2VsZWN0ZWQsIGFsbCA0IGxhbmRtYXJrcyBhcmUgcGlja2VkLCBhbmQgQS9CIHBhaXJzIGFyZSBmYXIgZW5vdWdoIGFwYXJ0LiAqL1xyXG4gICAgZ2V0IGNhbkNvcHlQb2lzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sYW5kbWFya1NvdXJjZUEgfHwgIXRoaXMubGFuZG1hcmtUYXJnZXRBIHx8ICF0aGlzLmxhbmRtYXJrU291cmNlQiB8fCAhdGhpcy5sYW5kbWFya1RhcmdldEIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzb3VyY2VEaXN0ID0gZGlzdGFuY2UodGhpcy5sYW5kbWFya1NvdXJjZUEsIHRoaXMubGFuZG1hcmtTb3VyY2VCKTtcclxuICAgICAgICBjb25zdCB0YXJnZXREaXN0ID0gZGlzdGFuY2UodGhpcy5sYW5kbWFya1RhcmdldEEsIHRoaXMubGFuZG1hcmtUYXJnZXRCKTtcclxuICAgICAgICByZXR1cm4gc291cmNlRGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0UgJiYgdGFyZ2V0RGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25Db3B5UG9pcygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhcmdldFNwYWNlSWQgPSB0aGlzLmlkO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICFzZWxlY3RlZFRhcmdldFNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCA9PT0gc2VsZWN0ZWRUYXJnZXRTcGFjZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvclNhbWVTcGFjZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jYW5Db3B5UG9pcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JMYW5kbWFya3NUb29DbG9zZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzQ29weWluZ1BvaXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlUYWdzRnJvbVZpc2l0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhcmdldFNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSxcclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRBLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAnbWF0dGVycG9ydENvcHkuc3VjY2Vzc01zZycgOiAnbWF0dGVycG9ydENvcHkuZXJyb3JNc2cnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yTXNnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNDb3B5aW5nUG9pcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IG51bGw7XHJcbiAgICAgICAgfSwgNTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERvd25sb2FkcyB0aGUgY3VycmVudCBzb3VyY2UvdGFyZ2V0IHNlbGVjdGlvbiArIGFsbCA0IGxhbmRtYXJrcyBhcyBhIEpTT04gZmlsZS4gKi9cclxuICAgIGV4cG9ydExhbmRtYXJrQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JFeHBvcnRNaXNzaW5nU2VsZWN0aW9uJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgc291cmNlU3BhY2VJZDogdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQsXHJcbiAgICAgICAgICAgIHNvdXJjZVZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwsXHJcbiAgICAgICAgICAgIHRhcmdldFZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQTogdGhpcy5sYW5kbWFya1NvdXJjZUEsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QTogdGhpcy5sYW5kbWFya1RhcmdldEEsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQjogdGhpcy5sYW5kbWFya1NvdXJjZUIsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QjogdGhpcy5sYW5kbWFya1RhcmdldEJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgYS5ocmVmID0gdXJsO1xyXG4gICAgICAgIGEuZG93bmxvYWQgPSBgbGFuZG1hcmtzXyR7dGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWx9X3RvXyR7dGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWx9Lmpzb25gO1xyXG4gICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRyaWdnZXJlZCBieSB0aGUgaGlkZGVuIGZpbGUgaW5wdXQ7IHJlYWRzIGFuZCBhcHBsaWVzIGEgcHJldmlvdXNseSBleHBvcnRlZCBKU09OIGNvbmZpZy4gKi9cclxuICAgIGFzeW5jIG9uSW1wb3J0TGFuZG1hcmtDb25maWdTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdO1xyXG4gICAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCYXNpYyBzaGFwZSB2YWxpZGF0aW9uIGJlZm9yZSBhcHBseWluZ1xyXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ3NvdXJjZVNwYWNlSWQnLCAnc291cmNlVmlzaXQzZE1vZGVsJywgJ3RhcmdldFZpc2l0M2RNb2RlbCcsXHJcbiAgICAgICAgICAgICAgICAnbGFuZG1hcmtTb3VyY2VBJywgJ2xhbmRtYXJrVGFyZ2V0QScsICdsYW5kbWFya1NvdXJjZUInLCAnbGFuZG1hcmtUYXJnZXRCJ107XHJcbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZEtleXMuZmlsdGVyKGsgPT4gIShrIGluIGNvbmZpZykpO1xyXG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JJbnZhbGlkQ29uZmlnJywgeyBrZXlzOiBtaXNzaW5nLmpvaW4oJywgJykgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkID0gY29uZmlnLnNvdXJjZVNwYWNlSWQ7XHJcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgc291cmNlIHNwYWNlJ3MgdmlzaXQgbGlzdCBzbyB0aGUgc2VsZWN0IGhhcyB0aGUgcmlnaHQgb3B0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZVZpc2l0cyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldFZpc2l0c0ZvclNwYWNlRm9yVXNlcih0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCA9IGNvbmZpZy5zb3VyY2VWaXNpdDNkTW9kZWw7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsID0gY29uZmlnLnRhcmdldFZpc2l0M2RNb2RlbDtcclxuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUEgPSBjb25maWcubGFuZG1hcmtTb3VyY2VBO1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QSA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEE7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gY29uZmlnLmxhbmRtYXJrU291cmNlQjtcclxuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEIgPSBjb25maWcubGFuZG1hcmtUYXJnZXRCO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LnN1Y2Nlc3NJbXBvcnQnKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGltcG9ydCBsYW5kbWFyayBjb25maWcnLCBlcnIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JJbXBvcnRSZWFkJyk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGlucHV0IHNvIHJlLXNlbGVjdGluZyB0aGUgc2FtZSBmaWxlIHJlLXRyaWdnZXJzIHRoZSBjaGFuZ2UgZXZlbnRcclxuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XHJcbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwicmVzZXQoKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25SZXR1cm4oKVwiPnt7J0JhY2sgdG8gbG9jYXRpb25zJyB8XHJcbiAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIiFpc0VkaXRpbmcgJiYgc3BhY2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLm5hbWV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5hZGRyZXNzZXN9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jb25zdHJ1Y3Rpb25ZZWFyID9cclxuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jb25zdHJ1Y3Rpb25ZZWFyIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTGF0aXR1ZGUnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5sYXRpdHVkZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UubGF0aXR1ZGUgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvbmdpdHVkZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sb25naXR1ZGUgP1xyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmxvbmdpdHVkZSA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sZXZlbCB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIH19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydFbmVyZ3kgQ2xhc3MnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uID9cclxuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzcGFjZS5zdGF0dXMgIT09ICdEUEVfVE9fVkFMSURBVEUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbm8tbG93ZXJjYXNlIG1zLTVcIiAoY2xpY2spPVwib25HZXREcGVEYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snR2V0IGRhdGEgZnJvbSBBUEkgRFBFJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJiZy10cmFuc3BhcmVudCBtcy01XCIgKm5nSWY9XCJzcGFjZS5zdGF0dXMgPT09ICdEUEVfVE9fVkFMSURBVEUnXCIgKGNsaWNrKT1cIm9uRHBlVmFsaWRhdGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6YWxlcnQtY2lyY2xlLWNoZWNrXCIgc3R5bGU9XCJjb2xvcjogI2YxOWM4MDtcIiBkYXRhLXdpZHRoPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyNVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snRFBFIGRhdGEgZm91bmQuIENsaWNrIHRvIHZhbGlkYXRlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UuY2xhc3NHZXMgPyBzcGFjZS5jbGFzc0dlcyA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1NoYXJlYWJsZSBHdWVzdCBMaW5rJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCIgKm5nSWY9XCJndWVzdExpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJsaW5rSHJlZlwiIHRhcmdldD1cIl9ibGFua1wiPnt7J1RyeSB0aGUgbGluaycgfCB0cmFuc2xhdGUgfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJndWVzdExpbmtcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDsgZGlzcGxheTogaW5saW5lO1wiIG5nYlRvb2x0aXA9XCJDb3BpZWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiY2xpY2s6Ymx1clwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmNvbnRlbnQtY29weVwiIGRhdGEtaW5saW5lPVwiZmFsc2VcIiBkYXRhLXdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lO1wiPnt7J05vIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiPjxzbWFsbD4oe3snR2VuZXJhdGUgbGluayBmcm9tIGEgVklTSVRPUiBtaXNzaW9uJ3x0cmFuc2xhdGV9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImdldHRpbmdEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aHI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIChjbGljayk9XCJvbkVkaXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2NhdGlvbi1lZGl0LWJ0blwiPnt7J0VkaXQnIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtd3JhcHBlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7IWNhbkFyY2hpdmUgPyAoJ0NvbnRhY3QgU21hcnRlclBsYW4nIHwgdHJhbnNsYXRlKSA6ICgnQXJjaGl2ZSBsb2NhdGlvbiBhbmQgcmVsYXRlZCBkYXRhJyB8IHRyYW5zbGF0ZSl9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BcmNoaXZlKClcIiBbZGlzYWJsZWRdPVwiIWNhbkFyY2hpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQXJjaGl2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCIgKm5nSWY9XCJpc1ZhbGlkYXRpbmdEcGVcIj5cclxuICAgICAgICAgICAgPGg2Pnt7J01vc3QgcmVsZXZhbnQgcmVzdWx0cyBmb3InIHwgdHJhbnNsYXRlfX0gOlxyXG4gICAgICAgICAgICAgICAgPGI+ZGlhZ25vc3RpY3MgZGUgcGVyZm9ybWFuY2Ugw6luZXJnw6l0aXF1ZSAoRFBFKSBkZXMgYsOidGltZW50cyB0ZXJ0aWFpcmVzPC9iPlxyXG4gICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj4jPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQXBwbHkgdG8gbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQWN0aXZpdHkgc2VjdG9yJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydFbmVyZ3kgQ2xhc3MnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydHcmVlbmhvdXNlIGdhcyBlbWlzc2lvbiBDbGFzcycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByZXN1bHQgb2YgcGFyc2VkTWV0YWRhdGE7IGluZGV4IGFzIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+e3sgaSArIDEgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPVwiY2hlY2tib3gtYXBwbHlcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInJlc3VsdC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZShyZXN1bHQpXCI+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cmVzdWx0Lmdlb19hZHJlc3NlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyZXN1bHQuc2VjdGV1cl9hY3Rpdml0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24gfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcmVzdWx0LmNsYXNzZV9jb25zb21tYXRpb25fZW5lcmdpZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByZXN1bHQuY2xhc3NlX2VzdGltYXRpb25fZ2VzIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uU2F2ZVJlc3VsdCgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWREcGVSZXN1bHRcIj57eydTYXZlIHNlbGVjdGVkJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FcmFzZSgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eydObyBtYXRjaCAoZXJhc2UgZGF0YSknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cclxuICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUb2dnbGUgYnV0dG9uIGZvciB0aGUgYWRtaW4gXCJDb3B5IFBPSXNcIiBmb3JtIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImlzQWRtaW4gJiYgc3BhY2VzICYmIHNwYWNlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cInRvZ2dsZUNvcHlQb2lzRm9ybSgpXCI+XHJcbiAgICAgICAgICAgIHt7IChzaG93Q29weVBvaXNGb3JtID8gJ21hdHRlcnBvcnRDb3B5LmhpZGVGb3JtJyA6ICdtYXR0ZXJwb3J0Q29weS5zaG93Rm9ybScpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEFkbWluIEZvcm0gdG8gQ29weSBQT0lzIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImlzQWRtaW4gJiYgc3BhY2VzICYmIHNwYWNlcy5sZW5ndGggPiAwICYmIHNob3dDb3B5UG9pc0Zvcm1cIiBjbGFzcz1cIm10LTMgcC00IGJvcmRlciByb3VuZGVkIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgPGg2Pnt7ICdtYXR0ZXJwb3J0Q29weS5mb3JtVGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oNj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zb3VyY2VTcGFjZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU291cmNlU3BhY2VJZFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU291cmNlU3BhY2VDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNlbGVjdFNwYWNlJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2Ygc3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj57e3NwYWNlLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIiAqbmdJZj1cInNvdXJjZVZpc2l0c1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnbWF0dGVycG9ydENvcHkuc2VsZWN0VmlzaXQnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzb3VyY2VWaXNpdHNcIiBbbmdWYWx1ZV09XCJ2aXNpdC5tb2RlbDNkXCI+e3t2aXNpdC5uYW1lfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXQnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zZWxlY3RWaXNpdCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZpc2l0IG9mIHZpc2l0c1wiIFtuZ1ZhbHVlXT1cInZpc2l0Lm1vZGVsM2RcIj57e3Zpc2l0Lm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkU291cmNlU3BhY2VJZCAmJiBzZWxlY3RlZFNvdXJjZTNkTW9kZWwgJiYgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcm91bmRlZCBwLTMgbWItMyBiZy13aGl0ZVwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWQgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZ3LWJvbGQgc21hbGwgbWItMlwiPnt7ICdtYXR0ZXJwb3J0Q29weS5sYW5kbWFya0EnIHwgdHJhbnNsYXRlIH19PC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtTb3VyY2VBXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRQaWNrZWQpPVwib25Tb3VyY2VMYW5kbWFya1BpY2tlZCgnQScsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtUYXJnZXRBXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRQaWNrZWQpPVwib25UYXJnZXRMYW5kbWFya1BpY2tlZCgnQScsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZ3LWJvbGQgc21hbGwgbWItMlwiPnt7ICdtYXR0ZXJwb3J0Q29weS5sYW5kbWFya0InIHwgdHJhbnNsYXRlIH19PC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWxhbmRtYXJrLXBpY2tlciBbdmlzaXQzZE1vZGVsXT1cInNlbGVjdGVkU291cmNlM2RNb2RlbFwiIFtzZGtLZXldPVwic2RrS2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrU291cmNlQlwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uU291cmNlTGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saWItbGFuZG1hcmstcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWxhbmRtYXJrLXBpY2tlciBbdmlzaXQzZE1vZGVsXT1cInNlbGVjdGVkVGFyZ2V0M2RNb2RlbFwiIFtzZGtLZXldPVwic2RrS2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrVGFyZ2V0QlwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnRhcmdldFZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saWItbGFuZG1hcmstcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwdC0yXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiBbZGlzYWJsZWRdPVwiIWNhbkNvcHlQb2lzIHx8IGlzQ29weWluZ1BvaXNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29weVBvaXMoKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmNvcHlCdXR0b24nIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImV4cG9ydExhbmRtYXJrQ29uZmlnKClcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnbWF0dGVycG9ydENvcHkuZXhwb3J0TGFuZG1hcmtzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdtYXR0ZXJwb3J0Q29weS5pbXBvcnRMYW5kbWFya3MnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIGhpZGRlblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSW1wb3J0TGFuZG1hcmtDb25maWdTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ29weWluZ1BvaXNcIiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UG9pc1Jlc3VsdE1zZ1wiIGNsYXNzPVwibXQtMiB0ZXh0LXN1Y2Nlc3MgZnctYm9sZFwiPlxyXG4gICAgICAgICAgICB7eyBjb3B5UG9pc1Jlc3VsdE1zZyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UHJvZ3Jlc3NcIiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb3B5UHJvZ3Jlc3MucGhhc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjb2xsZWN0aW5nJ1wiPnt7ICdDb2xsZWN0aW5nIGluZm9ybWF0aW9uIGZyb20gYm90aCB2aXNpdHMuLi4nIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0aWNrZXRzJ1wiPnt7ICdDb3B5aW5nIHRpY2tldHMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZXF1aXBtZW50cydcIj57eyAnQ29weWluZyBlcXVpcG1lbnRzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3BvaXMnXCI+e3sgJ0NvcHlpbmcgc3RhbmRhbG9uZSBQT0lzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ29iamVjdHMzZCdcIj57eyAnQ29weWluZyAzRCBvYmplY3RzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2ZlYXR1cmVzJ1wiPnt7ICdDb3B5aW5nIGZlYXR1cmVzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ21lYXN1cmVtZW50cydcIj57eyAnQ29weWluZyBtZWFzdXJlbWVudHMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZG9uZSdcIj57eyAnRG9uZSEnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29weVByb2dyZXNzLnBlcmNlbnQgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgc3R5bGU9XCJoZWlnaHQ6IDZweDtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbY2xhc3MucHJvZ3Jlc3MtYmFyLXN0cmlwZWRdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5wcm9ncmVzcy1iYXItYW5pbWF0ZWRdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy13YXJuaW5nXT1cImNvcHlQcm9ncmVzcy5lcnJvckNvdW50ID4gMFwiIHJvbGU9XCJwcm9ncmVzc2JhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZycgPyAxMDAgOiBjb3B5UHJvZ3Jlc3MucGVyY2VudFwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBEZXRhaWxlZCBzdGVwLWJ5LXN0ZXAgbG9nIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29weUxvZy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtdC0yIHAtMiBiZy13aGl0ZSBib3JkZXIgcm91bmRlZCBzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZW50cnkgb2YgY29weUxvZ1wiIFtjbGFzcy50ZXh0LWRhbmdlcl09XCJlbnRyeS50eXBlID09PSAnZXJyb3InXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGxpYi1mb3JtLWxvY2F0aW9uICpuZ0lmPVwiaXNFZGl0aW5nXCIgW2xvY2F0aW9uXT1cInNwYWNlXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cclxuPC9kaXY+Il19