@smarterplan/ngx-smarterplan-locations 0.0.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/README.md +24 -0
- package/esm2020/lib/components/carousel/carousel.component.mjs +28 -0
- package/esm2020/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +154 -0
- package/esm2020/lib/components/form-location/form-location.component.mjs +215 -0
- package/esm2020/lib/components/images/images.component.mjs +91 -0
- package/esm2020/lib/components/locations/locations.component.mjs +138 -0
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +66 -0
- package/esm2020/lib/components/locations/map/map.component.mjs +91 -0
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +484 -0
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +314 -0
- package/esm2020/lib/components/plans/plans.component.mjs +211 -0
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +40 -0
- package/esm2020/lib/components/visits/visits.component.mjs +227 -0
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +592 -0
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +77 -0
- package/esm2020/lib/components/zones/zones.component.mjs +214 -0
- package/esm2020/lib/helper.service.mjs +2 -0
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -0
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +107 -0
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +14 -0
- package/esm2020/public-api.mjs +6 -0
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3126 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +2987 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/lib/components/carousel/carousel.component.d.ts +12 -0
- package/lib/components/chevron/chevron.component.d.ts +9 -0
- package/lib/components/detail-location/detail-location.component.d.ts +51 -0
- package/lib/components/form-location/form-location.component.d.ts +40 -0
- package/lib/components/images/images.component.d.ts +28 -0
- package/lib/components/locations/locations.component.d.ts +49 -0
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -0
- package/lib/components/locations/map/map.component.d.ts +22 -0
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -0
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +54 -0
- package/lib/components/plans/plans.component.d.ts +59 -0
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -0
- package/lib/components/visits/visits.component.d.ts +51 -0
- package/lib/components/zones/add-zone/add-zone.component.d.ts +154 -0
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -0
- package/lib/components/zones/zones.component.d.ts +66 -0
- package/lib/helper.service.d.ts +6 -0
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-locations.module.d.ts +31 -0
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -0
- package/package.json +39 -0
- package/public-api.d.ts +2 -0
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { Component, HostListener, ViewChild } from '@angular/core';
|
|
2
|
+
import { getDocument } from "pdfjs-dist";
|
|
3
|
+
import { sortAlphabeticallyOnName, downloadFileAsObject } from 'ngx-smarterplan-core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "ngx-smarterplan-core";
|
|
6
|
+
import * as i2 from "@angular/router";
|
|
7
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i4 from "@ngx-translate/core";
|
|
9
|
+
import * as i5 from "../../tab-navigation/tab-navigation.component";
|
|
10
|
+
import * as i6 from "../../zones/add-zone/add-zone.component";
|
|
11
|
+
import * as i7 from "@angular/common";
|
|
12
|
+
export class EditPlanComponent {
|
|
13
|
+
constructor(planService, route, router, modalService, zoneService, visitService, spaceService, translate) {
|
|
14
|
+
this.planService = planService;
|
|
15
|
+
this.route = route;
|
|
16
|
+
this.router = router;
|
|
17
|
+
this.modalService = modalService;
|
|
18
|
+
this.zoneService = zoneService;
|
|
19
|
+
this.visitService = visitService;
|
|
20
|
+
this.spaceService = spaceService;
|
|
21
|
+
this.translate = translate;
|
|
22
|
+
this.loading = false;
|
|
23
|
+
this.isNewZone = false;
|
|
24
|
+
/**
|
|
25
|
+
* Options for svgEditor
|
|
26
|
+
*/
|
|
27
|
+
this.config = {
|
|
28
|
+
noStorageOnLoad: true,
|
|
29
|
+
forceStorage: true,
|
|
30
|
+
// imgPath: "/assets/editor/images/",
|
|
31
|
+
// extPath: "/assets/editor/extensions/",
|
|
32
|
+
// langPath: "/assets/editor/locale/",
|
|
33
|
+
// canvgPath: "/assets/editor/canvg/",
|
|
34
|
+
// jspdfPath: "/assets/editor/jspdf/",
|
|
35
|
+
// jGraduatePath: "/assets/editor/jgraduate/images/",
|
|
36
|
+
// extIconsPath: "/assets/editor/extensions/",
|
|
37
|
+
// stylesheets: [
|
|
38
|
+
// "/assets/editor/jgraduate/css/jGraduate.css",
|
|
39
|
+
// "/assets/editor/spinbtn/jQuery.SpinButton.css",
|
|
40
|
+
// "/assets/editor/jgraduate/css/jPicker.css",
|
|
41
|
+
// "/assets/editor/svg-editor.css",
|
|
42
|
+
// ],
|
|
43
|
+
dimensions: [10000, 10000],
|
|
44
|
+
showlayers: true,
|
|
45
|
+
noDefaultExtensions: true,
|
|
46
|
+
basePath: "/assets/editor/",
|
|
47
|
+
customExportImage: true,
|
|
48
|
+
extensions: [
|
|
49
|
+
"ext-connector",
|
|
50
|
+
// "ext-eyedropper",
|
|
51
|
+
// "ext-grid",
|
|
52
|
+
// "ext-markers",
|
|
53
|
+
// "ext-overview_window",
|
|
54
|
+
// "ext-spi-library",
|
|
55
|
+
// "ext-spi-icon",
|
|
56
|
+
"ext-sp-zone",
|
|
57
|
+
// "ext-arrows",
|
|
58
|
+
// "ext-sp-css",
|
|
59
|
+
// "ext-placemark",
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
this.menuItems = [];
|
|
63
|
+
this.chosenPlan = this.planService.getChosenPlan();
|
|
64
|
+
}
|
|
65
|
+
async ngOnInit() {
|
|
66
|
+
this.editorUrl = "/assets/editor/main.html";
|
|
67
|
+
this.spaceID = this.route.snapshot.queryParams.spaceID;
|
|
68
|
+
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
69
|
+
this.setupMenuItems();
|
|
70
|
+
if (this.spaceID && !this.planService.getChosenPlan()) {
|
|
71
|
+
this.router.navigate([
|
|
72
|
+
"/dashboard/localisation",
|
|
73
|
+
this.spaceID,
|
|
74
|
+
"plans",
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
else if (!this.spaceID && !this.planService.getChosenPlan()) {
|
|
78
|
+
this.router.navigate(["/dashboard/localisation"]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
setupMenuItems() {
|
|
82
|
+
this.menuItems = [
|
|
83
|
+
{ label: "Locations", url: "/localisation" },
|
|
84
|
+
{
|
|
85
|
+
label: this.currentSpace.name,
|
|
86
|
+
url: `/localisation/${this.spaceID}`,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
label: "Plans",
|
|
90
|
+
url: `/localisation/${this.currentSpace.id}/plans`,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
label: "Edit",
|
|
94
|
+
url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
async switchAction(event) {
|
|
99
|
+
if (event.origin === window.location.origin) {
|
|
100
|
+
switch (event.data.message) {
|
|
101
|
+
case "save":
|
|
102
|
+
this.onSave(event.data.redirect);
|
|
103
|
+
break;
|
|
104
|
+
case "close":
|
|
105
|
+
this.onCancel();
|
|
106
|
+
break;
|
|
107
|
+
case "new-zone":
|
|
108
|
+
const modalReference = this.modalService.open(this.loadingModal);
|
|
109
|
+
const svg = unescape(encodeURIComponent(this.svgEditor.svgCanvas.getSvgString()));
|
|
110
|
+
const base64 = `data:image/svg+xml;base64,${window.btoa(svg)}`;
|
|
111
|
+
const currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
112
|
+
this.images360 = await this.visitService.loadImagesForSpace(currentSpace);
|
|
113
|
+
this.editedPlan = { ...this.chosenPlan };
|
|
114
|
+
this.editedPlan.filepath = base64;
|
|
115
|
+
this.newZoneData = event.data.zoneData;
|
|
116
|
+
if (this.newZoneData.elements.length === 0) {
|
|
117
|
+
modalReference.close();
|
|
118
|
+
alert(this.translate.instant("edition.no-zone"));
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
this.zones = await this.zoneService.getZonesBySpace(this.spaceID);
|
|
122
|
+
this.zones = sortAlphabeticallyOnName(this.zones);
|
|
123
|
+
this.editedZone = this.zones.find((z) => z.name === this.newZoneData.name);
|
|
124
|
+
this.resetNavigations();
|
|
125
|
+
modalReference.close();
|
|
126
|
+
this.modalService.open(this.dialogZone);
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async resetNavigations() {
|
|
134
|
+
this.navigations = [];
|
|
135
|
+
const defaultZone = this.zones.find((zone) => !zone.parentID);
|
|
136
|
+
if (defaultZone.sweepIDs.length > 0) {
|
|
137
|
+
this.navigations = defaultZone.sweepIDs;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async onLoad(svgEditor) {
|
|
141
|
+
if (svgEditor.contentWindow.SvgEditor) {
|
|
142
|
+
this.svgEditorIframe = svgEditor;
|
|
143
|
+
this.svgEditor = new svgEditor.contentWindow.SvgEditor();
|
|
144
|
+
await this.svgEditor.init();
|
|
145
|
+
// await this.svgEditor.pref(key, val);
|
|
146
|
+
// await this.svgEditor.setConfig({ extentions: this.extensions });
|
|
147
|
+
await this.svgEditor.setConfig(this.config, {
|
|
148
|
+
allowInitialUserOverride: true,
|
|
149
|
+
});
|
|
150
|
+
if (this.chosenPlan && this.chosenPlan.extension === "svg") {
|
|
151
|
+
this.loadSvg();
|
|
152
|
+
}
|
|
153
|
+
if (this.chosenPlan && this.chosenPlan.extension === "pdf") {
|
|
154
|
+
this.loadPdf();
|
|
155
|
+
}
|
|
156
|
+
if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
159
|
+
}, 1000);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async onSave(redirect) {
|
|
164
|
+
const imgBlob = await new Blob([this.svgEditor.svgCanvas.getSvgString()], {
|
|
165
|
+
type: "image/svg+xml",
|
|
166
|
+
});
|
|
167
|
+
const [name] = this.chosenPlan.name.split(".");
|
|
168
|
+
const imgFile = new File([imgBlob], `${name}-edited.svg`, {
|
|
169
|
+
type: "image/svg+xml",
|
|
170
|
+
lastModified: Date.now(),
|
|
171
|
+
});
|
|
172
|
+
this.planService.setPlanFileCache(imgFile);
|
|
173
|
+
if (this.chosenPlan.isModified) {
|
|
174
|
+
this.modalService.open(this.dialog);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.router.navigate([
|
|
178
|
+
"/dashboard/localisation",
|
|
179
|
+
this.spaceID,
|
|
180
|
+
"plans",
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async updateSvg() {
|
|
185
|
+
const newUrl = await this.planService.updatePlanFile();
|
|
186
|
+
await this.planService.updatePlan({
|
|
187
|
+
id: this.chosenPlan.id,
|
|
188
|
+
annexe: newUrl,
|
|
189
|
+
});
|
|
190
|
+
this.planService.setPlanFileCache(null);
|
|
191
|
+
this.router.navigate([
|
|
192
|
+
"/dashboard/localisation",
|
|
193
|
+
this.spaceID,
|
|
194
|
+
"plans",
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
async newSvg() {
|
|
198
|
+
this.router.navigate([
|
|
199
|
+
"/dashboard/localisation",
|
|
200
|
+
this.spaceID,
|
|
201
|
+
"plans",
|
|
202
|
+
]);
|
|
203
|
+
}
|
|
204
|
+
async onCancel() {
|
|
205
|
+
this.router.navigate([
|
|
206
|
+
"/dashboard/localisation",
|
|
207
|
+
this.spaceID,
|
|
208
|
+
"plans",
|
|
209
|
+
]);
|
|
210
|
+
alert(this.translate.instant("edition.cancel"));
|
|
211
|
+
}
|
|
212
|
+
async loadSvg() {
|
|
213
|
+
const svgRequest = await downloadFileAsObject(this.chosenPlan.annexe);
|
|
214
|
+
if (svgRequest) {
|
|
215
|
+
const svgBlob = await svgRequest.Body;
|
|
216
|
+
const reader = new FileReader();
|
|
217
|
+
reader.onloadend = () => {
|
|
218
|
+
this.svgEditor.loadFromDataURI(reader.result);
|
|
219
|
+
};
|
|
220
|
+
reader.readAsDataURL(svgBlob);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async loadPdf() {
|
|
224
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
225
|
+
const canvas = document.querySelector("#canvas4pdf");
|
|
226
|
+
const context = canvas.getContext("2d");
|
|
227
|
+
const pdfjs = await import("pdfjs-dist/build/pdf");
|
|
228
|
+
const pdfjsWorker = await import("pdfjs-dist/build/pdf.worker.entry");
|
|
229
|
+
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
|
|
230
|
+
const pdf = await getDocument(this.chosenPlan.filepath).promise;
|
|
231
|
+
const page = await pdf.getPage(1);
|
|
232
|
+
const viewPortParameters = { scale: 1.5 };
|
|
233
|
+
const viewport = page.getViewport(viewPortParameters);
|
|
234
|
+
this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);
|
|
235
|
+
canvas.height = viewport.height;
|
|
236
|
+
canvas.width = viewport.width;
|
|
237
|
+
const renderContext = {
|
|
238
|
+
canvasContext: context,
|
|
239
|
+
viewport,
|
|
240
|
+
};
|
|
241
|
+
const renderTask = page.render(renderContext).promise;
|
|
242
|
+
renderTask.then(() => {
|
|
243
|
+
const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({
|
|
244
|
+
element: "image",
|
|
245
|
+
attr: {
|
|
246
|
+
x: 0,
|
|
247
|
+
y: 0,
|
|
248
|
+
width: viewport.width,
|
|
249
|
+
height: viewport.height,
|
|
250
|
+
id: this.svgEditor.svgCanvas.getNextId(),
|
|
251
|
+
style: "pointer-events:inherit",
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
this.svgEditor.svgCanvas.setHref(newImage, canvas.toDataURL("image/png"));
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async onLoadImg(img) {
|
|
258
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
259
|
+
const imgRequest = await downloadFileAsObject(this.chosenPlan.annexe);
|
|
260
|
+
if (imgRequest) {
|
|
261
|
+
const imgBlob = await imgRequest.Body;
|
|
262
|
+
const imgWidth = img.naturalWidth;
|
|
263
|
+
const imgHeight = img.naturalHeight;
|
|
264
|
+
// await this.svgEditor.setConfig({
|
|
265
|
+
// dimensions: [imgWidth, imgHeight],
|
|
266
|
+
// });
|
|
267
|
+
this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);
|
|
268
|
+
const reader = new FileReader();
|
|
269
|
+
reader.onloadend = () => {
|
|
270
|
+
const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({
|
|
271
|
+
element: "image",
|
|
272
|
+
attr: {
|
|
273
|
+
x: 0,
|
|
274
|
+
y: 0,
|
|
275
|
+
width: imgWidth,
|
|
276
|
+
height: imgHeight,
|
|
277
|
+
id: this.svgEditor.svgCanvas.getNextId(),
|
|
278
|
+
style: "pointer-events:inherit",
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
this.svgEditor.svgCanvas.setHref(newImage, reader.result);
|
|
282
|
+
};
|
|
283
|
+
reader.readAsDataURL(imgBlob);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
onNewZone(event) {
|
|
287
|
+
this.isNewZone = false;
|
|
288
|
+
if (event) {
|
|
289
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "rename-layer", name: event }, "*");
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "cancel-layer" }, "*");
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
EditPlanComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EditPlanComponent, deps: [{ token: i1.PlanService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.NgbModal }, { token: i1.ZoneService }, { token: i1.VisitService }, { token: i1.SpaceService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
297
|
+
EditPlanComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: EditPlanComponent, selector: "lib-edit-plan", host: { listeners: { "window:message": "switchAction($event)" } }, viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "dialogZone", first: true, predicate: ["dialogZone"], descendants: true }, { propertyName: "loadingModal", first: true, predicate: ["preparing"], descendants: true }], ngImport: i0, template: "<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\n style=\"height: 100%;width:100%;min-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\n<!-- chosenPlan && -->\n<!-- ./../../../../../../assets/svgeditor/index.html -->\n\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\n\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\n\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\n [newZoneData]=\"newZoneData\"></lib-add-zone>\n\n<ng-template #dialog let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'save plan edited' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #dialogZone let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'Select zone' | translate}}\n <div ngbDropdown class=\"d-inline-block me-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{editedZone ?\n editedZone.name: ('New zone' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem (click)=\"editedZone = null\" translate=\"New zone\">\n </button>\n <button ngbDropdownItem *ngFor=\"let zone of zones\" (click)=\"editedZone = zone\">{{zone.name }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\"\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #preparing let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n </div>\n\n</ng-template>", styles: ["app-add-zone{position:absolute;top:0;left:0;background-color:#fff;width:100%;height:100%;padding:30px}\n"], components: [{ type: i5.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i6.AddZoneComponent, selector: "lib-add-zone", inputs: ["zoneEdit", "spaceID", "images360", "navigationIDs", "zones", "newZoneData", "chosenPlan", "isMuseumVisit", "defaultZone"], outputs: ["updatedZone"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i3.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "safeUrl": i1.SafeUrlPipe, "translate": i4.TranslatePipe } });
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EditPlanComponent, decorators: [{
|
|
299
|
+
type: Component,
|
|
300
|
+
args: [{ selector: 'lib-edit-plan', template: "<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\n style=\"height: 100%;width:100%;min-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\n<!-- chosenPlan && -->\n<!-- ./../../../../../../assets/svgeditor/index.html -->\n\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\n\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\n\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\n [newZoneData]=\"newZoneData\"></lib-add-zone>\n\n<ng-template #dialog let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'save plan edited' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #dialogZone let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'Select zone' | translate}}\n <div ngbDropdown class=\"d-inline-block me-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{editedZone ?\n editedZone.name: ('New zone' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem (click)=\"editedZone = null\" translate=\"New zone\">\n </button>\n <button ngbDropdownItem *ngFor=\"let zone of zones\" (click)=\"editedZone = zone\">{{zone.name }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\"\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #preparing let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n </div>\n\n</ng-template>", styles: ["app-add-zone{position:absolute;top:0;left:0;background-color:#fff;width:100%;height:100%;padding:30px}\n"] }]
|
|
301
|
+
}], ctorParameters: function () { return [{ type: i1.PlanService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.NgbModal }, { type: i1.ZoneService }, { type: i1.VisitService }, { type: i1.SpaceService }, { type: i4.TranslateService }]; }, propDecorators: { dialog: [{
|
|
302
|
+
type: ViewChild,
|
|
303
|
+
args: ["dialog"]
|
|
304
|
+
}], dialogZone: [{
|
|
305
|
+
type: ViewChild,
|
|
306
|
+
args: ["dialogZone"]
|
|
307
|
+
}], loadingModal: [{
|
|
308
|
+
type: ViewChild,
|
|
309
|
+
args: ["preparing"]
|
|
310
|
+
}], switchAction: [{
|
|
311
|
+
type: HostListener,
|
|
312
|
+
args: ["window:message", ["$event"]]
|
|
313
|
+
}] } });
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wbGFuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5zL2VkaXQtcGxhbi9lZGl0LXBsYW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvZWRpdC1wbGFuL2VkaXQtcGxhbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxPQUFPLEVBQXFGLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQU96SyxNQUFNLE9BQU8saUJBQWlCO0lBOEUxQixZQUNZLFdBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxZQUFzQixFQUN0QixXQUF3QixFQUN4QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixTQUEyQjtRQVAzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUF4RXZDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFVekIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQVczQjs7V0FFRztR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QyxTQUFTLENBQUMsU0FBUyxFQUFFO3dCQUN4QyxLQUFLLEVBQUUsd0JBQXdCO3FCQUNsQztpQkFDSixDQUNKLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUFDO1lBQ0YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBSztRQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUMxQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUN2QyxHQUFHLENBQ04sQ0FBQztTQUNMO2FBQU07WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQzFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUMxQixHQUFHLENBQ04sQ0FBQztTQUNMO0lBQ0wsQ0FBQzs7OEdBellRLGlCQUFpQjtrR0FBakIsaUJBQWlCLGlaQ2I5Qix1dkhBdUZjOzJGRDFFRCxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsZUFBZTswUkFNRixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBRU0sVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUVDLFlBQVk7c0JBQW5DLFNBQVM7dUJBQUMsV0FBVztnQkF3SGhCLFlBQVk7c0JBRGpCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBnZXREb2N1bWVudCB9IGZyb20gXCJwZGZqcy1kaXN0XCI7XG5pbXBvcnQgeyBQREZEb2N1bWVudFByb3h5IH0gZnJvbSBcIm5nMi1wZGYtdmlld2VyXCI7XG5pbXBvcnQgeyBab25lLCBQbGFuLCBTcGFjZSwgTWVudUl0ZW0sIFBsYW5TZXJ2aWNlLCBab25lU2VydmljZSwgVmlzaXRTZXJ2aWNlLCBTcGFjZVNlcnZpY2UsIHNvcnRBbHBoYWJldGljYWxseU9uTmFtZSwgZG93bmxvYWRGaWxlQXNPYmplY3QgfSBmcm9tICduZ3gtc21hcnRlcnBsYW4tY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1lZGl0LXBsYW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdC1wbGFuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZWRpdC1wbGFuLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdFBsYW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQFZpZXdDaGlsZChcImRpYWxvZ1wiKSBkaWFsb2chOiBhbnk7XG5cbiAgICBAVmlld0NoaWxkKFwiZGlhbG9nWm9uZVwiKSBkaWFsb2dab25lITogYW55O1xuXG4gICAgQFZpZXdDaGlsZChcInByZXBhcmluZ1wiKSBsb2FkaW5nTW9kYWw6IGFueTtcblxuICAgIHNwYWNlSUQ6IHN0cmluZztcblxuICAgIGNob3NlblBsYW46IFBsYW47XG5cbiAgICBlZGl0ZWRQbGFuOiBQbGFuO1xuXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgc3ZnRWRpdG9yO1xuXG4gICAgc3ZnRWRpdG9ySWZyYW1lO1xuXG4gICAgbmF2aWdhdGlvbnM6IHN0cmluZ1tdO1xuXG4gICAgem9uZXM6IFpvbmVbXTtcblxuICAgIGlzTmV3Wm9uZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgbmV3Wm9uZURhdGE7XG5cbiAgICBlZGl0b3JVcmw7XG5cbiAgICBlZGl0ZWRab25lOiBab25lO1xuXG4gICAgaW1hZ2VzMzYwO1xuXG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25zIGZvciBzdmdFZGl0b3JcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbmZpZzogYW55ID0ge1xuICAgICAgICBub1N0b3JhZ2VPbkxvYWQ6IHRydWUsXG4gICAgICAgIGZvcmNlU3RvcmFnZTogdHJ1ZSxcbiAgICAgICAgLy8gaW1nUGF0aDogXCIvYXNzZXRzL2VkaXRvci9pbWFnZXMvXCIsXG4gICAgICAgIC8vIGV4dFBhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvZXh0ZW5zaW9ucy9cIixcbiAgICAgICAgLy8gbGFuZ1BhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvbG9jYWxlL1wiLFxuICAgICAgICAvLyBjYW52Z1BhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvY2FudmcvXCIsXG4gICAgICAgIC8vIGpzcGRmUGF0aDogXCIvYXNzZXRzL2VkaXRvci9qc3BkZi9cIixcbiAgICAgICAgLy8gakdyYWR1YXRlUGF0aDogXCIvYXNzZXRzL2VkaXRvci9qZ3JhZHVhdGUvaW1hZ2VzL1wiLFxuICAgICAgICAvLyBleHRJY29uc1BhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvZXh0ZW5zaW9ucy9cIixcbiAgICAgICAgLy8gc3R5bGVzaGVldHM6IFtcbiAgICAgICAgLy8gICAgIFwiL2Fzc2V0cy9lZGl0b3IvamdyYWR1YXRlL2Nzcy9qR3JhZHVhdGUuY3NzXCIsXG4gICAgICAgIC8vICAgICBcIi9hc3NldHMvZWRpdG9yL3NwaW5idG4valF1ZXJ5LlNwaW5CdXR0b24uY3NzXCIsXG4gICAgICAgIC8vICAgICBcIi9hc3NldHMvZWRpdG9yL2pncmFkdWF0ZS9jc3MvalBpY2tlci5jc3NcIixcbiAgICAgICAgLy8gICAgIFwiL2Fzc2V0cy9lZGl0b3Ivc3ZnLWVkaXRvci5jc3NcIixcbiAgICAgICAgLy8gXSxcbiAgICAgICAgZGltZW5zaW9uczogWzEwMDAwLCAxMDAwMF0sXG4gICAgICAgIHNob3dsYXllcnM6IHRydWUsXG4gICAgICAgIG5vRGVmYXVsdEV4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgIGJhc2VQYXRoOiBcIi9hc3NldHMvZWRpdG9yL1wiLFxuICAgICAgICBjdXN0b21FeHBvcnRJbWFnZTogdHJ1ZSxcbiAgICAgICAgZXh0ZW5zaW9uczogW1xuICAgICAgICAgICAgXCJleHQtY29ubmVjdG9yXCIsXG4gICAgICAgICAgICAvLyBcImV4dC1leWVkcm9wcGVyXCIsXG4gICAgICAgICAgICAvLyBcImV4dC1ncmlkXCIsXG4gICAgICAgICAgICAvLyBcImV4dC1tYXJrZXJzXCIsXG4gICAgICAgICAgICAvLyBcImV4dC1vdmVydmlld193aW5kb3dcIixcbiAgICAgICAgICAgIC8vIFwiZXh0LXNwaS1saWJyYXJ5XCIsXG4gICAgICAgICAgICAvLyBcImV4dC1zcGktaWNvblwiLFxuICAgICAgICAgICAgXCJleHQtc3Atem9uZVwiLFxuICAgICAgICAgICAgLy8gXCJleHQtYXJyb3dzXCIsXG4gICAgICAgICAgICAvLyBcImV4dC1zcC1jc3NcIixcbiAgICAgICAgICAgIC8vIFwiZXh0LXBsYWNlbWFya1wiLFxuICAgICAgICBdLFxuICAgIH07XG5cbiAgICBjdXJyZW50U3BhY2U6IFNwYWNlO1xuXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBwbGFuU2VydmljZTogUGxhblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZpc2l0U2VydmljZTogVmlzaXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5jaG9zZW5QbGFuID0gdGhpcy5wbGFuU2VydmljZS5nZXRDaG9zZW5QbGFuKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yVXJsID0gXCIvYXNzZXRzL2VkaXRvci9tYWluLmh0bWxcIjtcbiAgICAgICAgdGhpcy5zcGFjZUlEID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5zcGFjZUlEO1xuICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuc3BhY2VJRCk7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VJRCAmJiAhdGhpcy5wbGFuU2VydmljZS5nZXRDaG9zZW5QbGFuKCkpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcbiAgICAgICAgICAgICAgICBcIi9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxuICAgICAgICAgICAgICAgIFwicGxhbnNcIixcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnNwYWNlSUQgJiYgIXRoaXMucGxhblNlcnZpY2UuZ2V0Q2hvc2VuUGxhbigpKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cE1lbnVJdGVtcygpIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbXG4gICAgICAgICAgICB7IGxhYmVsOiBcIkxvY2F0aW9uc1wiLCB1cmw6IFwiL2xvY2FsaXNhdGlvblwiIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuY3VycmVudFNwYWNlLm5hbWUsXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuc3BhY2VJRH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJQbGFuc1wiLFxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLmN1cnJlbnRTcGFjZS5pZH0vcGxhbnNgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJFZGl0XCIsXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuY3VycmVudFNwYWNlLmlkfS9wbGFuLWVkaXQ/c3BhY2VJRD0ke3RoaXMuY3VycmVudFNwYWNlLmlkfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6bWVzc2FnZVwiLCBbXCIkZXZlbnRcIl0pXG4gICAgYXN5bmMgc3dpdGNoQWN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZGF0YS5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNhdmUoZXZlbnQuZGF0YS5yZWRpcmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjbG9zZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJuZXctem9uZVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RhbFJlZmVyZW5jZSA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ZnID0gdW5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmdldFN2Z1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke3dpbmRvdy5idG9hKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnLFxuICAgICAgICAgICAgICAgICAgICApfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzMzYwID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UubG9hZEltYWdlc0ZvclNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNwYWNlLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGVkUGxhbiA9IHsgLi4udGhpcy5jaG9zZW5QbGFuIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGVkUGxhbi5maWxlcGF0aCA9IGJhc2U2NDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld1pvbmVEYXRhID0gZXZlbnQuZGF0YS56b25lRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3Wm9uZURhdGEuZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbFJlZmVyZW5jZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24ubm8tem9uZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmVzID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lc0J5U3BhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZXMgPSBzb3J0QWxwaGFiZXRpY2FsbHlPbk5hbWUodGhpcy56b25lcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGVkWm9uZSA9IHRoaXMuem9uZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICh6KSA9PiB6Lm5hbWUgPT09IHRoaXMubmV3Wm9uZURhdGEubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsUmVmZXJlbmNlLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5kaWFsb2dab25lKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzZXROYXZpZ2F0aW9ucygpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBkZWZhdWx0Wm9uZSA9IHRoaXMuem9uZXMuZmluZCgoem9uZSkgPT4gIXpvbmUucGFyZW50SUQpO1xuICAgICAgICBpZiAoZGVmYXVsdFpvbmUuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9ucyA9IGRlZmF1bHRab25lLnN3ZWVwSURzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25Mb2FkKHN2Z0VkaXRvcikge1xuICAgICAgICBpZiAoc3ZnRWRpdG9yLmNvbnRlbnRXaW5kb3cuU3ZnRWRpdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnN2Z0VkaXRvcklmcmFtZSA9IHN2Z0VkaXRvcjtcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9yID0gbmV3IHN2Z0VkaXRvci5jb250ZW50V2luZG93LlN2Z0VkaXRvcigpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN2Z0VkaXRvci5pbml0KCk7XG4gICAgICAgICAgICAvLyBhd2FpdCB0aGlzLnN2Z0VkaXRvci5wcmVmKGtleSwgdmFsKTtcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMuc3ZnRWRpdG9yLnNldENvbmZpZyh7IGV4dGVudGlvbnM6IHRoaXMuZXh0ZW5zaW9ucyB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3ZnRWRpdG9yLnNldENvbmZpZyh0aGlzLmNvbmZpZywge1xuICAgICAgICAgICAgICAgIGFsbG93SW5pdGlhbFVzZXJPdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jaG9zZW5QbGFuICYmIHRoaXMuY2hvc2VuUGxhbi5leHRlbnNpb24gPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRTdmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNob3NlblBsYW4gJiYgdGhpcy5jaG9zZW5QbGFuLmV4dGVuc2lvbiA9PT0gXCJwZGZcIikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFBkZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmNob3NlblBsYW4uY2FsaWJyYXRpb24gfHwgIXRoaXMuY2hvc2VuUGxhbi5pc01vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9ySWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGFjdGlvbjogXCJkaXNhYmxlLXpvbmVcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIqXCIsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblNhdmUocmVkaXJlY3Q6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgaW1nQmxvYiA9IGF3YWl0IG5ldyBCbG9iKFxuICAgICAgICAgICAgW3RoaXMuc3ZnRWRpdG9yLnN2Z0NhbnZhcy5nZXRTdmdTdHJpbmcoKV0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9zdmcreG1sXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IFtuYW1lXSA9IHRoaXMuY2hvc2VuUGxhbi5uYW1lLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICBjb25zdCBpbWdGaWxlOiBGaWxlID0gbmV3IEZpbGUoW2ltZ0Jsb2JdLCBgJHtuYW1lfS1lZGl0ZWQuc3ZnYCwge1xuICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9zdmcreG1sXCIsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBsYW5TZXJ2aWNlLnNldFBsYW5GaWxlQ2FjaGUoaW1nRmlsZSk7XG4gICAgICAgIGlmICh0aGlzLmNob3NlblBsYW4uaXNNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmRpYWxvZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXG4gICAgICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VJRCxcbiAgICAgICAgICAgICAgICBcInBsYW5zXCIsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZVN2ZygpIHtcbiAgICAgICAgY29uc3QgbmV3VXJsID0gYXdhaXQgdGhpcy5wbGFuU2VydmljZS51cGRhdGVQbGFuRmlsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsYW5TZXJ2aWNlLnVwZGF0ZVBsYW4oe1xuICAgICAgICAgICAgaWQ6IHRoaXMuY2hvc2VuUGxhbi5pZCxcbiAgICAgICAgICAgIGFubmV4ZTogbmV3VXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wbGFuU2VydmljZS5zZXRQbGFuRmlsZUNhY2hlKG51bGwpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXG4gICAgICAgICAgICBcIi9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsXG4gICAgICAgICAgICB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICBcInBsYW5zXCIsXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGFzeW5jIG5ld1N2ZygpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xuICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxuICAgICAgICAgICAgXCJwbGFuc1wiLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xuICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxuICAgICAgICAgICAgXCJwbGFuc1wiLFxuICAgICAgICBdKTtcbiAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24uY2FuY2VsXCIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkU3ZnKCkge1xuICAgICAgICBjb25zdCBzdmdSZXF1ZXN0OiBhbnkgPSBhd2FpdCBkb3dubG9hZEZpbGVBc09iamVjdChcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuUGxhbi5hbm5leGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdmdSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjb25zdCBzdmdCbG9iID0gYXdhaXQgc3ZnUmVxdWVzdC5Cb2R5O1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3IubG9hZEZyb21EYXRhVVJJKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHN2Z0Jsb2IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZFBkZigpIHtcbiAgICAgICAgdGhpcy5zdmdFZGl0b3JJZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgIHsgYWN0aW9uOiBcImRpc2FibGUtem9uZVwiIH0sXG4gICAgICAgICAgICBcIipcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgIFwiI2NhbnZhczRwZGZcIixcbiAgICAgICAgKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gICAgICAgIGNvbnN0IHBkZmpzID0gYXdhaXQgaW1wb3J0KFwicGRmanMtZGlzdC9idWlsZC9wZGZcIik7XG4gICAgICAgIGNvbnN0IHBkZmpzV29ya2VyID0gYXdhaXQgaW1wb3J0KFwicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyLmVudHJ5XCIpO1xuXG4gICAgICAgIHBkZmpzLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gcGRmanNXb3JrZXI7XG5cbiAgICAgICAgY29uc3QgcGRmOiBQREZEb2N1bWVudFByb3h5ID0gYXdhaXQgZ2V0RG9jdW1lbnQoXG4gICAgICAgICAgICB0aGlzLmNob3NlblBsYW4uZmlsZXBhdGgsXG4gICAgICAgICkucHJvbWlzZTtcbiAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBkZi5nZXRQYWdlKDEpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdQb3J0UGFyYW1ldGVycyA9IHsgc2NhbGU6IDEuNSB9O1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQodmlld1BvcnRQYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLnNldFJlc29sdXRpb24odmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7XG5cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgY2FudmFzLndpZHRoID0gdmlld3BvcnQud2lkdGg7XG4gICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjb250ZXh0LFxuICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KS5wcm9taXNlO1xuICAgICAgICByZW5kZXJUYXNrLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuYWRkU1ZHRWxlbWVudEZyb21Kc29uKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBcImltYWdlXCIsXG4gICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmdldE5leHRJZCgpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogXCJwb2ludGVyLWV2ZW50czppbmhlcml0XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLnNldEhyZWYoXG4gICAgICAgICAgICAgICAgbmV3SW1hZ2UsXG4gICAgICAgICAgICAgICAgY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIG9uTG9hZEltZyhpbWc6IGFueSkge1xuICAgICAgICB0aGlzLnN2Z0VkaXRvcklmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgeyBhY3Rpb246IFwiZGlzYWJsZS16b25lXCIgfSxcbiAgICAgICAgICAgIFwiKlwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbWdSZXF1ZXN0OiBhbnkgPSBhd2FpdCBkb3dubG9hZEZpbGVBc09iamVjdChcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuUGxhbi5hbm5leGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbWdSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjb25zdCBpbWdCbG9iID0gYXdhaXQgaW1nUmVxdWVzdC5Cb2R5O1xuICAgICAgICAgICAgY29uc3QgaW1nV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaW1nSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgICAgICAvLyBhd2FpdCB0aGlzLnN2Z0VkaXRvci5zZXRDb25maWcoe1xuICAgICAgICAgICAgLy8gICAgIGRpbWVuc2lvbnM6IFtpbWdXaWR0aCwgaW1nSGVpZ2h0XSxcbiAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLnNldFJlc29sdXRpb24oaW1nV2lkdGgsIGltZ0hlaWdodCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmFkZFNWR0VsZW1lbnRGcm9tSnNvbihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogXCJpbWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaW1nV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWdIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc3ZnRWRpdG9yLnN2Z0NhbnZhcy5nZXROZXh0SWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogXCJwb2ludGVyLWV2ZW50czppbmhlcml0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLnNldEhyZWYobmV3SW1hZ2UsIHJlYWRlci5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltZ0Jsb2IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25OZXdab25lKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXNOZXdab25lID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3JJZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogXCJyZW5hbWUtbGF5ZXJcIiwgbmFtZTogZXZlbnQgfSxcbiAgICAgICAgICAgICAgICBcIipcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN2Z0VkaXRvcklmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHsgYWN0aW9uOiBcImNhbmNlbC1sYXllclwiIH0sXG4gICAgICAgICAgICAgICAgXCIqXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cbiAgICAgICAgICAgIDxsaWItdGFiLW5hdmlnYXRpb24gW21lbnVJdGVtc109J21lbnVJdGVtcyc+PC9saWItdGFiLW5hdmlnYXRpb24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48aWZyYW1lICpuZ0lmPVwiZWRpdG9yVXJsXCIgI3N2Z0VkaXRvciBbc3JjXT1cImVkaXRvclVybCB8IHNhZmVVcmxcIiBmcmFtZWJvcmRlcj1cIjBcIlxuICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO3dpZHRoOjEwMCU7bWluLWhlaWdodDo3NTBweFwiIChsb2FkKT1cIm9uTG9hZChzdmdFZGl0b3IpXCI+PC9pZnJhbWU+XG48IS0tIGNob3NlblBsYW4gJiYgLS0+XG48IS0tIC4vLi4vLi4vLi4vLi4vLi4vLi4vYXNzZXRzL3N2Z2VkaXRvci9pbmRleC5odG1sIC0tPlxuXG48aW1nICNpbWdQbmcgKm5nSWY9XCJjaG9zZW5QbGFuICYmIGNob3NlblBsYW4uZXh0ZW5zaW9uICE9PSAnc3ZnJyAmJiBzdmdFZGl0b3JcIiBbc3JjXT1cImNob3NlblBsYW4uZmlsZXBhdGhcIlxuICAgIChsb2FkKT1cIm9uTG9hZEltZyhpbWdQbmcpXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuXG48Y2FudmFzIGlkPVwiY2FudmFzNHBkZlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2NhbnZhcz5cblxuPGxpYi1hZGQtem9uZSAqbmdJZj1cImlzTmV3Wm9uZVwiIFtpbWFnZXMzNjBdPVwiaW1hZ2VzMzYwXCIgW3NwYWNlSURdPVwic3BhY2VJRFwiIFtuYXZpZ2F0aW9uSURzXT1cIm5hdmlnYXRpb25zXCJcbiAgICBbem9uZUVkaXRdPVwiZWRpdGVkWm9uZVwiIFt6b25lc109XCJ6b25lc1wiICh1cGRhdGVkWm9uZSk9XCJvbk5ld1pvbmUoJGV2ZW50KVwiIFtjaG9zZW5QbGFuXT1cImVkaXRlZFBsYW5cIlxuICAgIFtuZXdab25lRGF0YV09XCJuZXdab25lRGF0YVwiPjwvbGliLWFkZC16b25lPlxuXG48bmctdGVtcGxhdGUgI2RpYWxvZyBsZXQtbW9kYWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3snU3VibWl0JyB8IHRyYW5zbGF0ZX19PC9oND5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICB7eydzYXZlIHBsYW4gZWRpdGVkJyB8IHRyYW5zbGF0ZX19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kYXJrXCIgKGNsaWNrKT1cIm5ld1N2ZygpO21vZGFsLmNsb3NlKCdDbG9zZSBjbGljaycpXCI+e3snWWVzJyB8XG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kYXJrXCIgKGNsaWNrKT1cInVwZGF0ZVN2ZygpO21vZGFsLmNsb3NlKCdDbG9zZSBjbGljaycpXCI+e3snTm8nIHxcbiAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGlhbG9nWm9uZSBsZXQtbW9kYWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3snU3VibWl0JyB8IHRyYW5zbGF0ZX19PC9oND5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICB7eydTZWxlY3Qgem9uZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbWUtM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCIgbmdiRHJvcGRvd25Ub2dnbGU+e3tlZGl0ZWRab25lID9cbiAgICAgICAgICAgICAgICBlZGl0ZWRab25lLm5hbWU6ICgnTmV3IHpvbmUnIHwgdHJhbnNsYXRlKSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25CYXNpYzFcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwiZWRpdGVkWm9uZSA9IG51bGxcIiB0cmFuc2xhdGU9XCJOZXcgem9uZVwiPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzXCIgKGNsaWNrKT1cImVkaXRlZFpvbmUgPSB6b25lXCI+e3t6b25lLm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhcmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlzTmV3Wm9uZSA9IHRydWU7bW9kYWwuY2xvc2UoJ0Nsb3NlIGNsaWNrJylcIj57eydWYWxpZGF0ZScgfFxuICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFya1wiIChjbGljayk9XCJtb2RhbC5jbG9zZSgnQ2xvc2UgY2xpY2snKVwiPnt7J0NhbmNlbCcgfFxuICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcmVwYXJpbmcgbGV0LW1vZGFsPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57eydQcm9jZXNzaW5nJyB8IHRyYW5zbGF0ZX19PC9oND5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+Il19
|