@smarterplan/ngx-smarterplan-locations 0.4.20 → 0.4.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/detail-location/detail-location.component.mjs +40 -4
- package/esm2022/lib/components/visits/visits.component.mjs +5 -2
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs +42 -3
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/lib/components/detail-location/detail-location.component.d.ts +13 -0
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MATTERPORT_SDK_KEY, SpaceStatus, distance } from '@smarterplan/ngx-smarterplan-core';
|
|
2
|
+
import { MATTERPORT_SDK_KEY, SpaceStatus, distance, CaptureViewer } 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";
|
|
@@ -52,6 +52,10 @@ export class DetailLocationComponent {
|
|
|
52
52
|
// Visits available for the selected source space, and for the current (target) space
|
|
53
53
|
sourceVisits = [];
|
|
54
54
|
visits = [];
|
|
55
|
+
/** The capture a visitor opens by default, of any viewer type. Null means none chosen. */
|
|
56
|
+
defaultCaptureID = null;
|
|
57
|
+
savingDefaultCapture = false;
|
|
58
|
+
defaultCaptureError = null;
|
|
55
59
|
// 3D landmark points picked directly in each viewer (source and target)
|
|
56
60
|
landmarkSourceA = null;
|
|
57
61
|
landmarkTargetA = null;
|
|
@@ -114,6 +118,7 @@ export class DetailLocationComponent {
|
|
|
114
118
|
}
|
|
115
119
|
// Visits (3D models) belonging to the CURRENT space, used as copy targets
|
|
116
120
|
this.visits = await this.visitService.getVisitsForSpaceForUser(this.id);
|
|
121
|
+
this.defaultCaptureID = this.space?.defaultCaptureID ?? null;
|
|
117
122
|
}
|
|
118
123
|
setupMenuItems() {
|
|
119
124
|
this.menuItems = [
|
|
@@ -233,6 +238,37 @@ export class DetailLocationComponent {
|
|
|
233
238
|
}, 1500);
|
|
234
239
|
}
|
|
235
240
|
//
|
|
241
|
+
/**
|
|
242
|
+
* Stores which capture a visitor opens by default.
|
|
243
|
+
*
|
|
244
|
+
* One field on the space, not a flag per capture, so the two admin screens cannot disagree:
|
|
245
|
+
* setting it from either one writes the same place, and there is nothing to clear elsewhere.
|
|
246
|
+
*/
|
|
247
|
+
async onDefaultCaptureChange() {
|
|
248
|
+
this.savingDefaultCapture = true;
|
|
249
|
+
this.defaultCaptureError = null;
|
|
250
|
+
try {
|
|
251
|
+
await this.spaceService.setDefaultCapture(this.id, this.defaultCaptureID || null);
|
|
252
|
+
this.space.defaultCaptureID = this.defaultCaptureID || null;
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
// Until the schema change is deployed, AppSync rejects the field outright. Say so
|
|
256
|
+
// rather than leaving the picker looking as though it saved.
|
|
257
|
+
const graphQl = error?.errors;
|
|
258
|
+
this.defaultCaptureError = Array.isArray(graphQl) && graphQl.length > 0
|
|
259
|
+
? graphQl.map((e) => e?.message ?? JSON.stringify(e)).join(' | ')
|
|
260
|
+
: (error?.message ?? String(error));
|
|
261
|
+
this.defaultCaptureID = this.space?.defaultCaptureID ?? null;
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
this.savingDefaultCapture = false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/** Label for a visit in the default picker, naming the viewer it opens in. */
|
|
268
|
+
visitLabel(visit) {
|
|
269
|
+
const name = visit?.name || visit?.model3d || '';
|
|
270
|
+
return visit?.viewer === CaptureViewer.THREEJS ? `${name} (3D)` : `${name} (Matterport)`;
|
|
271
|
+
}
|
|
236
272
|
// ---------- Copy POIs between visits ----------
|
|
237
273
|
//
|
|
238
274
|
/** Toggles visibility of the admin "copy POIs from another location" form. */
|
|
@@ -377,13 +413,13 @@ export class DetailLocationComponent {
|
|
|
377
413
|
}
|
|
378
414
|
}
|
|
379
415
|
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 });
|
|
380
|
-
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\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\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" }] });
|
|
416
|
+
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\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <!-- One picker for both viewers: the default lives on the space, so Matterport\n captures and 3D models compete for the same single slot. -->\n <li class=\"list-group-item bg-transparent\" *ngIf=\"visits.length > 1\">\n {{'Default visit' | translate}}:\n <select class=\"form-select d-inline-block ms-2\" style=\"width: auto;\"\n [(ngModel)]=\"defaultCaptureID\" (ngModelChange)=\"onDefaultCaptureChange()\"\n [disabled]=\"savingDefaultCapture\">\n <option [ngValue]=\"null\">{{'First available' | translate}}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.captureID\">\n {{ visitLabel(visit) }}\n </option>\n </select>\n <span class=\"form-text d-block\">\n {{'What a visitor opens when they enter this location.' | translate}}\n </span>\n <span class=\"text-danger d-block\" *ngIf=\"defaultCaptureError\">\n {{ defaultCaptureError }}\n </span>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\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" }] });
|
|
381
417
|
}
|
|
382
418
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, decorators: [{
|
|
383
419
|
type: Component,
|
|
384
|
-
args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>" }]
|
|
420
|
+
args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <!-- One picker for both viewers: the default lives on the space, so Matterport\n captures and 3D models compete for the same single slot. -->\n <li class=\"list-group-item bg-transparent\" *ngIf=\"visits.length > 1\">\n {{'Default visit' | translate}}:\n <select class=\"form-select d-inline-block ms-2\" style=\"width: auto;\"\n [(ngModel)]=\"defaultCaptureID\" (ngModelChange)=\"onDefaultCaptureChange()\"\n [disabled]=\"savingDefaultCapture\">\n <option [ngValue]=\"null\">{{'First available' | translate}}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.captureID\">\n {{ visitLabel(visit) }}\n </option>\n </select>\n <span class=\"form-text d-block\">\n {{'What a visitor opens when they enter this location.' | translate}}\n </span>\n <span class=\"text-danger d-block\" *ngIf=\"defaultCaptureError\">\n {{ defaultCaptureError }}\n </span>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>" }]
|
|
385
421
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
386
422
|
type: Inject,
|
|
387
423
|
args: [MATTERPORT_SDK_KEY]
|
|
388
424
|
}] }, { type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i1.Router }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.NavigatorService }, { type: i2.MatterportTagCopyService }] });
|
|
389
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFLckUsT0FBTyxFQUNILGtCQUFrQixFQUN5QyxXQUFXLEVBRWhFLFFBQVEsRUFHakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7O0FBRTFDLHNHQUFzRztBQUN0RyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQU9sQyxNQUFNLE9BQU8sdUJBQXVCO0lBeURnQjtJQUNwQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBL0RaLDJCQUEyQjtJQUMzQixLQUFLLENBQVE7SUFDYixRQUFRLENBQW1CO0lBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsYUFBYSxDQUFPO0lBQ3BCLEVBQUUsQ0FBUztJQUNYLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFFM0Isa0NBQWtDO0lBQ2xDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsaUJBQWlCLENBQU07SUFDdkIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixjQUFjLENBT1Y7SUFFSixTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFVO0lBQ3BCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRXpCLG1DQUFtQztJQUNuQyxPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFFckIsaUZBQWlGO0lBQ2pGLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUV6QixpRUFBaUU7SUFDakUscUJBQXFCLEdBQWtCLElBQUksQ0FBQztJQUU1QywwRkFBMEY7SUFDMUYscUJBQXFCLEdBQWtCLElBQUksQ0FBQztJQUM1QyxxQkFBcUIsR0FBa0IsSUFBSSxDQUFDO0lBRTVDLHFGQUFxRjtJQUNyRixZQUFZLEdBQVksRUFBRSxDQUFDO0lBQzNCLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFFckIsd0VBQXdFO0lBQ3hFLGVBQWUsR0FBZ0IsSUFBSSxDQUFDO0lBQ3BDLGVBQWUsR0FBZ0IsSUFBSSxDQUFDO0lBQ3BDLGVBQWUsR0FBZ0IsSUFBSSxDQUFDO0lBQ3BDLGVBQWUsR0FBZ0IsSUFBSSxDQUFDO0lBRXBDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsaUJBQWlCLEdBQWtCLElBQUksQ0FBQztJQUN4QyxZQUFZLEdBQXdCLElBQUksQ0FBQztJQUN6QyxPQUFPLEdBQW1CLEVBQUUsQ0FBQztJQUU3QixZQUNnRCxNQUFjLEVBQ2xELEtBQXFCLEVBQ3JCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxXQUE0QixFQUM1QixTQUEyQixFQUMzQixnQkFBa0MsRUFDbEMsY0FBd0M7UUFSSixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2xELFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBMEI7UUFFaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQjthQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhO2FBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRVAsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO2FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsRUFBRTtJQUNGLGtDQUFrQztJQUNsQyxFQUFFO0lBRUYsUUFBUSxLQUFLLENBQUM7SUFFZCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsRUFBRTtJQUNGLDhCQUE4QjtJQUM5QixFQUFFO0lBRUYsS0FBSyxDQUFDLEtBQUs7UUFDUCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUgsQ0FBQztRQUNELDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7WUFDNUM7Z0JBQ0ksS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDdEIsR0FBRyxFQUFFLGlCQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTthQUN4QztTQUNKLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhO1FBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtZQUMxQyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckQsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNwQyxXQUFXLENBQ0ssQ0FBQztnQkFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDN0QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDM0MsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO3dCQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ25DLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0wsQ0FBQztJQUVELEVBQUU7SUFDRixvREFBb0Q7SUFDcEQsRUFBRTtJQUVGLE1BQU07UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQy9ELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxFQUFFO0lBQ0YsZ0RBQWdEO0lBQ2hELEVBQUU7SUFFRixhQUFhO1FBQ1QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQ2pDLENBQUM7SUFDTixDQUFDO0lBRUQsY0FBYyxDQUFDLGNBQW1CO1FBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksTUFBTSxLQUFLLGNBQWMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDZCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHO2dCQUNWLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0I7Z0JBQzNELHNCQUFzQixFQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCO2dCQUN0RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQjtnQkFDdEQsTUFBTSxFQUFFLFdBQVcsQ0FBQyxhQUFhO2FBQ3BDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDaEMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixNQUFNLEVBQUUsV0FBVyxDQUFDLGFBQWE7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ2hDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxTQUFTO1NBQ2hDLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQsRUFBRTtJQUNGLGlEQUFpRDtJQUNqRCxFQUFFO0lBRUYsOEVBQThFO0lBQzlFLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBZSxFQUFFLEtBQVc7UUFDL0MsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBZSxFQUFFLEtBQVc7UUFDL0MsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLEtBQUssQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCO1lBQzFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQzlFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsc0JBQXNCO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCwwR0FBMEc7SUFDMUcsSUFBSSxXQUFXO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzVGLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25HLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sVUFBVSxJQUFJLHFCQUFxQixJQUFJLFVBQVUsSUFBSSxxQkFBcUIsQ0FBQztJQUN0RixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFFdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdEgsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUN6RixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUN2RCxJQUFJLENBQUMscUJBQXFCLEVBQzFCLHFCQUFxQixFQUNyQixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FDcEUsQ0FBQztRQUNOLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM1RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUM5RixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHO1lBQ1gsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUI7WUFDekMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUM5QyxrQkFBa0IsRUFBRSxJQUFJLENBQUMscUJBQXFCO1lBQzlDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN4QyxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDdkYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxhQUFhLElBQUksQ0FBQyxxQkFBcUIsT0FBTyxJQUFJLENBQUMscUJBQXFCLE9BQU8sQ0FBQztRQUM3RixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVixHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7d0RBRW9EO0lBQ3BELGVBQWU7UUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsS0FBSyxDQUFDLDhCQUE4QixDQUFDLEtBQVk7UUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQyx5Q0FBeUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CO2dCQUM3RSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ILE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDbEQsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRWpHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDdkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztZQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFFOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7Z0JBQVMsQ0FBQztZQUNQLDZFQUE2RTtZQUM3RSxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQzt3R0ExYVEsdUJBQXVCLGtCQXlEcEIsa0JBQWtCOzRGQXpEckIsdUJBQXVCLDJEQ3ZCcEMsZzllQStQTTs7NEZEeE9PLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUI7OzBCQTZEMUIsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBNQVRURVJQT1JUX1NES19LRVksXG4gICAgTWVudUl0ZW0sIFNwYWNlU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBOYXZpZ2F0b3JTZXJ2aWNlLCBTcGFjZVN0YXR1cywgU3BhY2UsXG4gICAgTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlLCBDb3B5UHJvZ3Jlc3MsIENvcHlMb2dFbnRyeSxcbiAgICBWZWMzLCBkaXN0YW5jZSxcbiAgICBWaXNpdCxcbiAgICBWaXNpdFNlcnZpY2Vcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG4vLyBNaW5pbXVtIGRpc3RhbmNlIChpbiBtZXRlcnMpIHJlcXVpcmVkIGJldHdlZW4gdGhlIHR3byBsYW5kbWFya3MgZm9yIGEgcmVsaWFibGUgcm90YXRpb24gY2FsY3VsYXRpb25cbmNvbnN0IE1JTl9MQU5ETUFSS19ESVNUQU5DRSA9IDEuNTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLWxvY2F0aW9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXRhaWxMb2NhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIC8vIC0tLSBMb2NhdGlvbiBkZXRhaWxzIC0tLVxuICAgIHNwYWNlOiBTcGFjZTtcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBpc0VkaXRpbmcgPSBmYWxzZTtcbiAgICBpbWFnZVRvVXBsb2FkOiBGaWxlO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICAvLyAtLS0gRFBFIChlbmVyZ3kgZGlhZ25vc3RpYykgLS0tXG4gICAgaXNWYWxpZGF0aW5nRHBlID0gZmFsc2U7XG4gICAgc2VsZWN0ZWREcGVSZXN1bHQ6IGFueTtcbiAgICBnZXR0aW5nRGF0YSA9IGZhbHNlO1xuICAgIHBhcnNlZE1ldGFkYXRhOiB7XG4gICAgICAgIGdlb19hZHJlc3NlOiBzdHJpbmc7XG4gICAgICAgIHNlY3RldXJfYWN0aXZpdGU6IHN0cmluZztcbiAgICAgICAgYW5uZWVfY29uc3RydWN0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNsYXNzZV9jb25zb21tYXRpb25fZW5lcmdpZTogc3RyaW5nO1xuICAgICAgICBjbGFzc2VfZXN0aW1hdGlvbl9nZXM6IHN0cmluZztcbiAgICAgICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgfVtdO1xuXG4gICAgZ3Vlc3RMaW5rOiBzdHJpbmc7XG4gICAgY2FuQXJjaGl2ZTogYm9vbGVhbjtcbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAvLyAtLS0gQ29weSBQT0lzIGJldHdlZW4gdmlzaXRzIC0tLVxuICAgIGlzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzcGFjZXM6IFNwYWNlW10gPSBbXTtcblxuICAgIC8vIFdoZXRoZXIgdGhlIFwiY29weSBQT0lzXCIgYWRtaW4gZm9ybSBpcyBjdXJyZW50bHkgdmlzaWJsZSAoY29sbGFwc2VkIGJ5IGRlZmF1bHQpXG4gICAgc2hvd0NvcHlQb2lzRm9ybSA9IGZhbHNlO1xuXG4gICAgLy8gU2VsZWN0ZWQgc291cmNlIFNQQUNFIChhIHNwYWNlIG1heSBjb250YWluIDAuLk4gdmlzaXRzL21vZGVscylcbiAgICBzZWxlY3RlZFNvdXJjZVNwYWNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gU2VsZWN0ZWQgM0QgbW9kZWwgaWRzICh2aXNpdC5tb2RlbDNkKSDigJQgdGhpcyBpcyB3aGF0IGFjdHVhbGx5IGdldHMgbG9hZGVkIGluIHRoZSB2aWV3ZXJcbiAgICBzZWxlY3RlZFNvdXJjZTNkTW9kZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHNlbGVjdGVkVGFyZ2V0M2RNb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBWaXNpdHMgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgc291cmNlIHNwYWNlLCBhbmQgZm9yIHRoZSBjdXJyZW50ICh0YXJnZXQpIHNwYWNlXG4gICAgc291cmNlVmlzaXRzOiBWaXNpdFtdID0gW107XG4gICAgdmlzaXRzOiBWaXNpdFtdID0gW107XG5cbiAgICAvLyAzRCBsYW5kbWFyayBwb2ludHMgcGlja2VkIGRpcmVjdGx5IGluIGVhY2ggdmlld2VyIChzb3VyY2UgYW5kIHRhcmdldClcbiAgICBsYW5kbWFya1NvdXJjZUE6IFZlYzMgfCBudWxsID0gbnVsbDtcbiAgICBsYW5kbWFya1RhcmdldEE6IFZlYzMgfCBudWxsID0gbnVsbDtcbiAgICBsYW5kbWFya1NvdXJjZUI6IFZlYzMgfCBudWxsID0gbnVsbDtcbiAgICBsYW5kbWFya1RhcmdldEI6IFZlYzMgfCBudWxsID0gbnVsbDtcblxuICAgIGlzQ29weWluZ1BvaXMgPSBmYWxzZTtcbiAgICBjb3B5UG9pc1Jlc3VsdE1zZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgY29weVByb2dyZXNzOiBDb3B5UHJvZ3Jlc3MgfCBudWxsID0gbnVsbDtcbiAgICBjb3B5TG9nOiBDb3B5TG9nRW50cnlbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoTUFUVEVSUE9SVF9TREtfS0VZKSBwdWJsaWMgcmVhZG9ubHkgc2RrS2V5OiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZpc2l0U2VydmljZTogVmlzaXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGFnQ29weVNlcnZpY2U6IE1hdHRlcnBvcnRUYWdDb3B5U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3BhY2VJRCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9sb2NhbGlzYXRpb25cIiwgc3BhY2VJRF0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBwYXJhbXMuaWQ7XG4gICAgICAgICAgICB0aGlzLnNldHVwKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuY29weVByb2dyZXNzJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcHlQcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdDb3B5U2VydmljZS5jb3B5TG9nJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5TG9nID0gbG9nO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIExpZmVjeWNsZSAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIG5nT25Jbml0KCkgeyB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIFNldHVwIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgYXN5bmMgc2V0dXAoKSB7XG4gICAgICAgIHRoaXMuc3BhY2UgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRTcGFjZSh0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLnNldEd1ZXN0TGluaygpO1xuICAgICAgICB0aGlzLnNldENhbkFyY2hpdmUoKTtcbiAgICAgICAgdGhpcy5pc0FkbWluID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKTtcbiAgICAgICAgaWYgKHRoaXMuaXNBZG1pbikge1xuICAgICAgICAgICAgY29uc3Qgc3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0TG9jYXRpb25zRm9yQ3VycmVudFVzZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VzID0gc3BhY2VzLmZpbHRlcigoc3BhY2UpID0+IHNwYWNlLmlkICE9PSB0aGlzLmlkKS5zb3J0KChhLCBiKSA9PiAoYS5uYW1lIHx8ICcnKS5sb2NhbGVDb21wYXJlKGIubmFtZSB8fCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZpc2l0cyAoM0QgbW9kZWxzKSBiZWxvbmdpbmcgdG8gdGhlIENVUlJFTlQgc3BhY2UsIHVzZWQgYXMgY29weSB0YXJnZXRzXG4gICAgICAgIHRoaXMudmlzaXRzID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0VmlzaXRzRm9yU3BhY2VGb3JVc2VyKHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHNldHVwTWVudUl0ZW1zKCkge1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5zcGFjZS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlLmlkfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRWRpdGluZykge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkVkaXRcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogXCJJbmZvcm1hdGlvblwiIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q2FuQXJjaGl2ZSgpIHtcbiAgICAgICAgdGhpcy5jYW5BcmNoaXZlID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKVxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNhbkFyY2hpdmVTcGFjZSh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICBzZXRHdWVzdExpbmsoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlLmd1ZXN0TGluaykge1xuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5ndWVzdExpbmsgPSBgJHtvcmlnaW59LyR7dGhpcy5zcGFjZS5ndWVzdExpbmt9YDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIFwiI2xpbmtIcmVmXCIsXG4gICAgICAgICAgICAgICAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmZvbGxvd0xpbmtcIik7XG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmd1ZXN0TGluaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UubG9nb3V0Q3VycmVudEFuZFNpZ25PdXRBdXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJhdXRoXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gRWRpdCAvIGFyY2hpdmUgLyBuYXZpZ2F0aW9uIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25FZGl0KCkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBvblJldHVybigpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkFyY2hpdmUoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlU3BhY2VcIik7XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2Uuc29mdERlbGV0ZVNwYWNlKHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5vblJldHVybigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Gb3JtQ2hhbmdlKGV2ZW50OiBTcGFjZSkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIERQRSAoZW5lcmd5IGRpYWdub3N0aWMpIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25EcGVWYWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnNwYWNlLm1ldGFkYXRhKTtcbiAgICAgICAgdGhpcy5wYXJzZWRNZXRhZGF0YSA9IHRoaXMucGFyc2VkTWV0YWRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgKHJlc3VsdCkgPT4gcmVzdWx0Lmdlb19hZHJlc3NlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uU2VsZWN0Q2hhbmdlKHNlbGVjdGVkUmVzdWx0OiBhbnkpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgdGhpcy5wYXJzZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gc2VsZWN0ZWRSZXN1bHQgJiYgcmVzdWx0LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdCA9IHNlbGVjdGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIG9uU2F2ZVJlc3VsdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdGlvblllYXI6IHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuYW5uZWVfY29uc3RydWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsYXNzRW5lcmd5Q29uc3VtcHRpb246XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llLFxuICAgICAgICAgICAgICAgIGNsYXNzR2VzOiB0aGlzLnNlbGVjdGVkRHBlUmVzdWx0LmNsYXNzZV9lc3RpbWF0aW9uX2dlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZExvYyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSB1cGRhdGVkTG9jO1xuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRXJhc2UoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zcGFjZS5zdGF0dXMgPSBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVEO1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2V0RHBlRGF0YSgpIHtcbiAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfRkVUQ0gsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuc3BhY2UuaWQpO1xuICAgICAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IGZhbHNlO1xuICAgICAgICB9LCAxNTAwKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gQ29weSBQT0lzIGJldHdlZW4gdmlzaXRzIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgLyoqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiB0aGUgYWRtaW4gXCJjb3B5IFBPSXMgZnJvbSBhbm90aGVyIGxvY2F0aW9uXCIgZm9ybS4gKi9cbiAgICB0b2dnbGVDb3B5UG9pc0Zvcm0oKSB7XG4gICAgICAgIHRoaXMuc2hvd0NvcHlQb2lzRm9ybSA9ICF0aGlzLnNob3dDb3B5UG9pc0Zvcm07XG4gICAgfVxuXG4gICAgb25Tb3VyY2VMYW5kbWFya1BpY2tlZChzbG90OiAnQScgfCAnQicsIHBvaW50OiBWZWMzKSB7XG4gICAgICAgIGlmIChzbG90ID09PSAnQScpIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VBID0gcG9pbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQiA9IHBvaW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25UYXJnZXRMYW5kbWFya1BpY2tlZChzbG90OiAnQScgfCAnQicsIHBvaW50OiBWZWMzKSB7XG4gICAgICAgIGlmIChzbG90ID09PSAnQScpIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRBID0gcG9pbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IHBvaW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIExvYWRzIHRoZSB2aXNpdHMgKDNEIG1vZGVscykgYXZhaWxhYmxlIGZvciB0aGUgbmV3bHkgc2VsZWN0ZWQgc291cmNlIHNwYWNlLiAqL1xuICAgIGFzeW5jIG9uU291cmNlU3BhY2VDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc291cmNlVmlzaXRzID0gdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWRcbiAgICAgICAgICAgID8gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0VmlzaXRzRm9yU3BhY2VGb3JVc2VyKHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgPSBudWxsO1xuICAgICAgICB0aGlzLm9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogUmVzZXRzIGxhbmRtYXJrIHNlbGVjdGlvbnMgd2hlbmV2ZXIgdGhlIHNvdXJjZSBvciB0YXJnZXQgM0QgbW9kZWwgY2hhbmdlcy4gKi9cbiAgICBvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRBID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIgPSBudWxsO1xuICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIFRydWUgb25jZSBib3RoIG1vZGVscyBhcmUgc2VsZWN0ZWQsIGFsbCA0IGxhbmRtYXJrcyBhcmUgcGlja2VkLCBhbmQgQS9CIHBhaXJzIGFyZSBmYXIgZW5vdWdoIGFwYXJ0LiAqL1xuICAgIGdldCBjYW5Db3B5UG9pcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCB8fCAhdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgfHwgIXRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmxhbmRtYXJrU291cmNlQSB8fCAhdGhpcy5sYW5kbWFya1RhcmdldEEgfHwgIXRoaXMubGFuZG1hcmtTb3VyY2VCIHx8ICF0aGlzLmxhbmRtYXJrVGFyZ2V0Qikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZURpc3QgPSBkaXN0YW5jZSh0aGlzLmxhbmRtYXJrU291cmNlQSwgdGhpcy5sYW5kbWFya1NvdXJjZUIpO1xuICAgICAgICBjb25zdCB0YXJnZXREaXN0ID0gZGlzdGFuY2UodGhpcy5sYW5kbWFya1RhcmdldEEsIHRoaXMubGFuZG1hcmtUYXJnZXRCKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZURpc3QgPj0gTUlOX0xBTkRNQVJLX0RJU1RBTkNFICYmIHRhcmdldERpc3QgPj0gTUlOX0xBTkRNQVJLX0RJU1RBTkNFO1xuICAgIH1cblxuICAgIGFzeW5jIG9uQ29weVBvaXMoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGFyZ2V0U3BhY2VJZCA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCB8fCAhc2VsZWN0ZWRUYXJnZXRTcGFjZUlkIHx8ICF0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCB8fCAhdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgPT09IHNlbGVjdGVkVGFyZ2V0U3BhY2VJZCkge1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yU2FtZVNwYWNlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhbkNvcHlQb2lzKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JMYW5kbWFya3NUb29DbG9zZScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0NvcHlpbmdQb2lzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy50YWdDb3B5U2VydmljZS5jb3B5VGFnc0Zyb21WaXNpdChcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhcmdldFNwYWNlSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUEsXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEsXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIsXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICBzdWNjZXNzID8gJ21hdHRlcnBvcnRDb3B5LnN1Y2Nlc3NNc2cnIDogJ21hdHRlcnBvcnRDb3B5LmVycm9yTXNnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvck1zZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDb3B5aW5nUG9pcyA9IGZhbHNlO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IG51bGw7XG4gICAgICAgIH0sIDUwMDApO1xuICAgIH1cblxuICAgIC8qKiBEb3dubG9hZHMgdGhlIGN1cnJlbnQgc291cmNlL3RhcmdldCBzZWxlY3Rpb24gKyBhbGwgNCBsYW5kbWFya3MgYXMgYSBKU09OIGZpbGUuICovXG4gICAgZXhwb3J0TGFuZG1hcmtDb25maWcoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yRXhwb3J0TWlzc2luZ1NlbGVjdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgc291cmNlU3BhY2VJZDogdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQsXG4gICAgICAgICAgICBzb3VyY2VWaXNpdDNkTW9kZWw6IHRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsLFxuICAgICAgICAgICAgdGFyZ2V0VmlzaXQzZE1vZGVsOiB0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCxcbiAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQTogdGhpcy5sYW5kbWFya1NvdXJjZUEsXG4gICAgICAgICAgICBsYW5kbWFya1RhcmdldEE6IHRoaXMubGFuZG1hcmtUYXJnZXRBLFxuICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VCOiB0aGlzLmxhbmRtYXJrU291cmNlQixcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QjogdGhpcy5sYW5kbWFya1RhcmdldEJcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gYGxhbmRtYXJrc18ke3RoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsfV90b18ke3RoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsfS5qc29uYDtcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuXG4gICAgLyoqIERvd25sb2FkcyB0aGUgZnVsbCBjb3B5IGxvZyAoc3RlcCBsaW5lcywgZXJyb3JzLCBhbmQgcmVwYWlyZWQtaXRlbSBub3RpY2VzKSBhcyBhIHRleHRcbiAgICAgKiAgZmlsZSDigJQgdGhlIG9uLXNjcmVlbiBwYW5lbCBpcyBjYXBwZWQgdG8gYSBzbWFsbCBzY3JvbGxhYmxlIGFyZWEgYW5kIGxvc2VzIGxpbmVzIG9uY2VcbiAgICAgKiAgYSBuZXcgcnVuIHN0YXJ0cywgdGhpcyBrZWVwcyB0aGUgZnVsbCByZXBvcnQuICovXG4gICAgZG93bmxvYWRDb3B5TG9nKCkge1xuICAgICAgICB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmRvd25sb2FkTG9nKCk7XG4gICAgfVxuXG4gICAgLyoqIFRyaWdnZXJlZCBieSB0aGUgaGlkZGVuIGZpbGUgaW5wdXQ7IHJlYWRzIGFuZCBhcHBsaWVzIGEgcHJldmlvdXNseSBleHBvcnRlZCBKU09OIGNvbmZpZy4gKi9cbiAgICBhc3luYyBvbkltcG9ydExhbmRtYXJrQ29uZmlnU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdO1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHRleHQpO1xuXG4gICAgICAgICAgICAvLyBCYXNpYyBzaGFwZSB2YWxpZGF0aW9uIGJlZm9yZSBhcHBseWluZ1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydzb3VyY2VTcGFjZUlkJywgJ3NvdXJjZVZpc2l0M2RNb2RlbCcsICd0YXJnZXRWaXNpdDNkTW9kZWwnLFxuICAgICAgICAgICAgICAgICdsYW5kbWFya1NvdXJjZUEnLCAnbGFuZG1hcmtUYXJnZXRBJywgJ2xhbmRtYXJrU291cmNlQicsICdsYW5kbWFya1RhcmdldEInXTtcbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZEtleXMuZmlsdGVyKGsgPT4gIShrIGluIGNvbmZpZykpO1xuICAgICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckludmFsaWRDb25maWcnLCB7IGtleXM6IG1pc3Npbmcuam9pbignLCAnKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkID0gY29uZmlnLnNvdXJjZVNwYWNlSWQ7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHNvdXJjZSBzcGFjZSdzIHZpc2l0IGxpc3Qgc28gdGhlIHNlbGVjdCBoYXMgdGhlIHJpZ2h0IG9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc291cmNlVmlzaXRzID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0VmlzaXRzRm9yU3BhY2VGb3JVc2VyKHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgPSBjb25maWcuc291cmNlVmlzaXQzZE1vZGVsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwgPSBjb25maWcudGFyZ2V0VmlzaXQzZE1vZGVsO1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUEgPSBjb25maWcubGFuZG1hcmtTb3VyY2VBO1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBjb25maWcubGFuZG1hcmtUYXJnZXRBO1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIgPSBjb25maWcubGFuZG1hcmtTb3VyY2VCO1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEIgPSBjb25maWcubGFuZG1hcmtUYXJnZXRCO1xuXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuc3VjY2Vzc0ltcG9ydCcpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbXBvcnQgbGFuZG1hcmsgY29uZmlnJywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckltcG9ydFJlYWQnKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBpbnB1dCBzbyByZS1zZWxlY3RpbmcgdGhlIHNhbWUgZmlsZSByZS10cmlnZ2VycyB0aGUgY2hhbmdlIGV2ZW50XG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxufSIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XG4gICAgICAgIDxsaWItdGFiLW5hdmlnYXRpb24gW21lbnVJdGVtc109J21lbnVJdGVtcycgKG9uR29CYWNrKT1cInJlc2V0KClcIj48L2xpYi10YWItbmF2aWdhdGlvbj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25SZXR1cm4oKVwiPnt7J0JhY2sgdG8gbG9jYXRpb25zJyB8XG4gICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiIWlzRWRpdGluZyAmJiBzcGFjZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX06IHt7c3BhY2UubmFtZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5hZGRyZXNzZXN9fSA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NvbnN0cnVjdGlvbiB5ZWFyJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNvbnN0cnVjdGlvblllYXIgP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jb25zdHJ1Y3Rpb25ZZWFyIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xhdGl0dWRlJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmxhdGl0dWRlID9cbiAgICAgICAgICAgICAgICAgICAgc3BhY2UubGF0aXR1ZGUgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19PC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMb25naXR1ZGUnIHwgdHJhbnNsYXRlfX06IHt7c3BhY2UubG9uZ2l0dWRlID9cbiAgICAgICAgICAgICAgICAgICAgc3BhY2UubG9uZ2l0dWRlIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sZXZlbCB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fSA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0VuZXJneSBDbGFzcycgfCB0cmFuc2xhdGV9fTpcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uID9cbiAgICAgICAgICAgICAgICAgICAgc3BhY2UuY2xhc3NFbmVyZ3lDb25zdW1wdGlvbiA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNwYWNlLnN0YXR1cyAhPT0gJ0RQRV9UT19WQUxJREFURSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbm8tbG93ZXJjYXNlIG1zLTVcIiAoY2xpY2spPVwib25HZXREcGVEYXRhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0dldCBkYXRhIGZyb20gQVBJIERQRScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJnLXRyYW5zcGFyZW50IG1zLTVcIiAqbmdJZj1cInNwYWNlLnN0YXR1cyA9PT0gJ0RQRV9UT19WQUxJREFURSdcIiAoY2xpY2spPVwib25EcGVWYWxpZGF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmFsZXJ0LWNpcmNsZS1jaGVja1wiIHN0eWxlPVwiY29sb3I6ICNmMTljODA7XCIgZGF0YS13aWR0aD1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWhlaWdodD1cIjI1XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snRFBFIGRhdGEgZm91bmQuIENsaWNrIHRvIHZhbGlkYXRlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzR2VzID8gc3BhY2UuY2xhc3NHZXMgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU2hhcmVhYmxlIEd1ZXN0IExpbmsnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCIgKm5nSWY9XCJndWVzdExpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPVwibGlua0hyZWZcIiB0YXJnZXQ9XCJfYmxhbmtcIj57eydUcnkgdGhlIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImd1ZXN0TGlua1wiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDsgZGlzcGxheTogaW5saW5lO1wiIG5nYlRvb2x0aXA9XCJDb3BpZWQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6Y29udGVudC1jb3B5XCIgZGF0YS1pbmxpbmU9XCJmYWxzZVwiIGRhdGEtd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lO1wiPnt7J05vIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFndWVzdExpbmtcIj48c21hbGw+KHt7J0dlbmVyYXRlIGxpbmsgZnJvbSBhIFZJU0lUT1IgbWlzc2lvbid8dHJhbnNsYXRlfX0pPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImdldHRpbmdEYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImxvY2F0aW9uLWVkaXQtYnRuXCI+e3snRWRpdCcgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3shY2FuQXJjaGl2ZSA/ICgnQ29udGFjdCBTbWFydGVyUGxhbicgfCB0cmFuc2xhdGUpIDogKCdBcmNoaXZlIGxvY2F0aW9uIGFuZCByZWxhdGVkIGRhdGEnIHwgdHJhbnNsYXRlKX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BcmNoaXZlKClcIiBbZGlzYWJsZWRdPVwiIWNhbkFyY2hpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FyY2hpdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiICpuZ0lmPVwiaXNWYWxpZGF0aW5nRHBlXCI+XG4gICAgICAgICAgICA8aDY+e3snTW9zdCByZWxldmFudCByZXN1bHRzIGZvcicgfCB0cmFuc2xhdGV9fSA6XG4gICAgICAgICAgICAgICAgPGI+ZGlhZ25vc3RpY3MgZGUgcGVyZm9ybWFuY2Ugw6luZXJnw6l0aXF1ZSAoRFBFKSBkZXMgYsOidGltZW50cyB0ZXJ0aWFpcmVzPC9iPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPiM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQXBwbHkgdG8gbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBY3Rpdml0eSBzZWN0b3InIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRW5lcmd5IENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByZXN1bHQgb2YgcGFyc2VkTWV0YWRhdGE7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPnt7IGkgKyAxIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseVwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicmVzdWx0LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZShyZXN1bHQpXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5nZW9fYWRyZXNzZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5zZWN0ZXVyX2FjdGl2aXRlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfZXN0aW1hdGlvbl9nZXMgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uU2F2ZVJlc3VsdCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRHBlUmVzdWx0XCI+e3snU2F2ZSBzZWxlY3RlZCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FcmFzZSgpXCI+XG4gICAgICAgICAgICAgICAge3snTm8gbWF0Y2ggKGVyYXNlIGRhdGEpJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxuICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVG9nZ2xlIGJ1dHRvbiBmb3IgdGhlIGFkbWluIFwiQ29weSBQT0lzXCIgZm9ybSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNBZG1pbiAmJiBzcGFjZXMgJiYgc3BhY2VzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cInRvZ2dsZUNvcHlQb2lzRm9ybSgpXCI+XG4gICAgICAgICAgICB7eyAoc2hvd0NvcHlQb2lzRm9ybSA/ICdtYXR0ZXJwb3J0Q29weS5oaWRlRm9ybScgOiAnbWF0dGVycG9ydENvcHkuc2hvd0Zvcm0nKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWRtaW4gRm9ybSB0byBDb3B5IFBPSXMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzQWRtaW4gJiYgc3BhY2VzICYmIHNwYWNlcy5sZW5ndGggPiAwICYmIHNob3dDb3B5UG9pc0Zvcm1cIiBjbGFzcz1cIm10LTMgcC00IGJvcmRlciByb3VuZGVkIGJnLWxpZ2h0XCI+XG4gICAgICAgIDxoNj57eyAnbWF0dGVycG9ydENvcHkuZm9ybVRpdGxlJyB8IHRyYW5zbGF0ZSB9fTwvaDY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnbWF0dGVycG9ydENvcHkuc291cmNlU3BhY2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTb3VyY2VTcGFjZUlkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Tb3VyY2VTcGFjZUNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNlbGVjdFNwYWNlJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIHNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+e3tzcGFjZS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiICpuZ0lmPVwic291cmNlVmlzaXRzXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU291cmNlM2RNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zZWxlY3RWaXNpdCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzb3VyY2VWaXNpdHNcIiBbbmdWYWx1ZV09XCJ2aXNpdC5tb2RlbDNkXCI+e3t2aXNpdC5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS50YXJnZXRWaXNpdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnbWF0dGVycG9ydENvcHkuc2VsZWN0VmlzaXQnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQubW9kZWwzZFwiPnt7dmlzaXQubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkU291cmNlU3BhY2VJZCAmJiBzZWxlY3RlZFNvdXJjZTNkTW9kZWwgJiYgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHJvdW5kZWQgcC0zIG1iLTMgYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZCBtYi0yXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZ3LWJvbGQgc21hbGwgbWItMlwiPnt7ICdtYXR0ZXJwb3J0Q29weS5sYW5kbWFya0EnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrU291cmNlQVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblNvdXJjZUxhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrVGFyZ2V0QVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnRhcmdldFZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblRhcmdldExhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHNtYWxsIG1iLTJcIj57eyAnbWF0dGVycG9ydENvcHkubGFuZG1hcmtCJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFNvdXJjZTNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtTb3VyY2VCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uU291cmNlTGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtUYXJnZXRCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwdC0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCIgW2Rpc2FibGVkXT1cIiFjYW5Db3B5UG9pcyB8fCBpc0NvcHlpbmdQb2lzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db3B5UG9pcygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmNvcHlCdXR0b24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImV4cG9ydExhbmRtYXJrQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmV4cG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmltcG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltcG9ydExhbmRtYXJrQ29uZmlnU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvcHlpbmdQb2lzXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSB0ZXh0LXByaW1hcnlcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UG9pc1Jlc3VsdE1zZ1wiIGNsYXNzPVwibXQtMiB0ZXh0LXN1Y2Nlc3MgZnctYm9sZFwiPlxuICAgICAgICAgICAge3sgY29weVBvaXNSZXN1bHRNc2cgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UHJvZ3Jlc3NcIiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gc21hbGwgbWItMVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb3B5UHJvZ3Jlc3MucGhhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY29sbGVjdGluZydcIj57eyAnQ29sbGVjdGluZyBpbmZvcm1hdGlvbiBmcm9tIGJvdGggdmlzaXRzLi4uJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0aWNrZXRzJ1wiPnt7ICdDb3B5aW5nIHRpY2tldHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidlcXVpcG1lbnRzJ1wiPnt7ICdDb3B5aW5nIGVxdWlwbWVudHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidwb2lzJ1wiPnt7ICdDb3B5aW5nIHN0YW5kYWxvbmUgUE9JcycgfCB0cmFuc2xhdGUgfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ29iamVjdHMzZCdcIj57eyAnQ29weWluZyAzRCBvYmplY3RzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZmVhdHVyZXMnXCI+e3sgJ0NvcHlpbmcgZmVhdHVyZXMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtZWFzdXJlbWVudHMnXCI+e3sgJ0NvcHlpbmcgbWVhc3VyZW1lbnRzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZG9uZSdcIj57eyAnRG9uZSEnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29weVByb2dyZXNzLnBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBzdHlsZT1cImhlaWdodDogNnB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbY2xhc3MucHJvZ3Jlc3MtYmFyLXN0cmlwZWRdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucHJvZ3Jlc3MtYmFyLWFuaW1hdGVkXT1cImNvcHlQcm9ncmVzcy5waGFzZSA9PT0gJ2NvbGxlY3RpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLXdhcm5pbmddPVwiY29weVByb2dyZXNzLmVycm9yQ291bnQgPiAwXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZycgPyAxMDAgOiBjb3B5UHJvZ3Jlc3MucGVyY2VudFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5TG9nLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTIgcC0yIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkIHNtYWxsXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGNvcHlMb2dcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwiZW50cnkudHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXdhcm5pbmddPVwiZW50cnkudHlwZSA9PT0gJ2hlYWxlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG10LTJcIiAqbmdJZj1cImNvcHlMb2cubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ29weUxvZygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmRvd25sb2FkTG9nJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGxpYi1mb3JtLWxvY2F0aW9uICpuZ0lmPVwiaXNFZGl0aW5nXCIgW2xvY2F0aW9uXT1cInNwYWNlXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cbjwvZGl2PiJdfQ==
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFLckUsT0FBTyxFQUNILGtCQUFrQixFQUN5QyxXQUFXLEVBRWhFLFFBQVEsRUFHZCxhQUFhLEVBQ2hCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztBQUUxQyxzR0FBc0c7QUFDdEcsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFPbEMsTUFBTSxPQUFPLHVCQUF1QjtJQWdFZ0I7SUFDcEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXRFWiwyQkFBMkI7SUFDM0IsS0FBSyxDQUFRO0lBQ2IsUUFBUSxDQUFtQjtJQUMzQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLGFBQWEsQ0FBTztJQUNwQixFQUFFLENBQVM7SUFDWCxTQUFTLEdBQWUsRUFBRSxDQUFDO0lBRTNCLGtDQUFrQztJQUNsQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGlCQUFpQixDQUFNO0lBQ3ZCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsY0FBYyxDQU9WO0lBRUosU0FBUyxDQUFTO0lBQ2xCLFVB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Z0VwQixrQkFBa0I7NEZBaEVyQix1QkFBdUIsMkRDeEJwQyxnc2hCQWtSTTs7NEZEMVBPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUI7OzBCQW9FMUIsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBNQVRURVJQT1JUX1NES19LRVksXG4gICAgTWVudUl0ZW0sIFNwYWNlU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBOYXZpZ2F0b3JTZXJ2aWNlLCBTcGFjZVN0YXR1cywgU3BhY2UsXG4gICAgTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlLCBDb3B5UHJvZ3Jlc3MsIENvcHlMb2dFbnRyeSxcbiAgICBWZWMzLCBkaXN0YW5jZSxcbiAgICBWaXNpdCxcbiAgICBWaXNpdFNlcnZpY2UsXG4gICAgQ2FwdHVyZVZpZXdlclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbi8vIE1pbmltdW0gZGlzdGFuY2UgKGluIG1ldGVycykgcmVxdWlyZWQgYmV0d2VlbiB0aGUgdHdvIGxhbmRtYXJrcyBmb3IgYSByZWxpYWJsZSByb3RhdGlvbiBjYWxjdWxhdGlvblxuY29uc3QgTUlOX0xBTkRNQVJLX0RJU1RBTkNFID0gMS41O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtbG9jYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERldGFpbExvY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLy8gLS0tIExvY2F0aW9uIGRldGFpbHMgLS0tXG4gICAgc3BhY2U6IFNwYWNlO1xuICAgIGVkaXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICAgIGlzRWRpdGluZyA9IGZhbHNlO1xuICAgIGltYWdlVG9VcGxvYWQ6IEZpbGU7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICAgIC8vIC0tLSBEUEUgKGVuZXJneSBkaWFnbm9zdGljKSAtLS1cbiAgICBpc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcbiAgICBzZWxlY3RlZERwZVJlc3VsdDogYW55O1xuICAgIGdldHRpbmdEYXRhID0gZmFsc2U7XG4gICAgcGFyc2VkTWV0YWRhdGE6IHtcbiAgICAgICAgZ2VvX2FkcmVzc2U6IHN0cmluZztcbiAgICAgICAgc2VjdGV1cl9hY3Rpdml0ZTogc3RyaW5nO1xuICAgICAgICBhbm5lZV9jb25zdHJ1Y3Rpb246IHN0cmluZztcbiAgICAgICAgY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llOiBzdHJpbmc7XG4gICAgICAgIGNsYXNzZV9lc3RpbWF0aW9uX2dlczogc3RyaW5nO1xuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICB9W107XG5cbiAgICBndWVzdExpbms6IHN0cmluZztcbiAgICBjYW5BcmNoaXZlOiBib29sZWFuO1xuICAgIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8vIC0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tXG4gICAgaXNBZG1pbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNwYWNlczogU3BhY2VbXSA9IFtdO1xuXG4gICAgLy8gV2hldGhlciB0aGUgXCJjb3B5IFBPSXNcIiBhZG1pbiBmb3JtIGlzIGN1cnJlbnRseSB2aXNpYmxlIChjb2xsYXBzZWQgYnkgZGVmYXVsdClcbiAgICBzaG93Q29weVBvaXNGb3JtID0gZmFsc2U7XG5cbiAgICAvLyBTZWxlY3RlZCBzb3VyY2UgU1BBQ0UgKGEgc3BhY2UgbWF5IGNvbnRhaW4gMC4uTiB2aXNpdHMvbW9kZWxzKVxuICAgIHNlbGVjdGVkU291cmNlU3BhY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBTZWxlY3RlZCAzRCBtb2RlbCBpZHMgKHZpc2l0Lm1vZGVsM2QpIOKAlCB0aGlzIGlzIHdoYXQgYWN0dWFsbHkgZ2V0cyBsb2FkZWQgaW4gdGhlIHZpZXdlclxuICAgIHNlbGVjdGVkU291cmNlM2RNb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFZpc2l0cyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UsIGFuZCBmb3IgdGhlIGN1cnJlbnQgKHRhcmdldCkgc3BhY2VcbiAgICBzb3VyY2VWaXNpdHM6IFZpc2l0W10gPSBbXTtcbiAgICB2aXNpdHM6IFZpc2l0W10gPSBbXTtcblxuICAgIC8qKiBUaGUgY2FwdHVyZSBhIHZpc2l0b3Igb3BlbnMgYnkgZGVmYXVsdCwgb2YgYW55IHZpZXdlciB0eXBlLiBOdWxsIG1lYW5zIG5vbmUgY2hvc2VuLiAqL1xuICAgIGRlZmF1bHRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgc2F2aW5nRGVmYXVsdENhcHR1cmUgPSBmYWxzZTtcblxuICAgIGRlZmF1bHRDYXB0dXJlRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gM0QgbGFuZG1hcmsgcG9pbnRzIHBpY2tlZCBkaXJlY3RseSBpbiBlYWNoIHZpZXdlciAoc291cmNlIGFuZCB0YXJnZXQpXG4gICAgbGFuZG1hcmtTb3VyY2VBOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtUYXJnZXRBOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtUYXJnZXRCOiBWZWMzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpc0NvcHlpbmdQb2lzID0gZmFsc2U7XG4gICAgY29weVBvaXNSZXN1bHRNc2c6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGNvcHlQcm9ncmVzczogQ29weVByb2dyZXNzIHwgbnVsbCA9IG51bGw7XG4gICAgY29weUxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHVibGljIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRhZ0NvcHlTZXJ2aWNlOiBNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmxvY2F0aW9uSURDaGFuZ2VcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHNwYWNlSUQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsIHNwYWNlSURdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyYW1zLmlkO1xuICAgICAgICAgICAgdGhpcy5zZXR1cCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlQcm9ncmVzcyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuY29weUxvZyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxvZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29weUxvZyA9IGxvZztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLSBMaWZlY3ljbGUgLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICBuZ09uSW5pdCgpIHsgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLSBTZXR1cCAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIGFzeW5jIHNldHVwKCkge1xuICAgICAgICB0aGlzLnNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5pZCk7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICAgICAgdGhpcy5zZXRHdWVzdExpbmsoKTtcbiAgICAgICAgdGhpcy5zZXRDYW5BcmNoaXZlKCk7XG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XG4gICAgICAgIGlmICh0aGlzLmlzQWRtaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldExvY2F0aW9uc0ZvckN1cnJlbnRVc2VyKCk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlcyA9IHNwYWNlcy5maWx0ZXIoKHNwYWNlKSA9PiBzcGFjZS5pZCAhPT0gdGhpcy5pZCkuc29ydCgoYSwgYikgPT4gKGEubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLm5hbWUgfHwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWaXNpdHMgKDNEIG1vZGVscykgYmVsb25naW5nIHRvIHRoZSBDVVJSRU5UIHNwYWNlLCB1c2VkIGFzIGNvcHkgdGFyZ2V0c1xuICAgICAgICB0aGlzLnZpc2l0cyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldFZpc2l0c0ZvclNwYWNlRm9yVXNlcih0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUlEID0gdGhpcy5zcGFjZT8uZGVmYXVsdENhcHR1cmVJRCA/PyBudWxsO1xuICAgIH1cblxuICAgIHNldHVwTWVudUl0ZW1zKCkge1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5zcGFjZS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlLmlkfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRWRpdGluZykge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkVkaXRcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogXCJJbmZvcm1hdGlvblwiIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q2FuQXJjaGl2ZSgpIHtcbiAgICAgICAgdGhpcy5jYW5BcmNoaXZlID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKVxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNhbkFyY2hpdmVTcGFjZSh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICBzZXRHdWVzdExpbmsoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlLmd1ZXN0TGluaykge1xuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5ndWVzdExpbmsgPSBgJHtvcmlnaW59LyR7dGhpcy5zcGFjZS5ndWVzdExpbmt9YDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIFwiI2xpbmtIcmVmXCIsXG4gICAgICAgICAgICAgICAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmZvbGxvd0xpbmtcIik7XG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmd1ZXN0TGluaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UubG9nb3V0Q3VycmVudEFuZFNpZ25PdXRBdXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJhdXRoXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gRWRpdCAvIGFyY2hpdmUgLyBuYXZpZ2F0aW9uIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25FZGl0KCkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBvblJldHVybigpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkFyY2hpdmUoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlU3BhY2VcIik7XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2Uuc29mdERlbGV0ZVNwYWNlKHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5vblJldHVybigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Gb3JtQ2hhbmdlKGV2ZW50OiBTcGFjZSkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIERQRSAoZW5lcmd5IGRpYWdub3N0aWMpIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25EcGVWYWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnNwYWNlLm1ldGFkYXRhKTtcbiAgICAgICAgdGhpcy5wYXJzZWRNZXRhZGF0YSA9IHRoaXMucGFyc2VkTWV0YWRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgKHJlc3VsdCkgPT4gcmVzdWx0Lmdlb19hZHJlc3NlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uU2VsZWN0Q2hhbmdlKHNlbGVjdGVkUmVzdWx0OiBhbnkpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgdGhpcy5wYXJzZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gc2VsZWN0ZWRSZXN1bHQgJiYgcmVzdWx0LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdCA9IHNlbGVjdGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIG9uU2F2ZVJlc3VsdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdGlvblllYXI6IHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuYW5uZWVfY29uc3RydWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsYXNzRW5lcmd5Q29uc3VtcHRpb246XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llLFxuICAgICAgICAgICAgICAgIGNsYXNzR2VzOiB0aGlzLnNlbGVjdGVkRHBlUmVzdWx0LmNsYXNzZV9lc3RpbWF0aW9uX2dlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZExvYyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSB1cGRhdGVkTG9jO1xuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRXJhc2UoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zcGFjZS5zdGF0dXMgPSBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVEO1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2V0RHBlRGF0YSgpIHtcbiAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfRkVUQ0gsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuc3BhY2UuaWQpO1xuICAgICAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IGZhbHNlO1xuICAgICAgICB9LCAxNTAwKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB3aGljaCBjYXB0dXJlIGEgdmlzaXRvciBvcGVucyBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogT25lIGZpZWxkIG9uIHRoZSBzcGFjZSwgbm90IGEgZmxhZyBwZXIgY2FwdHVyZSwgc28gdGhlIHR3byBhZG1pbiBzY3JlZW5zIGNhbm5vdCBkaXNhZ3JlZTpcbiAgICAgKiBzZXR0aW5nIGl0IGZyb20gZWl0aGVyIG9uZSB3cml0ZXMgdGhlIHNhbWUgcGxhY2UsIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFyIGVsc2V3aGVyZS5cbiAgICAgKi9cbiAgICBhc3luYyBvbkRlZmF1bHRDYXB0dXJlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnNhdmluZ0RlZmF1bHRDYXB0dXJlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUVycm9yID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnNldERlZmF1bHRDYXB0dXJlKHRoaXMuaWQsIHRoaXMuZGVmYXVsdENhcHR1cmVJRCB8fCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UuZGVmYXVsdENhcHR1cmVJRCA9IHRoaXMuZGVmYXVsdENhcHR1cmVJRCB8fCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVW50aWwgdGhlIHNjaGVtYSBjaGFuZ2UgaXMgZGVwbG95ZWQsIEFwcFN5bmMgcmVqZWN0cyB0aGUgZmllbGQgb3V0cmlnaHQuIFNheSBzb1xuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgcGlja2VyIGxvb2tpbmcgYXMgdGhvdWdoIGl0IHNhdmVkLlxuICAgICAgICAgICAgY29uc3QgZ3JhcGhRbCA9IChlcnJvciBhcyBhbnkpPy5lcnJvcnM7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRDYXB0dXJlRXJyb3IgPSBBcnJheS5pc0FycmF5KGdyYXBoUWwpICYmIGdyYXBoUWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gZ3JhcGhRbC5tYXAoKGU6IGFueSkgPT4gZT8ubWVzc2FnZSA/PyBKU09OLnN0cmluZ2lmeShlKSkuam9pbignIHwgJylcbiAgICAgICAgICAgICAgICA6ICgoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlID8/IFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUlEID0gdGhpcy5zcGFjZT8uZGVmYXVsdENhcHR1cmVJRCA/PyBudWxsO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zYXZpbmdEZWZhdWx0Q2FwdHVyZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIExhYmVsIGZvciBhIHZpc2l0IGluIHRoZSBkZWZhdWx0IHBpY2tlciwgbmFtaW5nIHRoZSB2aWV3ZXIgaXQgb3BlbnMgaW4uICovXG4gICAgdmlzaXRMYWJlbCh2aXNpdDogVmlzaXQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBuYW1lID0gdmlzaXQ/Lm5hbWUgfHwgdmlzaXQ/Lm1vZGVsM2QgfHwgJyc7XG4gICAgICAgIHJldHVybiB2aXNpdD8udmlld2VyID09PSBDYXB0dXJlVmlld2VyLlRIUkVFSlMgPyBgJHtuYW1lfSAoM0QpYCA6IGAke25hbWV9IChNYXR0ZXJwb3J0KWA7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICAvKiogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIHRoZSBhZG1pbiBcImNvcHkgUE9JcyBmcm9tIGFub3RoZXIgbG9jYXRpb25cIiBmb3JtLiAqL1xuICAgIHRvZ2dsZUNvcHlQb2lzRm9ybSgpIHtcbiAgICAgICAgdGhpcy5zaG93Q29weVBvaXNGb3JtID0gIXRoaXMuc2hvd0NvcHlQb2lzRm9ybTtcbiAgICB9XG5cbiAgICBvblNvdXJjZUxhbmRtYXJrUGlja2VkKHNsb3Q6ICdBJyB8ICdCJywgcG9pbnQ6IFZlYzMpIHtcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUEgPSBwb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblRhcmdldExhbmRtYXJrUGlja2VkKHNsb3Q6ICdBJyB8ICdCJywgcG9pbnQ6IFZlYzMpIHtcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBwb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRCID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTG9hZHMgdGhlIHZpc2l0cyAoM0QgbW9kZWxzKSBhdmFpbGFibGUgZm9yIHRoZSBuZXdseSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UuICovXG4gICAgYXN5bmMgb25Tb3VyY2VTcGFjZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VWaXNpdHMgPSB0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZFxuICAgICAgICAgICAgPyBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgbGFuZG1hcmsgc2VsZWN0aW9ucyB3aGVuZXZlciB0aGUgc291cmNlIG9yIHRhcmdldCAzRCBtb2RlbCBjaGFuZ2VzLiAqL1xuICAgIG9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VBID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBudWxsO1xuICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRCID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogVHJ1ZSBvbmNlIGJvdGggbW9kZWxzIGFyZSBzZWxlY3RlZCwgYWxsIDQgbGFuZG1hcmtzIGFyZSBwaWNrZWQsIGFuZCBBL0IgcGFpcnMgYXJlIGZhciBlbm91Z2ggYXBhcnQuICovXG4gICAgZ2V0IGNhbkNvcHlQb2lzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICF0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCB8fCAhdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubGFuZG1hcmtTb3VyY2VBIHx8ICF0aGlzLmxhbmRtYXJrVGFyZ2V0QSB8fCAhdGhpcy5sYW5kbWFya1NvdXJjZUIgfHwgIXRoaXMubGFuZG1hcmtUYXJnZXRCKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlRGlzdCA9IGRpc3RhbmNlKHRoaXMubGFuZG1hcmtTb3VyY2VBLCB0aGlzLmxhbmRtYXJrU291cmNlQik7XG4gICAgICAgIGNvbnN0IHRhcmdldERpc3QgPSBkaXN0YW5jZSh0aGlzLmxhbmRtYXJrVGFyZ2V0QSwgdGhpcy5sYW5kbWFya1RhcmdldEIpO1xuICAgICAgICByZXR1cm4gc291cmNlRGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0UgJiYgdGFyZ2V0RGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0U7XG4gICAgfVxuXG4gICAgYXN5bmMgb25Db3B5UG9pcygpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYXJnZXRTcGFjZUlkID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICFzZWxlY3RlZFRhcmdldFNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCA9PT0gc2VsZWN0ZWRUYXJnZXRTcGFjZUlkKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JTYW1lU3BhY2UnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2FuQ29weVBvaXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckxhbmRtYXJrc1Rvb0Nsb3NlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzQ29weWluZ1BvaXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlUYWdzRnJvbVZpc2l0KFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFyZ2V0U3BhY2VJZCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQixcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAnbWF0dGVycG9ydENvcHkuc3VjY2Vzc01zZycgOiAnbWF0dGVycG9ydENvcHkuZXJyb3JNc2cnXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yTXNnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NvcHlpbmdQb2lzID0gZmFsc2U7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gbnVsbDtcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgfVxuXG4gICAgLyoqIERvd25sb2FkcyB0aGUgY3VycmVudCBzb3VyY2UvdGFyZ2V0IHNlbGVjdGlvbiArIGFsbCA0IGxhbmRtYXJrcyBhcyBhIEpTT04gZmlsZS4gKi9cbiAgICBleHBvcnRMYW5kbWFya0NvbmZpZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCB8fCAhdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgfHwgIXRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JFeHBvcnRNaXNzaW5nU2VsZWN0aW9uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBzb3VyY2VTcGFjZUlkOiB0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCxcbiAgICAgICAgICAgIHNvdXJjZVZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwsXG4gICAgICAgICAgICB0YXJnZXRWaXNpdDNkTW9kZWw6IHRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsLFxuICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VBOiB0aGlzLmxhbmRtYXJrU291cmNlQSxcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QTogdGhpcy5sYW5kbWFya1RhcmdldEEsXG4gICAgICAgICAgICBsYW5kbWFya1NvdXJjZUI6IHRoaXMubGFuZG1hcmtTb3VyY2VCLFxuICAgICAgICAgICAgbGFuZG1hcmtUYXJnZXRCOiB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGEuZG93bmxvYWQgPSBgbGFuZG1hcmtzXyR7dGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWx9X3RvXyR7dGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWx9Lmpzb25gO1xuICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG5cbiAgICAvKiogRG93bmxvYWRzIHRoZSBmdWxsIGNvcHkgbG9nIChzdGVwIGxpbmVzLCBlcnJvcnMsIGFuZCByZXBhaXJlZC1pdGVtIG5vdGljZXMpIGFzIGEgdGV4dFxuICAgICAqICBmaWxlIOKAlCB0aGUgb24tc2NyZWVuIHBhbmVsIGlzIGNhcHBlZCB0byBhIHNtYWxsIHNjcm9sbGFibGUgYXJlYSBhbmQgbG9zZXMgbGluZXMgb25jZVxuICAgICAqICBhIG5ldyBydW4gc3RhcnRzLCB0aGlzIGtlZXBzIHRoZSBmdWxsIHJlcG9ydC4gKi9cbiAgICBkb3dubG9hZENvcHlMb2coKSB7XG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuZG93bmxvYWRMb2coKTtcbiAgICB9XG5cbiAgICAvKiogVHJpZ2dlcmVkIGJ5IHRoZSBoaWRkZW4gZmlsZSBpbnB1dDsgcmVhZHMgYW5kIGFwcGxpZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIEpTT04gY29uZmlnLiAqL1xuICAgIGFzeW5jIG9uSW1wb3J0TGFuZG1hcmtDb25maWdTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEJhc2ljIHNoYXBlIHZhbGlkYXRpb24gYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ3NvdXJjZVNwYWNlSWQnLCAnc291cmNlVmlzaXQzZE1vZGVsJywgJ3RhcmdldFZpc2l0M2RNb2RlbCcsXG4gICAgICAgICAgICAgICAgJ2xhbmRtYXJrU291cmNlQScsICdsYW5kbWFya1RhcmdldEEnLCAnbGFuZG1hcmtTb3VyY2VCJywgJ2xhbmRtYXJrVGFyZ2V0QiddO1xuICAgICAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoayA9PiAhKGsgaW4gY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9ySW52YWxpZENvbmZpZycsIHsga2V5czogbWlzc2luZy5qb2luKCcsICcpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgPSBjb25maWcuc291cmNlU3BhY2VJZDtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgc291cmNlIHNwYWNlJ3MgdmlzaXQgbGlzdCBzbyB0aGUgc2VsZWN0IGhhcyB0aGUgcmlnaHQgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VWaXNpdHMgPSBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCA9IGNvbmZpZy5zb3VyY2VWaXNpdDNkTW9kZWw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCA9IGNvbmZpZy50YXJnZXRWaXNpdDNkTW9kZWw7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IGNvbmZpZy5sYW5kbWFya1NvdXJjZUE7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QSA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEE7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQiA9IGNvbmZpZy5sYW5kbWFya1NvdXJjZUI7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEI7XG5cbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5zdWNjZXNzSW1wb3J0Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGltcG9ydCBsYW5kbWFyayBjb25maWcnLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9ySW1wb3J0UmVhZCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGlucHV0IHNvIHJlLXNlbGVjdGluZyB0aGUgc2FtZSBmaWxlIHJlLXRyaWdnZXJzIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG59IiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwicmVzZXQoKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIChjbGljayk9XCJvblJldHVybigpXCI+e3snQmFjayB0byBsb2NhdGlvbnMnIHxcbiAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCIhaXNFZGl0aW5nICYmIHNwYWNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTmFtZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5uYW1lfX0gPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmFkZHJlc3Nlc319IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UuY29uc3RydWN0aW9uWWVhciA/XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmNvbnN0cnVjdGlvblllYXIgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTGF0aXR1ZGUnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UubGF0aXR1ZGUgP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5sYXRpdHVkZSA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX08L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvbmdpdHVkZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sb25naXR1ZGUgP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5sb25naXR1ZGUgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmxldmVsIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snRW5lcmd5IENsYXNzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzRW5lcmd5Q29uc3VtcHRpb24gP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic3BhY2Uuc3RhdHVzICE9PSAnRFBFX1RPX1ZBTElEQVRFJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBuby1sb3dlcmNhc2UgbXMtNVwiIChjbGljayk9XCJvbkdldERwZURhdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snR2V0IGRhdGEgZnJvbSBBUEkgRFBFJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYmctdHJhbnNwYXJlbnQgbXMtNVwiICpuZ0lmPVwic3BhY2Uuc3RhdHVzID09PSAnRFBFX1RPX1ZBTElEQVRFJ1wiIChjbGljayk9XCJvbkRwZVZhbGlkYXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6YWxlcnQtY2lyY2xlLWNoZWNrXCIgc3R5bGU9XCJjb2xvcjogI2YxOWM4MDtcIiBkYXRhLXdpZHRoPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydEUEUgZGF0YSBmb3VuZC4gQ2xpY2sgdG8gdmFsaWRhdGUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPCEtLSBPbmUgcGlja2VyIGZvciBib3RoIHZpZXdlcnM6IHRoZSBkZWZhdWx0IGxpdmVzIG9uIHRoZSBzcGFjZSwgc28gTWF0dGVycG9ydFxuICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZXMgYW5kIDNEIG1vZGVscyBjb21wZXRlIGZvciB0aGUgc2FtZSBzaW5nbGUgc2xvdC4gLS0+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJ2aXNpdHMubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICB7eydEZWZhdWx0IHZpc2l0JyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZC1pbmxpbmUtYmxvY2sgbXMtMlwiIHN0eWxlPVwid2lkdGg6IGF1dG87XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGVmYXVsdENhcHR1cmVJRFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGVmYXVsdENhcHR1cmVDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2F2aW5nRGVmYXVsdENhcHR1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7J0ZpcnN0IGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQuY2FwdHVyZUlEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmlzaXRMYWJlbCh2aXNpdCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLXRleHQgZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snV2hhdCBhIHZpc2l0b3Igb3BlbnMgd2hlbiB0aGV5IGVudGVyIHRoaXMgbG9jYXRpb24uJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlciBkLWJsb2NrXCIgKm5nSWY9XCJkZWZhdWx0Q2FwdHVyZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkZWZhdWx0Q2FwdHVyZUVycm9yIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzR2VzID8gc3BhY2UuY2xhc3NHZXMgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU2hhcmVhYmxlIEd1ZXN0IExpbmsnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCIgKm5nSWY9XCJndWVzdExpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPVwibGlua0hyZWZcIiB0YXJnZXQ9XCJfYmxhbmtcIj57eydUcnkgdGhlIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImd1ZXN0TGlua1wiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDsgZGlzcGxheTogaW5saW5lO1wiIG5nYlRvb2x0aXA9XCJDb3BpZWQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6Y29udGVudC1jb3B5XCIgZGF0YS1pbmxpbmU9XCJmYWxzZVwiIGRhdGEtd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lO1wiPnt7J05vIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFndWVzdExpbmtcIj48c21hbGw+KHt7J0dlbmVyYXRlIGxpbmsgZnJvbSBhIFZJU0lUT1IgbWlzc2lvbid8dHJhbnNsYXRlfX0pPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImdldHRpbmdEYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImxvY2F0aW9uLWVkaXQtYnRuXCI+e3snRWRpdCcgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3shY2FuQXJjaGl2ZSA/ICgnQ29udGFjdCBTbWFydGVyUGxhbicgfCB0cmFuc2xhdGUpIDogKCdBcmNoaXZlIGxvY2F0aW9uIGFuZCByZWxhdGVkIGRhdGEnIHwgdHJhbnNsYXRlKX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BcmNoaXZlKClcIiBbZGlzYWJsZWRdPVwiIWNhbkFyY2hpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FyY2hpdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiICpuZ0lmPVwiaXNWYWxpZGF0aW5nRHBlXCI+XG4gICAgICAgICAgICA8aDY+e3snTW9zdCByZWxldmFudCByZXN1bHRzIGZvcicgfCB0cmFuc2xhdGV9fSA6XG4gICAgICAgICAgICAgICAgPGI+ZGlhZ25vc3RpY3MgZGUgcGVyZm9ybWFuY2Ugw6luZXJnw6l0aXF1ZSAoRFBFKSBkZXMgYsOidGltZW50cyB0ZXJ0aWFpcmVzPC9iPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPiM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQXBwbHkgdG8gbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBY3Rpdml0eSBzZWN0b3InIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRW5lcmd5IENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByZXN1bHQgb2YgcGFyc2VkTWV0YWRhdGE7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPnt7IGkgKyAxIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseVwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicmVzdWx0LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZShyZXN1bHQpXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5nZW9fYWRyZXNzZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5zZWN0ZXVyX2FjdGl2aXRlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfZXN0aW1hdGlvbl9nZXMgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uU2F2ZVJlc3VsdCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRHBlUmVzdWx0XCI+e3snU2F2ZSBzZWxlY3RlZCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FcmFzZSgpXCI+XG4gICAgICAgICAgICAgICAge3snTm8gbWF0Y2ggKGVyYXNlIGRhdGEpJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxuICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVG9nZ2xlIGJ1dHRvbiBmb3IgdGhlIGFkbWluIFwiQ29weSBQT0lzXCIgZm9ybSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNBZG1pbiAmJiBzcGFjZXMgJiYgc3BhY2VzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cInRvZ2dsZUNvcHlQb2lzRm9ybSgpXCI+XG4gICAgICAgICAgICB7eyAoc2hvd0NvcHlQb2lzRm9ybSA/ICdtYXR0ZXJwb3J0Q29weS5oaWRlRm9ybScgOiAnbWF0dGVycG9ydENvcHkuc2hvd0Zvcm0nKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWRtaW4gRm9ybSB0byBDb3B5IFBPSXMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzQWRtaW4gJiYgc3BhY2VzICYmIHNwYWNlcy5sZW5ndGggPiAwICYmIHNob3dDb3B5UG9pc0Zvcm1cIiBjbGFzcz1cIm10LTMgcC00IGJvcmRlciByb3VuZGVkIGJnLWxpZ2h0XCI+XG4gICAgICAgIDxoNj57eyAnbWF0dGVycG9ydENvcHkuZm9ybVRpdGxlJyB8IHRyYW5zbGF0ZSB9fTwvaDY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnbWF0dGVycG9ydENvcHkuc291cmNlU3BhY2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTb3VyY2VTcGFjZUlkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Tb3VyY2VTcGFjZUNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNlbGVjdFNwYWNlJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIHNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+e3tzcGFjZS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiICpuZ0lmPVwic291cmNlVmlzaXRzXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU291cmNlM2RNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zZWxlY3RWaXNpdCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzb3VyY2VWaXNpdHNcIiBbbmdWYWx1ZV09XCJ2aXNpdC5tb2RlbDNkXCI+e3t2aXNpdC5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS50YXJnZXRWaXNpdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnbWF0dGVycG9ydENvcHkuc2VsZWN0VmlzaXQnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQubW9kZWwzZFwiPnt7dmlzaXQubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkU291cmNlU3BhY2VJZCAmJiBzZWxlY3RlZFNvdXJjZTNkTW9kZWwgJiYgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHJvdW5kZWQgcC0zIG1iLTMgYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZCBtYi0yXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZ3LWJvbGQgc21hbGwgbWItMlwiPnt7ICdtYXR0ZXJwb3J0Q29weS5sYW5kbWFya0EnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrU291cmNlQVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblNvdXJjZUxhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrVGFyZ2V0QVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnRhcmdldFZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblRhcmdldExhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHNtYWxsIG1iLTJcIj57eyAnbWF0dGVycG9ydENvcHkubGFuZG1hcmtCJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFNvdXJjZTNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtTb3VyY2VCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uU291cmNlTGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtUYXJnZXRCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwdC0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCIgW2Rpc2FibGVkXT1cIiFjYW5Db3B5UG9pcyB8fCBpc0NvcHlpbmdQb2lzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db3B5UG9pcygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmNvcHlCdXR0b24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImV4cG9ydExhbmRtYXJrQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmV4cG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmltcG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltcG9ydExhbmRtYXJrQ29uZmlnU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvcHlpbmdQb2lzXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSB0ZXh0LXByaW1hcnlcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UG9pc1Jlc3VsdE1zZ1wiIGNsYXNzPVwibXQtMiB0ZXh0LXN1Y2Nlc3MgZnctYm9sZFwiPlxuICAgICAgICAgICAge3sgY29weVBvaXNSZXN1bHRNc2cgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UHJvZ3Jlc3NcIiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gc21hbGwgbWItMVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb3B5UHJvZ3Jlc3MucGhhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY29sbGVjdGluZydcIj57eyAnQ29sbGVjdGluZyBpbmZvcm1hdGlvbiBmcm9tIGJvdGggdmlzaXRzLi4uJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0aWNrZXRzJ1wiPnt7ICdDb3B5aW5nIHRpY2tldHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidlcXVpcG1lbnRzJ1wiPnt7ICdDb3B5aW5nIGVxdWlwbWVudHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidwb2lzJ1wiPnt7ICdDb3B5aW5nIHN0YW5kYWxvbmUgUE9JcycgfCB0cmFuc2xhdGUgfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ29iamVjdHMzZCdcIj57eyAnQ29weWluZyAzRCBvYmplY3RzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZmVhdHVyZXMnXCI+e3sgJ0NvcHlpbmcgZmVhdHVyZXMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtZWFzdXJlbWVudHMnXCI+e3sgJ0NvcHlpbmcgbWVhc3VyZW1lbnRzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZG9uZSdcIj57eyAnRG9uZSEnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29weVByb2dyZXNzLnBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBzdHlsZT1cImhlaWdodDogNnB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbY2xhc3MucHJvZ3Jlc3MtYmFyLXN0cmlwZWRdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucHJvZ3Jlc3MtYmFyLWFuaW1hdGVkXT1cImNvcHlQcm9ncmVzcy5waGFzZSA9PT0gJ2NvbGxlY3RpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLXdhcm5pbmddPVwiY29weVByb2dyZXNzLmVycm9yQ291bnQgPiAwXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZycgPyAxMDAgOiBjb3B5UHJvZ3Jlc3MucGVyY2VudFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5TG9nLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTIgcC0yIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkIHNtYWxsXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGNvcHlMb2dcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwiZW50cnkudHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXdhcm5pbmddPVwiZW50cnkudHlwZSA9PT0gJ2hlYWxlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG10LTJcIiAqbmdJZj1cImNvcHlMb2cubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ29weUxvZygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmRvd25sb2FkTG9nJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGxpYi1mb3JtLWxvY2F0aW9uICpuZ0lmPVwiaXNFZGl0aW5nXCIgW2xvY2F0aW9uXT1cInNwYWNlXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cbjwvZGl2PiJdfQ==
|